实验八协议分析器程序的设计和实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验八协议分析器程序的设计和实现
1.实验目的:
(1)掌握对网络上传输数据包的捕获方法。
(2)解析Ethernet网数据帧头部的全部信息。
(3)解析IP、ICMP数据包
(4) 解析传输层和应用层相关协议的头部信息
(5)设置过滤规则,能过滤相应协议的数据包。
(6)要求有良好的编程规范与注释信息,要求有详细的说明文档,包括程序的设计思想、活动图、关键问题以及解决方法。
2实验环境:
(1)VC6.0
(2)局域网能连接Internet。
3.程序设计的关键问题以及解决方法有哪些?
当应用程序通过IP网络传送数据时,数据被送入TCP/IP协议栈中,然后从上至下逐一通过每一层,直到最后被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息,这个过程被称作封装。通过以太网传输的比特流称作帧。在传输的另一端,当目的主机收到一个以太网数据帧时,数据就开始从协议栈由底向上逐层解析,去掉各层协议所加上的报文头部。每层协议均要检查报文头部中的协议标识字段,以确定要接收数据的上层协议,最终从报文中解析出应用层数据后交给应用程序处理。
本次要编写的协议分析器,就是从网络中捕获数据包并对其进行解析的过程。因此,我们需要了解每层协议所规定的报文格式,然后由底向上逐层对数据包进行解码,最后将分析的结果显示出来。
4.描述程序设计过程,并画出程序活动图。
协议分析器总体结构:
协议分析器的整体结构按功能应分为三个部分,自底向上分别是数据捕获模块、协议解析模块和用户显示模块。
数据包捕获流程:
捕获数据包的算法一般分为以下几步:
(1)获取并列出当前网络设备列表。
(2)由用户选择并打开指定网卡。
(3)根据过滤规则设置过滤器。
捕获数据包并进行解析处理:
协议解析模块:
对捕获的数据包按照数据链路层(MAC)、网络层(IP、ARP/RARP)、传输层(TCP、UDP、ICMP)和应用层(HTTP等)的层次结构自底向上进行解析,最后将解析结果显示输出。
1)解析Ethernet帧
2)解析ARP数据包
3)解析IP数据包
4)解析ICMP,TCP和UDP数据包
5.给出关键代码,并附注释。
1)解析Ethernet帧
typedef struct
{
BYTE DesMacAddr[6]; //目的地址
BYTE SrcMacAddr[6]; //源地址
WORD LengthOrType; //数据长度或类型} MAC_HEADER;
//MAC帧类型定义
const u_short MAC_TYPE_IP = 0x0800; const u_short MAC_TYPE_ARP = 0x0806; const u_short MAC_TYPE_RARP = 0x8035;
MAC_HEADER* pMacHdr = (MAC_HEADER*) pPkt;
// Mac目的地址
strItem.Format("Destination address: %02X:%02X:%02X:%02X:%02X:%02X",
pMacHdr->DesMacAddr[0],
pMacHdr->DesMacAddr[1],
pMacHdr->DesMacAddr[2],
pMacHdr->DesMacAddr[3],
pMacHdr->DesMacAddr[4],
pMacHdr->DesMacAddr[5]);
// Mac源地址
strItem.Format("Source address: %02X:%02X:%02X:%02X:%02X:%02X",
pMacHdr->SrcMacAddr[0],
pMacHdr->SrcMacAddr[1],
pMacHdr->SrcMacAddr[2],
pMacHdr->SrcMacAddr[3],
pMacHdr->SrcMacAddr[4],
pMacHdr->SrcMacAddr[5]);
//类型/长度字段
if (ntohs(pMacHdr->LengthOrType) > 1500)//类型字段(Ethernet V2.0)
{
//根据类型字段调用相应的上层协议处理函数
if (ntohs(pMacHdr->LengthOrType) == MAC_TYPE_IP) //IP协议
{
strItem = "IP";
ParseIPPacket((BYTE*)pMacHdr+sizeof(MAC_HEADER),
iLen-sizeof(MAC_HEADER));
}
else if (ntohs(pMacHdr->LengthOrType) == MAC_TYPE_ARP) //ARP协议{
strItem = "ARP";
ParseARPPacket((BYTE*)pMacHdr+sizeof(MAC_HEADER),
iLen-sizeof(MAC_HEADER));
}
else if (ntohs(pMacHdr->LengthOrType) == MAC_TYPE_RARP) //RARP协议{
strItem = "RARP";
ParseRARPPacket((BYTE*)pMacHdr+sizeof(MAC_HEADER),
iLen-sizeof(MAC_HEADER));
}
else //其他strItem = "UNKNOWN";
}
else //长度字段(IEEE802格式)
{