网络协议分析课程设计.doc_第1页
网络协议分析课程设计.doc_第2页
网络协议分析课程设计.doc_第3页
网络协议分析课程设计.doc_第4页
网络协议分析课程设计.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络编程语言网络编程语言 课程大作业报告 题 目: 协议分析器的设计与分析 专 业: 计算机科学与技术 班 级: 计科 5071 班 学 号: 920070619 姓 名: 万昌雄 时 间: 2010-10-21 目目 录录 1 概述.1 1.1 目的.1 1.2 选题.1 2 课程大作业过程及结果.1 2.1 编程环境及工具.1 2.2 实现原理分析.1 2.3 综合设计.1 2.3.1 协议分析器总体结构的设计与实现.1 2.3.2 数据捕获模块的设计与实现.2 2.3.3 协议解析模块的设计与实现.2 3 课程大作业总结.4 3.1 小结.4 3.2 我理解的网络通信编程.5 3.3 改进设想.5 附录 关键代码.5 1 1 概述概述 1.1 目的 (1) 编写一个简化的协议分析器,了解数据通过网络传输时的封装与解析过程, 加深理解 TCP/IP 协议栈的工作原理和网络应用软件开发能力 (2)掌握根据软件功能结构进行模块化设计的方法 (3)掌握 Winpcap 编程与抓包方法;了解使用原始套接字(raw socket)实现数据 包捕获的方式;使用 Winpcap 库的流量统计和向网络中发包等高级特性。 1.2 选题 协议分析器程序 2 2 课程大作业过程及结果课程大作业过程及结果 2.1 编程环境及工具 (1)操作系统:Windows XP SP2; (2)开发语言:C+ / MFC; (3)编译环境:MS Visual C+6.0; (4)第 3 方函数库:Winpcap3.1; 2.2 实现原理分析 Ethernet 是目前应用最广泛的计算机连网方式,它是基于总线结构的,物理层采用广 播方式。当一台主机向另一台主机发送数据时,发送主机会将包含目的主机 MAC 地址的数 据帧发送到总线上,因此同一链路上所有活跃主机的网卡都能接收到该帧。正常情况下, 网卡收到数据帧后,会先检测帧头的目的地址字段,如果该地址不是本机的 MAC 地址,则 丢弃不管,因此只有具有该地址的目的主机会接受这个数据帧。但是,如果某个主机上的 程序能够修改网卡的接收方式,使其成为“混杂”模式,即程序可以接收网络上所有的数 据帧而不理会帧头的目的地址,利用这一点,就可以实现协议分析器。因此协议分析器就 是一种能将本地网卡状态设成“混杂”模式并接收网络上所有数据帧的软件。 协议分析器工作在网络环境中的底层,拦截所有正在网络上传送的数据,并且通过相 应的解析处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体拓扑布局。 当应用程序通过 IP 网络传送数据时,数据就被送入 TCP/IP 协议栈中,然后由上至下 逐一通过每一层,直到最后被当做一串比特流送入网络。其中每一层对收到的数据都要增 加一些首部信息这个过程被称作封装。通过以太网传输的比特流被称作帧。在传输的另一 端,当目的主机收到一个以太网数据帧时,数据就开始从协议栈有底向上逐层解析,去掉 各层协议所加上的报文头部。每层协议均要检查报头中的协议标识字段,以确定要接收数 据的上层协议,最终从报文中解析出应用层数据后交给应用程序处理。 协议分析器就是从网络中捕获数据包并对其进行解析的过程。因此我们需要了解每层 协议所规定的报文格式,然后由底向上逐层对数据包进行解码,最后将分析的结果显示出 来。 2.3 综合设计 2.3.1 协议分析器总体结构的设计与实现 协议分析器的整体结构按功能分成 3 个部分,自底向上分别是数据捕获模块、协议解 析模块和用户显示模块。整体结构图 1 所示。 以太网 数据捕获模块 协议解析模块 用 户 界 面 网络流量 数据包 显示 图 1 协议分析器整体结构图 2.3.2 数据捕获模块的设计与实现 数据捕获模块的主要功能是进行数据采集,这个是整个系统的基础和数据来源。程序 使用 Winpcap 来捕获网络中原始数据包。Winpcap 是数据包捕获的开放代码函数库,它可 以完成以下主要功能: (1)捕获网络中的的原始数据包。 (2)使用用户自定义规则对数据包进行过滤。 (3)发送用户自己构造的数据包到网络中。 (4)统计网络流量。 (5)使用 Winpcap 捕获数据包的算法 使用 Winpcap 来捕获数据包的算法一般分为以下几步: (1)获取并列出当前网络设备列表。 (2)由用户选择并打开指定网卡。 (3)根据过滤规则设置过滤器。 (4)捕获数据包并进行解析处理。 编程流程如图 2 所示。 获取 网络设备列表 打开设备, 设为混杂模式 编译过滤器 设置过滤器 循环捕获数据包 关闭网络设备 处理数据包 图 2 数据包捕获流程图 2.3.3 协议解析模块的设计与实现 该模块的主要功能就是对捕获的数据包按照数据链路层(MAC) 、网络层 (IP、ARP) 、传输层(TCP、UDP、ICMP)的层次结构自底向上进行解析,最后将解析 结果显示输出。协议解析过程如图 3 所示。 第三层协议类型为? ParseIPPacket()ParseARPPacket() 解码结束 Ethernet V2.0 IP ARP 第四层协议类型为? ParseUDPPacket() ParseIPPacket()ParseICMPPacket() UDP TCP ICMP 开始解码 ParseIPPacket()ParseARPPacket() 解码结束 IP 第四层协议类型为? ParseUDPPacket() ParseIPPacket()ParseICMPPacket() UDP TCP ICMP 开始解码 图 3 协议解析流程图 (1). 解析 Ethernet 帧 Ethernet 帧结构中,前导码、帧前定界符和帧校验和(CRC)3 个字段均属于物理层内 容,而我们使用的 Winpcap 抓包驱动程序不包含这些字段,因此只需解析目的地址、源地 址、长度/类型和数据 4 个字段即可。 前导码 (7B) 帧前定界符 (1B) 目的地址 (6B) 数据 (可变长度) 源地址 (6B) 长度/类型 (2B) 帧校验和 (4B) 图 4 Ethernet 帧结构 (2).解析 ARP 数据包 此处不做过多说明,主要代码分析见本文第 5 部分。 硬件地址长度(6) 上层协议类型(IP: 0 x0800)硬件类型(Ethernet: 1) 协议地址长度(4)操作(请求: 1; 应答: 2) 发送端MAC地址 接收端IP地址 接收端MAC地址 发送端MAC地址发送端IP地址 发送端IP地址接收端MAC地址 图 5 ARP 报文结构 (3).解析 IP 数据包 为了提高效率,可以使用链表结构存储IP 数据包信息,同时还可以使用模板类 map 来存储 IP 数据包信息。 4位 版本 4位 首部长度 16位总长度(字节) 8位 服务类型(TOS) 3位 标志 8位 生存时间(TTL) 13位片偏移16位标识 8位协议16位首部校验和 32位源IP地址 32位目的IP地址 32位选项(若有) 数据部分 图 6 IP 报文结构 (4).解析 ICMP、TCP、和 UDP 数据包 解析 ICMP、TCP 和 UDP 数据包与解析 IP 报文类似,首先定义出各报文头部的数据结构 类型,然后使用报头指针对结构成员进行访问。针对数据长度为 8 位的字段通过结构成员 直接存取,对于 16 位和 32 位长度的字段使用 ntohs()或 ntohl()转化为主机字节序列 后再做后续处理;对于长度小于 8 位的字段(如标志位或子字段)可以通过结构体中定义 位域存取。 16位校验和 (不同类型和代码有不同的内容) 8位类型8位代码 图 7 ICMP 报文结构 6位 保留 16位源端口号16位目的端口号 32位序列号 32位确认号 4位 首部长度 P S H A C K U R G F I N S Y N R S T 16位窗口大小 16位TCP校验和16位紧急指针 选项(若有) 数据部分 图 8 TCP 报文结构 16位源端口号16位目的端口号 16位UDP长度16位UDP校验和 数据部分 图 9 UDP 报文结构 3 3 课程大作业总结课程大作业总结 3.1 小结 (1).启动: 程序启动后首先出现网卡选择对话框,如图 1 所示,在设备列表中选择需要进行捕获 的网卡。 图 10 网卡选择界面 (1).界面: 图 11 程序界面 3.2 我理解的网络通信编程 网络通信编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。 网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就 是找到主机后如何可靠高效的进行数据传输。在 TCP/IP 协议中 IP 层主要负责网络主机的 定位,数据传输的路由,由 IP 地址可以唯一地确定 Internet 上的一台主机。而 TCP 层则提 供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关 心 IP 层是如何处理数据的。 目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服 务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般 作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应 该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。 3.3 改进设想 程序解析了 ARP、IP、ICMP、TCP、UDP 协议,但仍不全面,例如没有包括 HTTP 等协议, 以后可对可解析的协议类型作进一步的扩充。 附录附录 关键代码关键代码 1.数据捕获模块 (1). 获取并列出网络设备列表 pcap_if_t *pAdaptersList=NULL; /网卡列表指针 pChar errbufPCAP_ERRBUF_SIZE; /错误消息缓冲区 pcap_findalldevs( /获取本地网络设备列表 int iAdapterCount=0; for(pcap_if_t *pAdapter=pAdatersList;pAdapter!=NULL;pAdapter=pAdapter-next) iAdapterCount+; if(pAdapter-description) /如果有描述则输出详细信息 . else /否则输出网卡号 . (2). 由用户选择并打开指定网卡 /跳到指定网卡 pAdapter=pAdapterslist; for(int i=0;inext; /打开网卡,bpromiscMode 标志设为 1 表示混杂模式 pcap_t *hAdapterHandle; hAdapterHandle=pcap_open_live(pAdapter-name,/网卡句柄 65535, /允许数据包的最大长度 bPromiscMode, / 混杂模式标志 300, /读取数据超时时间 errbuf ); /错误信息缓冲区 (3). 根据过滤规则设置过滤器 /pAdater 指向要设置的网卡,首先获取子网掩码 u_int uNetMask; if(pAdapter-addresser) uNetMask=(sockadder_in*)(pAdapter-addresser-addresses-netmask)- sin_addr.s_addr; else uNetMask=oxffffff; /忽略子网掩码 char szFilterCode1024; ./*根据规则构造过滤表达式,并存放在 szFileterCode 缓冲区中*/ /编译过滤器 bpf_program fpcode; if (pcap_compile(hAdapterHandle, /处理收到的数据包 PacketHandler(); 2.协议解析模块 (1). 解析 Ethernet 帧 /MAC 头部 typedef struct BYTE DesMacAddr6;/目的地址 BYTE SrcMacAddr6;/源地址 WORD LengthOrType;/数据长度或类型 MAC_HEADER; /MAC 帧类型 const u_short MAC_TYPE_IP= 0 x0800; const u_short MAC_TYPE_ARP= 0 x0806; const u_short MAC_TYPE_RARP = 0 x8035; MAC_HEADER* pMacHdr = (MAC_HEADER*) pPkt /MAC 目的地址 strItem.Format(%02X:%02X:%02X:%02X:%02X:%02X, pMacHdr-SrcMacAddr0, pMacHdr-SrcMacAddr1, pMacHdr-SrcMacAddr2, pMacHdr-SrcMacAddr3, pMacHdr-SrcMacAddr4, pMacHdr-SrcMacAddr5); / Mac 目的地址 strItem.Format(%02X:%02X:%02X:%02X:%02X:%02X, pMacHdr-DesMacAddr0, pMacHdr-DesMacAddr1, pMacHdr-DesMacAddr2, pMacHdr-DesMacAddr3, pMacHdr-DesMacAddr4, pMacHdr-DesMacAddr5); /根据协议类型调用相应解析函数 if (ntohs(pMacHdr-LengthOrType) 1500) if (ntohs(pMacHdr-LengthOrType) = MAC_TYPE_IP) /IP 协议 ParseIPPacket(BYTE*)pMacHdr+sizeof(MAC_HEADER), pRawPacket-PktHeader.caplen-sizeof(MAC_HEADER); else if (ntohs(pMacHdr-LengthOrType) = MAC_TYPE_ARP) /ARP 协 议 ParseARPPacket(BYTE*)pMacHdr+sizeof(MAC_HEADER), pRawPacket-PktHeader.caplen-sizeof(MAC_HEADER); else /帧数据中报文类型未知 ctlList.AddItem(m_iIndex, 4, UNKNOWN); else /长度 Parse802Packet(BYTE*)pMacHdr+sizeof(MAC_HEADER), pRawPacket-PktHeader.caplen-sizeof(MAC_HEADER); (2)解析 ARP 数据包 /ARP 头部 typedef struct u_short hardware_type;/16 位硬件类型 u_short proto_type;/16 位协议类型 u_char hardware_addr_len;/8 位硬件地址长度 u_char proto_addr_len;/8 位协议地址长度 u_short operation_code;/16 位操作码 u_char src_mac_addr6;/源以太网地址 u_char scr_ip_addr4;/源 IP 地址 u_char dest_mac_addr6;/目的以太网地址 u_char dest_ip_addr4;/目的 IP 地址 /ARP 报文操作码类型 const u_short ARP_OP_REQUEST= 1;/ARP 请求 const u_short ARP_OP_REPLY= 2;/ARP 应答 /解析 ARP 报文- ARP_HEADER* pARPHdr = (ARP_HEADER*)pPkt; ntohs(pARPHdr-hardware_type); /硬件类型 ntohs(pARPHdr-proto_type); /上层协议类型 pARPHdr-hardware_addr_len; /硬件地址长度 pARPHdr-proto_addr_len; /协议地址长度 /操作类型 if (ntohs(pARPHdr-operation_code) = ARP_OP_REQUEST) strItem += (Request); else if (ntohs(pARPHdr-operation_code) = ARP_OP_REPLY) strItem += (Reply); /ARP 头部子节点:源 Mac 地址 strItem.Format(Senders hardware address: %02X:%02X:%02X:%02X:%02X:%02X, pARPHdr-src_mac_addr0, pARPHdr-src_mac_addr1, pARPHdr-src_mac_addr2, pARPHdr-src_mac_addr3, pARPHdr-src_mac_addr4, pARPHdr-src_mac_addr5); /ARP 头部子节点:源 IP 地址 in_addr ipAddr; memcpy( strItem.Format(Senders IP address: %s, inet_ntoa(ipAddr); tARPHdr.AddTail(strItem, IID_ADDRESS); /ARP 头部子节点:目的 Mac 地址 strItem.Format(Targets hardware address: %02X:%02X:%02X:%02X:%02X:%02X, pARPHdr-dest_mac_addr0, pARPHdr-dest_mac_addr1, pARPHdr-dest_mac_addr2, pARPHdr-dest_mac_addr3, pARPHdr-dest_mac_addr4, pARPHdr-dest_mac_addr5); /ARP 头部子节点:目的 IP 地址 memcpy( strItem.Format(Targets IP address: %s, inet_ntoa(ipAddr); /ARP 头部子节点:填充字段 strItem.Format(Frame padding: %d bytes, iLen-sizeof(ARP_HEADER); (3)解析 IP 数据包 /IP 头部 typedef struct unsigned charhdr_len :4;/ 4 位头部长度 unsigned charversion :4;/4 位版本号 unsigned chartos;/ 8 位服务类型 unsigned shorttotal_len;/ 16 位总长度 unsigned shortidentifier;/16 位标识符 unsigned shortfrag_and_flags; / 3 位标志+13 位片偏移 unsigned charttl;/8 位生存时间 unsigned charprotocol;/8 位上层协议号 unsigned shortchecksum;/16 位校验和 unsigned longsource_ip;/ 32 位目的地址 unsigned longdest_ip;/ 32 位目的偏移地址 IP_HEADER; /解析 IP 报文- IP_HEADER* pIPHdr = (IP_HEADER*)pPkt; /*解析 IP 头部各字段并显示输出*/ /根据不同上层协议调用相应解析函数 switch (pIPHdr-protocol) case IPPROTO_TCP: strItem += TCP; ParseTCPPacket(BYTE*)pIPHdr+iIPHdrLen, iLen-iIPHdrLen, tParentCursor); break; case IPPROTO_UDP: strItem += UDP; ParseUDPPacket(BYTE*)pIPHdr+iIPHdrLen, iLen-iIPHdrLen, tParentCursor); break; case IPPROTO_ICMP: strItem += ICMP; ParseICMPPacket(BYTE*)pIPHdr+iIPHdrLen, iLen-iIPHdrLen, tParentCursor); break; case IPPROTO_IGMP: strItem += IGMP; ParseIGMPPacket(BYTE*)pIPHdr+iIPHdrLen, iLen-iIPHdrLen, tParentCursor); break; default: strItem += OTHERS; (4)解析 ICMP、TCP 和 UDP 数据包 /ICMP 基本头部 typedef struct BYTEtype;/8 位类型 BYTEcode;/8 位代码 USHORTcksum;/16 位校验和 ICMP_BASE_HEADER; /- /ICMP 回显头部 typedef struct ICMP_BASE_HEADER base_hdr;/基本头部 USHORTid;/16 位标识符 USHORTseq;/16 位序列号 ICMP_ECHO_HEADER; /- /ICMP 差错报文头部 typedef struct ICMP_BASE_HEADER base_hdr;/基本头部 ULONGunused;/32 位未用,必须为 0 ICMP_ERROR_HEADER; ICMP_BASE_HEADER* pICMPHdr = (ICMP_BASE_HEADER*)pPkt; /ICMP 头部子节点:类型 strItem.Format(Type: %d, pICMPHdr-type); switch (pICMPHdr-type) case ICMP_ECHO_REQUEST: strItem += (Echo Request); break; case ICMP_ECHO_REPLY: strItem += (Echo Reply); break; case ICMP_TIMEOUT: strItem += (Time Exceeded); break; case ICMP_HOST_UNREACHABLE: strItem += (Destination Unreachable); break; tICMPHdr.AddTail(strItem, IID_ITEM); /ICMP 头部子节点:代码 strItem.Format(Code: %d, pICMPHdr-code); tICMPHdr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论