Ip数据包捕获设计报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

解析IP数据包程序设计与实现第1页共20页解析IP数据包程序设计与实现学生姓名:梁帅指导老师:谢晓巍摘要现如今,计算机网络已经彻彻底底地改变了人们的生活。大量的数据都是经过计算机网络传输的,而TCP/IP协议是计算机网络中最重要的协议之一。计算机网络中绝大多数数据都是以IP数据包的形式发送和接受的。所以IP数据包的捕获是很多计算机安全技术的基础。本课程设计实现了可以捕获流经本地网卡的IP数据包并将其头部信息解析输出的程序。关键词TCP/IP;IP数据包;计算机网络;捕获解析IP数据包程序设计与实现第2页共20页DesignandimplementationofIPdatapacketStudentname:LIANGShuaiAdvisor:XIEXiao-weiAbstractNowadays,computernetworkhascompletelychangedpeople'slife.Alargeamountofdataistransmittedthroughcomputernetworks,andtheTCP/IPprotocolisoneofthemostimportantprotocolsincomputernetworks.MostofthedatainthecomputernetworkaresentandreceivedintheformofIPdatapackets.SoIPpacketcaptureisthebasisofmanycomputersecuritytechnology.ThiscourseisdesignedtocapturetheIPdatapacketthatflowsthroughthelocalnetworkcardandtheprogramtoparsetheoutputofitshead.KeywordsTCP/IP;IPdatapacket;Computernetwork;Capture解析IP数据包程序设计与实现第3页共20页1引言1.1课程设计的目的本课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。1.2课程设计的意义计算机之间进行通信时,交互的所有信息都封装在数据包中。因此,通过采集网络数据并对其进行相应的分析,可以清楚地了解到进行通信的计算机的通信目的。首先,分析采集到的数据包,可以确定网络是否受到攻击入侵;其次,也可以使用采集到的数据包来分析网络应用程序可能出现的问题的原因;此外,通过网络数据采集和统计可以清楚的了解整个网络在各个时段内的网络负载情况,从而判断网络使用得是否合理。除了以上谈到的几个方面以外,数据包采集分析还有其他很多用途.在研究IPv4网络的同时,我们还对IPv6协议进行了初步的研究并通过对数据报的分析,了解了在不同网络环境下IPv6数据包的封装格式以及在网络中的传输路径。目前,在同一子网范围内,可以通过邻居计算机发现协议自动配置主机的本地一链路IPv6地址,并获取子网内其他主机的通信地址,通过该地址可以实现子网内的主机间纯IPv6环境下的通信。但由于现在整个因特网并不支持IM协议,因此IPv6数据包要在网间传输,必须通过基于双协议栈的IPv4隧道(Tunnel)技术,将EM数据报封装在IPv4包头中,并通过指定的支持IM协议的路由在Internet中传送到目的地,再由目的主机进行数据报解析。获取IPv6数据报中的信息。1.3设计平台笔记本,windows764bit操作系统,MicrosoftVisualC++6.0,C语言。解析IP数据包程序设计与实现第4页共20页2设计原理2.1IP数据包格式说明IP数据包格式包含了标头固定部分,标头可变部分和数据区三部分。IP数据报标头部分固定为20个字节,其中包含了12个参数域,各参数域隐含着网间协议的传输机制。IP具体的标头格式如图1所示。各参数域的具体含义如下:1)版本号:长度4位,表示所使用的IP协议的版本。IPv4版本号字段值为4;IPV6版本号字段号的值为6.2)标头长:长度4位,定义了一个以4B为一个单位的IP包的报头长度3)服务类型:共8位,高3位组成优先级子域,随后4位组成服务类型子域。4)数据报总长度:总长度为2B(即6位)。定义了以字节为单位的数据报的总长度。5)重装标识:长度16位,用于识别IP数据报的编号,让目的主机判断新来的数据属于哪个分组。6)分片标识:共3位,最高位为0;DF禁止分片标识。DF=0,可以分片;DF=1,不能分片。MF:分片标识。MF=0,表示接的是最后一个分片;MF=1,不是最后一个分片。7)片偏移值:共13位,说明分片在整个数据报中的相对位置。8)生存周期:8位,用来设置数据数据报在整个网络传输过程中的寿命。常以一个数据报可以经过的最多的路由器跳步数来控制。9)协议类型:共8位,表示该IP数据报的高层协议类型。10)标头校验和:共16位,用于存放检查报头错误的校验码。11)源、宿主机地址:共32位,分别表示发送和接受数据报的源主机和宿主机的IP地址。12)选项数据域:0-40B,用于控制和测试。IP数据包的格式为表2-1[1]:表2-1数据包格式4位版本4位首部长度8位服务类型TOS16位总长度16位标识3位标志13位片偏移8位生存时间TTL8位协议16位首部检验和32位源IP地址32位目的IP地址2.2IP数据包的定义typedefstruct_IP_HEADER//定义IP头{union{解析IP数据包程序设计与实现第5页共20页BYTEVersion;//版本(前4位)BYTEHdrLen;//报头标长(后4位),IP头长度};BYTEServiceType;//服务类型WORDTotalLen;//数据报总长WORDID;//标识union{WORDFlags;//标识(前3位)WORDFragOff;//分段偏移(后13位)};BYTETimeToLive;//生存周期BYTEProtocol;//协议WORDHdrChksum;//头校验和DWORDSrcAddr;//源地址DWORDDstAddr;//目地地址BYTEOptions;//选项}IP_HEADER;2.3套接字的使用本程序使用套接字socket编程,将网卡设为能够接受流经网卡的所有类型的数据包。首先,初始化套接字,然后监听数据包,解析数据包。SOCKETsock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用来创建套接字,其参数为通信发生的区字段和套接字的类型。WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen)函数用来把网卡设置为混杂模式。recv(sock,buffer,65535,0)函数用来接收经过的IP包,其参数分别是套接字描述符,缓冲区的地址,缓冲区的大小[2]。解析IP数据包程序设计与实现第6页共20页3设计步骤3.1程序流程图此次课程设计的程序流程图如图3-1NOYES图3-1程序流程图3.2主要程序分析使用原始套接字要进行IP层数据包的接收和发送,应使用原始套接字。创建原始套接字的代码如下:SOCKETsock;sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);在WSASoccket函数中,第一个参数指定通信发生的区字段,AF_INET是针对Internet的,允许在远程主机之间通信。第二个参数是套接字的类型,在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。在这里,开始结束是否达到需要次数构造程序运行文件,生成输出文件创建并初始化原始套接字设置网卡混杂模式监听网卡捕获和解析IP数据报输出解析信息,并存入文档解析IP数据包程序设计与实现第7页共20页设置为SOCK_RAW,表示声明的是一个原始套接字类型。第三个参数依赖于第二个参数,用于指定套接字所有的特定协议,这里使用IP协议。第四个参数为WSAPROTOCOL_INFO位,该位可以置空。第五个参数保留,永远置0。第六个参数是标志位,WSA_FLAG_OVERLAPPED表明可以使用发送接收超时设置[3]。创建原始套接字后,IP头就会包含在接收的数据中。然后,可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true,并设定IP_HDRINCL选项,表明用户可以亲自对IP头进行处理。BOOLflag=true;setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag));之后,使用如下代码完成对socket的初始化工作:/*获取主机名*/charhostName[128];gethostname(hostName,100);/*获取本地IP地址*/hostent*pHostIP;pHostIP=gethostbyname(hostName);/*填充SOCKADDR_IN结构的内容*/sockaddr_inaddr_in;addr_in.sin_addr=*(in_addr*)pHostIP-h_addr_list[0];addr_in.sin_family=AF_INET;addr_in.sin_port=htons(6000);/*绑定socket*/bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));填写sockaddr_in的内容时,其地址值应填写为本机IP地址,本机IP地址可以通过gethostbyname()函数获取;端口号可以随便填写,但不能与系统冲突;协议族应填为AF_INET。使用htons()函数可以将无符号短整型的主机数据转换为网络字节顺序的数据。最后使用bind()函数将socket绑定到本机网卡上。绑定网卡后,需要用WSAIoctl()函数把网卡设置为混杂模式,使网卡能够接收所有网络数据,其关键代码如下:#defineSIO_RCVALL_WSAIOW(IOC_VENDOR,1)DWORDdwBufferLen[10];解析IP数据包程序设计与实现第8页共20页DWORDdwBufferInLen=1;DWORDdwBytesReturned=0;WSAIoct1(SnifferSocket,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收到的数据就拷贝到套接字中。因此,网卡就可以接收所有经过的IP包。接收数据包在程序中可使用recv()函数接收经过的IP包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。因为IP数据包的最大长度是65535B,因此,缓冲区的大小不能小于65535B。设置缓冲区后,可利用循环来反复监听接收IP包,用RECV()函数实现接收功能的代码如下:#defineBUFFER_SIZE65535charbuffer[BUFFER_SIZE];//设置缓冲区while(true){recv(sock,buffer,BUFFER_SIZE,0);//接收数据包/*然后是解析接收的IP包*/}定义IP头部的数据结构程序需要定义一个数据结构表示IP头部。这个数据结构应该和IP数据包的格式吻合,其代码如下:typedefstruct_IP_HEADER//定义IP头{union{解析IP数据包程序设计与实现第9页共

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功