ip数据包的捕获与解析要点_第1页
ip数据包的捕获与解析要点_第2页
ip数据包的捕获与解析要点_第3页
ip数据包的捕获与解析要点_第4页
ip数据包的捕获与解析要点_第5页
免费预览已结束,剩余10页可下载查看

付费下载

下载本文档

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

文档简介

1、计算机网络与通信课程设计报告实验项目名称 IP数据包的捕获与解析实验学生班级 电力通信122实验学生学号208120529实验学生姓名颜旌同组学生姓名无实验时间 1 2 . 1 51 2 . 1 9实验地点 信息楼C322实验成绩评定指导教师签字2014年12 月20 日目录1 . 课程设计应达到的目的12 . 课程设计题目及要求13 . 课程设计思想14 . 课程设计流程图3五部分程序设计的分析3六 IP 数据包解析代码6七运行结果11八总结 11九参考文献12一 . 课程设计应达到的目的( 1 )使学生掌握网络通信协议的基本工作原理;( 2)培养学生基本掌握网络编程的基本思路和方法;( 3

2、)能提高学生对所学计算机网络理论知识的理解能力;( 4)能提高和挖掘学生对所学知识的实际应用能力和创新能力;( 5)提高学生的科技论文写作能力。二 . 课程设计题目及要求IP 数据包捕获与解析的设计。设计任务:( 1 )掌握IP 数据包的工作原理与报头设计的相关字段( 2)理解IP 包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移量、生存时间、上层协议类型、头校验合、源IP 地址和目的IP 地址等内容。设计内容:根据 IP 数据包的标准格式,编写程序捕获IP 数据包并进行解析,并将解析后各IP 包的头部与数据字段写入输出文件。数据字段的值从捕获的文件中获取。为了获取网络

3、中的 IP 数据包,可以采用Winsock 的数据库查询函数gethostname() 和 gethostbyname()解决 ,捕获 IP 数据包并解析IP 地址等内容。三 . 课程设计思想IP 数据报的格式说明:IP 数据包格式包含了标头固定部分,标头可变部分和数据区三部分。IP 数据报标头部分固定为 20 个字节,其中包含了12 个参数域,各参数域隐含着网间协议的传输机制。IP 具体的标头格式如图1 所示。各参数域的具体含义如下:1) 版本号:长度4 位,表示所使用的IP 协议的版本。IPv4 版本号字段值为4; IPV6版本号字段号的值为6.2)标头长:长度4位,定义了一个以 4B为一

4、个单位的IP包的报头长度3) 服务类型:共8 位,高 3 位组成优先级子域,随后4 位组成服务类型子域。4)数据报总长度:总长度为2B (即6位)。定义了以字节为单位的数据报的总长度。5) 重装标识:长度16 位,用于识别IP 数据报的编号,让目的主机判断新来的数据属于哪个分组。6)分片标识:共3位,最高位为0; DF禁止分片标识。DF=Q可以分片;DF=1,不能 分片。MF:分片标识。MF=0表示接的是最后一个分片;MF=1,不是最后一个分片。7) 片偏移值:共13 位,说明分片在整个数据报中的相对位置。8) 生存周期:8 位,用来设置数据数据报在整个网络传输过程中的寿命。常以一个数据报可以

5、经过的最多的路由器跳步数来控制。9) 协议类型:共8 位,表示该IP 数据报的高层协议类型。10) 标头校验和:共16 位,用于存放检查报头错误的校验码。11) 源、宿主机地址:共32 位,分别表示发送和接受数据报的源主机和宿主机的IP 地址。12)选项数据域:0-40B,用于控制和测试。IP 数据包的格式为:4位版本4位首部长 度8位服务类型(TOS)16位总长度(字节为单位)16位标识3位标志13位片偏移8位生存时间(TTL)8位协议16位首部检验和32位源IP地址32位目的IP地址IP数据包的C+定义:typedef struct _IP union BYTE Version; 版本 B

6、YTE HdrLen;/IHT;BYTE ServiceType; /服务类型WORD TotalLen; 总长WORD ID; / 标识 union WORD Flags; 标志 WORD FragOff; / 分段偏移 ; BYTE TimeToLive; / 生命期 BYTE Protocol; / 协议 WORD HdrChksum; 头校验和 DWORD SrcAddr; / 源地址 DWORD DstAddr; / 目的地址 BYTE Options; / 选项 IP;套接字的使用:本程序使用套接字 socket编程,将网卡设为能够接受流经网卡的所有类型的数据包。首先,初始化套接字

7、,然后监听数据包,解析数据包。SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_I历来创建套接字,其参数为通信发生 的区字段和套接字的类型。WSAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen)函数用来把网卡设置为混杂模式。recv(sock,buffer,65535,0)函数用来接收经过的IP包,其参数分别是套接字描述符,缓冲区的 地址,缓冲区的大小。四.课程设计流程图No五.部分程序设计的分析1、使用原始套接字要进行IP层数据包的接收和发送,应使用原始套接字。创建原始套接字的代

8、码如 下:SOCKET sock;sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0, WSA_FLAG_OVERLAPPED);在WSASoccket函数中,第一个参数指定通信发生的区字段,AF_INET是针对Internet的,允许在远程主机之间通信。第二个参数是套接字的类型,在AF_INET地址族下,有SOCK_STREAMSOCK_DGRAMSOCK_RA四种套接字类型。在这里,设置为SOCK_RA研示声明的是一个原始套接字类型。第三个参数依赖于第二个参数,用于指定套接字所有的特定协 议,这里使用IP协议。第四个参数为 WSAPROTO

9、COL_INFO该位可以置空。 第五个参数保 留,永远置0。第六个参数是标志位,WSA_FLAG_OVERLAPPED可以使用发送接收超时设置。创建原始套接字后,IP头就会包含在接收的数据中。然后,可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true ,并设定IP_HDRINCL项,表明用户可以亲 自对 IP 头进行处理。BOOL flag=true;setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag);之后,使用如下代码完成对socket 的初始化工作:/* 获取主机名*/char host

10、Name128;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,si

11、zeof(addr_in);填写sockaddr_in 的内容时,其地址值应填写为本机IP 地址,本机IP 地址可以通过gethostbyname() 函数获取;端口号可以随便填写,但不能与系统冲突;协议族应填为AF_INET。使用htons()函数可以将无符号短整型的主机数据转换为网络字节顺序的数据。最后使用bind(0 函数将 socket 绑定到本机网卡上。绑定网卡后,需要用WSAIoctl() 函数把网卡设置为混杂模式,使网卡能够接收所有网络数据,其关键代码如下:#define SIO_RCVALL_WSAIOW(IOC_VENDOR,1)DWORD dwBufferLen10;DWO

12、RD dwBufferInLen = 1;DWORD dwBytesReturned = 0;WSAIoct1(SnifferSocket,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen) ,&dwBytesReturned,NULL,NULL);如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收到的数据就拷贝到套接字中。因此,网卡就可以接收所有经过的IP 包。2、接收数据包在程序中可使用recv() 函数接收经过的IP 包。 该函数有四个参数,第一个参数接收操作所用的套接字

13、描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。因为IP数据包的最大长度是 65535B,因此,缓冲区的大小不能小于65535B。设置缓冲区后,可利用循环来反复监听接收IP包,用RECV()函数实现接收功能的代码如下:#define BUFFER_SIZE 65535char bufferBUFFER_SIZE; /设置缓冲区while(true)recv(sock,buffer,BUFFER_SIZE,0); /接收数据包/* 然后是解析接收的IP 包 */3、定义IP 头部的数据结构

14、程序需要定义一个数据结构表示IP 头部。这个数据结构应该和IP 数据包的格式吻合,其代码如下:typedef struct _IP_HEADERunionBYTE Version;BYTE HdrLen;/定义IP 头版本(前4 位)报头标长(后4 位) , IP 头的长度;BYTE ServiceType;WORD TotalLen;WORD ID;unionWORD Flags;WORD FragOff;;BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options; IP_HEA

15、DER;/服务类型总长度标识标志(前3 位)分段偏移(后13 位)生命期协议头校验和源地址目的地址选项这里只考虑IP 头部结构,不考虑数据部分。在捕获IP 数据包后,可以通过指针把缓冲区的内容强制转化为 IP_HEADER勺数据结构。IP_HEADER ip=*(IP_HEADER*)buffer;4、 IP 包的解析通过IP_HEADER军析IP头各个字段的代码: /* 获取版本字段*/ip.Version4;/* 获取头部长度字段*/ip.HdrLen & 0x0f;/* 获取服务类型字段中的优先级子域*/ip.ServiceType5;/*获取服务类型字段中的TOS子域*/(ip.Ser

16、viceType1)&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

17、_ntoa(*(in_addr*)&ip.DstAddr);六 IP 数据包解析代码如下:#include #include #include #include #pragma comment (lib,Ws2_32.lib)#define BUFFER_SIZE 65535#define IO_RCV ALL _WSAIOW(IOC_VENDOR,1)typedef struct _IP_HEADER unionBYTE Version;BYTE HdrLen;BYTE ServiceType;WORD TotalLen;WORD ID;unionWORD Flags;WORD FragOf

18、f;BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;/定义IP 头/版本(前4 位)/报头标长(后4 位) , IP 头长度/服务类型/数据报总长/标识/标识(前3 位)/分段偏移(后13 位)/生存周期/协议/头校验和/源地址/目地地址BYTE Options;IP_HEADER;/选项char * parseServiceType_getProcedence(BYTE b)switch(b5)/获取服务类型字段中优先级子域case 7:return Network Control;/网络控制b

19、reak;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_getTO

20、S(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:retur

21、n Unknow;char * getProtocol(BYTE Protocol)switch(Protocol)case 1:return ICMP;case 2:return IGMP;case 4:return IP in 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;default:/成本/可靠性/吞吐量/延迟/安全性/获取协议字段共8 位/以下为协议号说明:/Internet 控制报文协议/In

22、ternet 组管理协议/移动IP 数据封装和隧道/传输控制协议/外部网关协议/用户数据报文协议/资源预留协议/Open Shortest Path First 开发式最短路径优先return UNKNOW;void ipparse(FILE* * buffer)IP_HEADER ip=*(IP_HEADER*)buffer;/通过指针把缓冲区的内容强制转化为IP_HEADER 数据结构fseek();fprintf(file, 版本号 =%drn,ip.Version4);fprintf(file, 报头标长= %d (BYTE)rn,(ip.HdrLen & 0x0f)*4);fprin

23、tf(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&0x1ff

24、f);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

25、 * file;if(history.txt,wb+)=NULL)printf(fail to open );return -1;WORD rv;WSADATA WSAData;/定义了能够储存WSAStarup 调用返回值的结构rv=MAKEWORD(2,2);/Winsock2 版本WSAStartup(rv,&WSAData);SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);/创建套接字,sock 为套接字描述符BOOL flag=true;setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag

26、,sizeof(flag);/ 任意类型、任意状态套接口的设置选项值/获取主机名char hostName128;gethostname(hostName,100);hostent * pHostIP;/获取本地IP 地址pHostIP = gethostbyname(hostName);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);/将无符号短整型主机数据转换为网络字节顺序数据bi

27、nd(sock,(PSOCKADDR)&addr_in,sizeof(addr_in);DWORD dwBufferLen10;/设置网卡为混杂模式DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;WSAIoctl(sock, IO_RCV ALL,&dwBufferInLen,sizeof(dwBufferInLen), &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);char bufferBUFFER_SIZE;/设置缓冲区char i,a;int n=0,c;printf( 数据包捕捉和解析程序正在启动n);for(a=1;a

温馨提示

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

评论

0/150

提交评论