实验八协议分析器程序的设计和实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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格式)

{

相关文档
最新文档