




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
解析IP数据包程序设计与实现解析IP数据包程序设计与实现学生姓名:梁帅 指导老师:谢晓巍摘 要 现如今,计算机网络已经彻彻底底地改变了人们的生活。大量的数据都是经过计算机网络传输的,而TCP/IP协议是计算机网络中最重要的协议之一。计算机网络中绝大多数数据都是以IP数据包的形式发送和接受的。所以IP数据包的捕获是很多计算机安全技术的基础。本课程设计实现了可以捕获流经本地网卡的IP数据包并将其头部信息解析输出的程序。关键词 TCP/IP;IP数据包;计算机网络;捕获Design and implementation of IP data packetStudent name: LIANG Shuai Advisor:XIE Xiao-weiAbstract Nowadays, computer network has completely changed peoples life. A large amount of data is transmitted through computer networks, and the TCP/IP protocol is one of the most important protocols in computer networks. Most of the data in the computer network are sent and received in the form of IP data packets. So IP packet capture is the basis of many computer security technology. This course is designed to capture the IP data packet that flows through the local network card and the program to parse the output of its head.Key words TCP/IP;IP data packet;Computer network;Capture1引言1.1课程设计的目的本课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。1.2课程设计的意义计算机之间进行通信时,交互的所有信息都封装在数据包中。因此,通过采集网络数据并对其进行相应的分析,可以清楚地了解到进行通信的计算机的通信目的。首先,分析采集到的数据包,可以确定网络是否受到攻击入侵;其次,也可以使用采集到的数据包来分析网络应用程序可能出现的问题的原因;此外,通过网络数据采集和统计可以清楚的了解整个网络在各个时段内的网络负载情况,从而判断网络使用得是否合理。除了以上谈到的几个方面以外,数据包采集分析还有其他很多用途.在研究IPv4网络的同时,我们还对IPv6协议进行了初步的研究并通过对数据报的分析,了解了在不同网络环境下IPv6数据包的封装格式以及在网络中的传输路径。目前,在同一子网范围内,可以通过邻居计算机发现协议自动配置主机的本地一链路IPv6地址,并获取子网内其他主机的通信地址,通过该地址可以实现子网内的主机间纯IPv6环境下的通信。但由于现在整个因特网并不支持IM协议,因此IPv6数据包要在网间传输,必须通过基于双协议栈的IPv4隧道(Tunnel)技术,将EM数据报封装在IPv4包头中,并通过指定的支持IM协议的路由在Internet中传送到目的地,再由目的主机进行数据报解析。获取IPv6数据报中的信息。1.3设计平台笔记本,windows7 64bit操作系统,Microsoft Visual C+6.0,C语言。2设计原理2.1 IP数据包格式说明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-11:表2-1 数据包格式4位版本4位首部长度8位服务类型TOS16位总长度16位标识3位标志13位片偏移8位生存时间TTL8位协议16位首部检验和32位源IP地址32位目的IP地址2.2 IP数据包的定义typedef struct _IP_HEADER /定义IP头 union BYTE Version; /版本(前4位) BYTE HdrLen; /报头标长(后4位),IP头长度 ; BYTE ServiceType; /服务类型 WORD TotalLen; /数据报总长 WORD ID; /标识 union WORD Flags; /标识(前3位) WORD FragOff; /分段偏移(后13位) ; BYTE TimeToLive; /生存周期 BYTE Protocol; /协议 WORD HdrChksum; /头校验和 DWORD SrcAddr; /源地址 DWORD DstAddr; /目地地址BYTE Options; /选项 IP_HEADER;2.3套接字的使用本程序使用套接字socket编程,将网卡设为能够接受流经网卡的所有类型的数据包。首先,初始化套接字,然后监听数据包,解析数据包。 SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用来创建套接字,其参数为通信发生的区字段和套接字的类型。 WSAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen)函数用来把网卡设置为混杂模式。 recv(sock,buffer,65535,0)函数用来接收经过的IP包,其参数分别是套接字描述符,缓冲区的地址,缓冲区的大小2。3设计步骤3.1程序流程图此次课程设计的程序流程图如图3-1开始构造程序运行文件,生成输出文件创建并初始化原始套接字设置网卡混杂模式监听网卡捕获和解析IP数据报输出解析信息,并存入文档NO是否达到需要次数结束 YES图3-1程序流程图3.2主要程序分析使用原始套接字 要进行IP层数据包的接收和发送,应使用原始套接字。创建原始套接字的代码如下: SOCKET sock; 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三种套接字类型。在这里,设置为SOCK_RAW,表示声明的是一个原始套接字类型。第三个参数依赖于第二个参数,用于指定套接字所有的特定协议,这里使用IP协议。第四个参数为WSAPROTOCOL_INFO位,该位可以置空。第五个参数保留,永远置0。第六个参数是标志位,WSA_FLAG_OVERLAPPED表明可以使用发送接收超时设置3。 创建原始套接字后,IP头就会包含在接收的数据中。然后,可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true,并设定IP_HDRINCL选项,表明用户可以亲自对IP头进行处理。 BOOL flag=true; setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag); 之后,使用如下代码完成对socket的初始化工作: /*获取主机名*/ char hostName128; gethostname(hostName,100); /*获取本地IP地址*/ hostent * pHostIP; pHostIP = gethostbyname(hostName); /*填充SOCKADDR_IN结构的内容*/ sockaddr_in addr_in; addr_in.sin_addr = *(in_addr *)pHostIP-h_addr_list0; 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()函数把网卡设置为混杂模式,使网卡能够接收所有网络数据,其关键代码如下: #define SIO_RCVALL_WSAIOW(IOC_VENDOR,1) DWORD dwBufferLen10; DWORD dwBufferInLen = 1; DWORD dwBytesReturned = 0;WSAIoct1(SnifferSocket, IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL); 如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收到的数据就拷贝到套接字中。因此,网卡就可以接收所有经过的IP包。 接收数据包 在程序中可使用recv()函数接收经过的IP包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。因为IP数据包的最大长度是65535B,因此,缓冲区的大小不能小于65535B。设置缓冲区后,可利用循环来反复监听接收IP包,用RECV()函数实现接收功能的代码如下: #define BUFFER_SIZE 65535 char bufferBUFFER_SIZE; /设置缓冲区 while(true) recv(sock,buffer,BUFFER_SIZE,0); /接收数据包 /*然后是解析接收的IP包*/ 定义IP头部的数据结构 程序需要定义一个数据结构表示IP头部。这个数据结构应该和IP数据包的格式吻合,其代码如下: typedef struct _IP_HEADER /定义IP头 union BYTE Version; /版本(前4位) BYTE HdrLen; /报头标长(后4位),IP头的长度 ; BYTE ServiceType; /服务类型 WORD TotalLen; /总长度 WORD ID; /标识 union WORD Flags; /标志(前3位) WORD FragOff; /分段偏移(后13位) ; BYTE TimeToLive; /生命期 BYTE Protocol; /协议 WORD HdrChksum; /头校验和 DWORD SrcAddr; /源地址 DWORD DstAddr; /目的地址 BYTE Options; /选项 IP_HEADER; 这里只考虑IP头部结构,不考虑数据部分。在捕获IP数据包后,可以通过指针把缓冲区的内容强制转化为IP_HEADER的数据结构。 IP_HEADER ip=*(IP_HEADER*)buffer; IP包的解析 通过IP_HEADER解析IP头各个字段的代码: /*获取版本字段*/ ip.Version4; /*获取头部长度字段*/ ip.HdrLen & 0x0f; /*获取服务类型字段中的优先级子域*/ ip.ServiceType5; /*获取服务类型字段中的TOS子域*/ (ip.ServiceType1)&0x0f; /*获取总长度字段*/ ip.TotalLen; /*获取标识字段*/ ip.ID; /*解析标志字段*/DF = (ip.Flags14) & 0x01; MF = (ip.Flags13) & 0x01; /*获取分段偏移字段*/ ip.FragOff & 0x1fff; /*获取生存时间字段*/ ip.TimeToLive; /*获取协议字段*/ ip.Protocol; /*获取头校验和字段*/ ip.HdrChksum; /*解析源IP地址字段*/ inet_ntoa(*(in_addr*)&ip.SrcAddr); /*解析目的IP地址字段*/ inet_ntoa(*(in_addr*)&ip.DstAddr);3.3运行结果编译成功并运行,如图3-3-1,询问用户是否捕获并解析本机的数据包,输入Y进行捕获解析,输入N则退出程序。图3-3-1 程序启动界面输入Y后,程序捕获并解析一个IP数据包,输出的信息为IP数据包头部的各项数据,如图3-3-2和图3-3-3.以图3-3-2为例进行详细解释:版本号为4(0100),说明采用的是IPv4的版本;报头标长为20,IP包头的长度,最小为20字节;服务器类型Routine,定义了包的优先级为普通;总长度为10240字节,包括头部和数据;标识位DF=0,M=0F该字段第一位不使用。第二位是DF(Dont Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1;分段偏移值为64,表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包;生存期为64,当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发;协议为TCP;头校验和为0x2dec,用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值;源IP地址为82(本机);目的IP地址为65。图3-3-2 IP数据包捕获解析结果1图3-3-3 IP数据包捕获解析结果24总结语通过这次实验,我们了解到关于网络数据传送及处理过程中,软件起到了巨大的作用。熟悉了VC+在计算机网络方面的应用,是一次难得的机会。 此外,我们还掌了握网络通信协议的基本工作原理,虽然刚开始的时候比较模糊,但是通过与同学共同探讨和向老师的虚心请教,最终我们成功掌握了。这次实习培养了我们基本掌握网络编程的基本思路和方法,让我们懂得如何去学习这累东西。同时提高我们对所学计算机网络理论知识的理解能力,提高和挖掘我们对所学知识的实际应用能力和创新能力。同学们的默锲配合和合作精神是实验成功的必要条件,而谨慎对待事物的态度是成功的关键。参考文献1AndrewS.Tanenbaum,DavidJ.Wetherall.计算机网络(第五版)M.北京:清华大学出版社,2012.32BobQuinn,DaveShute.WindowsSockets网络编程M.北京:机械工业出版社,2012.83MSDN.TCP/IP原始套接字./enus/library/windows/desktop/ms(v=vs.85).aspx,2015.9.19附录:源代码#include #include #include #include #pragma comment (lib,Ws2_32.lib) #define BUFFER_SIZE 65535 #define IO_RCVALL _WSAIOW(IOC_VENDOR,1)typedef struct _IP_HEADER /定义IP头 union BYTE Version; /版本(前4位) BYTE HdrLen; /报头标长(后4位),IP头长度 ; BYTE ServiceType; /服务类型 WORD TotalLen; /数据报总长 WORD ID; /标识 union WORD Flags; /标识(前3位) WORD FragOff; /分段偏移(后13位) ; BYTE TimeToLive; /生存周期 BYTE Protocol; /协议 WORD HdrChksum; /头校验和 DWORD SrcAddr; /源地址 DWORD DstAddr; /目地地址BYTE Options; /选项 IP_HEADER; char * parseServiceType_getProcedence(BYTE b) switch(b5) /获取服务类型字段中优先级子域 case 7:return Network Control; /网络控制 break; case 6: return Internet work Control; /网络控制 break; case 5: return CRITIC/ECP; break; case 4: return Flash Override; /最优先信号 break; case 3: return Flsah; break; case 2: return Immediate; break; case 1: return Priority; /协议 break; case 0: return Routine; /路由 break; default: return Unknow; break; char * parseServiceType_getTOS(BYTE b) b=(b1)&0x0f; /获取服务类型字段中的TOS子域 switch(b) case 0: return Normal service; /正常运行 break; case 1: return Minimize monetary cost; /成本 break; case 2: return Maximize reliability; /可靠性 break; case 4: return Maximize throughput; /吞吐量 break; case 8: return Minimize delay; /延迟 break; case 15: return Maximize security; /安全性 break; default: return Unknow; char * getProtocol(BYTE Protocol) /获取协议字段共8位 switch(Protocol) /以下为协议号说明: case 1: return ICMP; /Internet控制报文协议 case 2: return IGMP; /Internet组管理协议 case 4: return IP in IP; /移动IP数据封装和隧道 case 6: return TCP; /传输控制协议 case 8: return EGP; /外部网关协议 case 17: return UDP; /用户数据报文协议 case 41: return IPv6; case 46: return RSVP; /资源预留协议 case 89: return OSPF; /Open Shortest Path First 开发式最短路径优先 default: return UNKNOW; void ipparse(FILE* file,char* buffer) IP_HEADER ip=*(IP_HEADER*)buffer; /通过指针把缓冲区的内容强制转化为IP_HEADER数据结构 fseek(file,0,SEEK_END); fprintf(file,版本号=%drn,ip.Version4); fprintf(file,报头标长= %d (BYTE)rn,(ip.HdrLen & 0x0f)*4); fprintf(file,服务器类型 = %s,%srn,parseServiceType_getProcedence(ip.ServiceType), parseServiceType_getTOS(ip.ServiceType); fprintf(file,总长度 = %d(BYTE)rn,ip.TotalLen); fprintf(file,标识 = %drn,ip.ID); fprintf(file,标志位 DF=%d , MF=%drn,(ip.Flags14)&0x01),(ip.Flags13)&0x01); fprintf(file,分段偏移值 = %drn,(ip.FragOff&0x1fff); fprintf(file,生存期 = %d (hops)rn,ip.TimeToLive); fprintf(file,协议 = %srn,getProtocol(ip.Protocol); fprintf(file,头校验和 = 0x%0xrn,ip.HdrChksum); fprintf(file,源IP地址 = %srn,inet_ntoa(*(in_addr*)&ip.SrcAddr); fprintf(file,目的IP地址 = %srn,inet_ntoa(*(in_addr*)&ip.DstAddr); fprintf(file,-rn); int main() FILE * file; if(file=fopen(history.txt,wb+)=NULL) printf(fail to open file %s); return -1; WORD rv; WSA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高一文科物理试卷及答案
- 液压机买卖合同3篇
- 2025年自来水管道工考试试题及答案
- 教师招聘真题套题及答案
- 2025年板栗栽培学试题及答案
- 2025年幸运咖考试题目及答案
- 内科三基题目及答案2025年必考版护士
- 药学专业专科试题及答案
- 银行承兑汇票购销合同3篇
- 学生营养餐工作责任追究制度模版
- 第一单元 第2课《童真时光》 【人教版】美术 三年级上册
- 广州市公安局天河分局招聘辅警考试真题2024
- 2025年全国货运驾驶员职业技能资格考试试题(基础知识)含答案
- GB/T 46150.2-2025锅炉和压力容器第2部分:GB/T 46150.1的符合性检查程序要求
- 2025年甘肃省高考历史真题卷含答案解析
- 中华优传统文化(慕课版)教案
- 2025广东广州市国资委选调公务员2人笔试模拟试题及答案解析
- 美容美发店2025年营销方案创新解析
- 档案知识培训课件
- 肱骨髁上骨折
- 2025年中药师证考试真题及答案
评论
0/150
提交评论