解析IP数据包实验报告讲解_第1页
解析IP数据包实验报告讲解_第2页
解析IP数据包实验报告讲解_第3页
解析IP数据包实验报告讲解_第4页
解析IP数据包实验报告讲解_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、成都工业学院(课程设计实验报告)院 系:计算机工程系课程名称:计算机网络设计名称:解析IP数据包专业名称:网络工程班级:1305022姓 名:牟黎明学号:11指导老师:刘枝盛老师成 绩:设计时间:2014年12月22日一2014年12月26日成都工业学院计算机工程系1305022班 牟黎明(2013511237)11号成都工业学院课程设计任务书课程名称计算机网络课程代码设计题目解析IP数据包(visual2012编译)题目序号7设计时间2014年12月22日一2014年12月26日系(院)计算机工程系专业网络工程|班级1305022一、课程设计任务(条件)、具体技术参数(指标)深入理解计算机网

2、络基本原理,将书本上抽象的概念与具体的实现技术相结合,体会网络协议的设计与实现过程,以及专业技术人员所使用的基本方法和技巧; 熟悉相关应用开发工具, 掌握网络协 议应用开发技术;掌握网络规划与设计的基本方法; 立隽一定的自学能力和独立分析问题、 解决问题 的能力;对设计中遇到的问题,能通过独立思考、查阅资料、参考文献,寻求解决方案。每位同学从给出的题目中任选其一, 但对同一班级同学来说。 每位同学对选的题目要求独立完成,且对编码的系统要求:1 :尽量采用图形界面实现。2 :程序代码书写规范,有充足的注释。3 :绿色软件:程序运行不需安装,避免写系统和注册表 :。4 :开发平台、开发语言不限。5

3、 :明确题目的意图,设计上应有足够的工作量二、对课程设计成果的要求(包括课程设计说明书、图纸、图表、实物等软硬件要求),考核要求1、需要做一个可以捕获经过本电脑IP数据包的软件,然后进行解析,解析内容项为:版本、头长度、服务类型、数据长度、分段标志、DF、MF分段偏移值、生存期、协、议、头校验和、源IP地址、目的IP地址。2、程序不需要冉控制台命令卜去运行,可直接打开,每次解析2次(作对比,比较理论上固定不义的值,以此来排除软件 bug),解析后可按1号键选择继续解析,也可按 2号键退出程序。3、解析完毕后,退出程序,本程序将自动生成一个history.txt 文件,以此记录解析结果。三、课程

4、设计工作进度计划:第一天:按照老师推荐的参考书,了解本实验的目的和意义,分析核心代码,并将所有参考代码输入电脑。第二天:调试书上的参考代码,弄懂每句的意义,以及本程序调用了那些库函数,每个库函数的意义,最终通过调试。第三天:因为源代码程序必须在控制台命令下运行,我需修改主函数代码, 使其不需要在控制台命令卜就可运行。第四天:使其不需要在控制台命令下运行修改成功后,但不可控,及打开后就运行,不能控制,我 添加代码,使其必须为在我输入正确的命令符后才能进入程序,开始运行。第五天:因为进入后他自己无限抓包解析,人工停止后/、可再继续,我添加代码,使其每次抓包、 解析2次,自动停止,然后根据用户需求,

5、选择是否继续抓包解析,不用退出后再次抓包。完成后并 且在老师处通过验收。四、主要参考资料:1吴功宜 吴英 等编著.计算机网课程设计机械工业出版社第2版2谢希仁编著计算机网络电子工业出版社第6版3陈维兴林小茶编著C+对同对象设计一程序设计教程清华大学出版社第3版4胡名王红梅编著程序设计基础一从问题到程序清华大学出版社第1版指导教师(签名)目录一、课程设计的目的和意义 :.::;.3二、课程设计的内容和要求 :.:.3三、解析IP数据包设计的相关技术 :,:.:.43.1 ip数据包的格式与分析 :.43.2 程序分析设计 :-:63.2.1 网卡设置:6-3.2.2 程序设计::.6-3.2.3

6、 程序设计::: 程序设计:::7-3.2.5 程序设计:::7.四、课程设计过程 .:.::/. -64.1 程序流程图:.一164.2 源程序代码:.:94.3 程序运行结果 :.:164.3.1. 登陆界面,提示输入命令符 :.:164.3.2. 命令符输入错误后提示界面 .:.:.164.3.3. 截获的IP数据包界面 :.:.:174.3.4. 继续抓包图:.:1718五、课程设计小结 :.:18参考文献一、 课程设计的目的和意义目的:本章课程设计的目的就是设计一个解析IP数据包的程序(我的编辑环境为visual2102,并根据这个程序,说明IP数据包的结构及IP协议的

7、相关问题,从 而对网络层的工作原理有更好的理解和认识。意义:1、有利于编程能力的提高在做设计的过程中,我再一次熟悉了开发设计的基本流程, 从分析任务到确 立整体框架再到确定算法,然后再一步步实现各函数的功能。从中,我熟悉了许 多新的库函数,并提高了编程技巧。2、有利于基础知识的理解在这次课程设计之前,我们已经学完了网络层的理论知识, 可是对它的理解 很粗浅。之前只知道关于网络层的一些概念性的东西。 可是做完设计后,我才从 整体上理解了网络层的框架,明白了网络层的每一个组成部分都是有它特定的功 能和意义的,从而对网络层协议有了更深入的理解。3、有利于逻辑思维的锻炼程序设计能直接有效地训练我们的创

8、新思维,培养分析问题、解决问题的能 力。即使一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试 运行,整个过程学生都需要有条理地构思, 这中间有猜测设想、判断推理的抽象 思维训练,也有分析问题、解决问题、预测目标等能力的培养。二、课程设计的内容和要求本设计的目标是捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。程序的具体要求如下:1)打开本程序,根据提示,输入命令符 ParsePacket ,开始抓包。获取 经过本机的ip数据。若输入错误,将退出重新打开才行。2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、 数据包总长度、数

9、据包标识、分段标志、分段偏移值、生存时间、上层协议类型、 头校验和、源IP地址和目的IP地址等内容。3)第一次抓包完成后,可按1号键选择再次抓包,也可按2号键选择退出。三、解析IP数据包设计的相关技术3.1 IP数据包的格式与分析互联网层是TCP/IP协议参考模型中的关键部分。IP协议把传输层送来的消 息组装成IP数据包,并把IP数据传递给数据链路层。IP协议在TCP/IP协议族 中处于核心地位,IP协议制定了统一的IP数据包格式,以消除各通信子网间的 差异,从而为信息发送方和接收方提供了透明的传输通道。编制本程序前,首先要对IP包的格式有一定的了解。图(1)给出了 IP协议的数据包格式。IP

10、数据包的第一字段是版本字段,其长度为 4位,表示所使用的IP协议的 版本。目前的版本IPV4,版本字段的值为4,下一代的版本是IPV6,版本字段 的值为6。本程序主要针对版本值为4的IP数据包的解析。报头标长(IHL)字段为4位,它定义了以4B为一个单位的IP包的报头长度。 报头除了选项字段和填充域字段外,其他各字段是定长的。因此, IP数据包的 头长度在20-40B之间,是可变的。04816192431 (位)图1IP数据包的格式服务类型字段共8位,用于指示路由器如何处理该数据包。该字段长度由4 位服务类型(TOS)子域和3位优先级(b7 b6 b5)(precedence)子域组成,1位为

11、保 留位,该字段结构如图(2)所示:b7 b6b5b4b3b2b1bo优先级D.11. T 11 R 一C0图2服务类型字段结构优先级共有关8种,优先级越高表明数据包越重要。图(3)列出了各种优 先级所代表的意义。位数(b7b6b5)意义111网络控制110网络间控制101重要(CRITIC/ECP)100即时、优先011即时010立刻001优先000普通图3优先级子域的说明在4位服务类型子域中,b4 b3 b2如分别表示D (延迟)、T (吞吐量)、R (可靠性)与(成本)。表图(4)列出了服务类型子域的构成。位数(b4 b3 b2 b1)意义1111安全1000延迟最小0100吞吐量最大0

12、010可靠性最大00010000成本最小普通服务图4列出了服务类型子域总长度字段为2B,它定义了以字节为单位的数据包的总长度。IP数据包的 最大长度为216 =65535B。标识字段长度为16位,用于识别IP数据包的编号。每批数据都有一个标识 值,用于让目的主机判断新来的数据属于哪个分组。报头中的标志字段如图(5)所示。标志字段共3位,最高位是0,禁止分 片标志DF字段的值若为1 ,表示不能对数据包分片;若 DF值为0,则表明可 以分片。分片标志MF的值为1,表示接收到的不是最后一个分片;若 MF值为 0,表示接收到的是最后一个分片。0DFMF图5标志字段的结构片偏移字段共13位,说明分片在整

13、个数据包中的相对位置。 片偏移值是8B 为单位来计数的,因此选择的分片长度应该是8B的整数倍。生存时间(TTL)字段为8位,用来设置数据包在互联网络的传输过程的寿 命,通常是用一个数据包可以经过的最多的路由器跳步数来限定的。协议字段为8位,表示使用IP数据包的高层协议类型头部验和字段为16位,用于存放检查报头错误的校验码。3.2程序分析设计3.2.1 网卡设置为了获取网络中的IP数据包,必须对网卡进行编程,在这里我们使用套接 字(socket )进行编程。但是,在通常情况下,网络通信的套接字程序只能响应与 自己硬件地址相匹配的数据包或是以广播形式发出的数据包。对于其他形式的数据包,如已到达网络

14、接口,但却不是发送到此地址的数据包,网络接口在雎投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的 数据包。我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。 3.2.2程序设计本程序主要由三部分构成:初始化原始套接字,反复监听捕获数据包和解析 数据包。下面就结合核心代码对程序的具体实现进行分析, 同时使程序流程更加 清晰,去掉了错误检查等保护性代码。3.2.3 使用原始套接字套接字分为三种,即流套接字(Stream socket)、数据报套接字(Datagram Socket)和原始套接字(Raw Socket)。要进行IP层数据包的接收和发送,应使用

15、原始套接字。创建原始套接字的代码如下:Socket sock:Sock=WSAsocket(af_inet,sock_raw,ipproto-ip,null,0,wsa-flag-overlapped): 本设计不用考虑超时情况。创建套接后,IP头就会包含在接收数据包中。然后,我可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true,并设定IP-HDRINCL选项, 表明用户可以亲自对IP头进行处理。最后使用bind()函数将socket绑定到本地 网卡上。绑定网卡后,需用WSAIoctl()函数把网卡设置为混杂模式,使网卡能够 接收所有的网络数据。如果接收的数据包中

16、的协议类型和定义的原始套接字匹 配,那么接收的数据就拷贝到套接字中,因此,网卡就可以接收所有经过的IP包。3.2.4 接收数据包在程序中可使用recv()函数接收经过的IP包。该函数有四个参数,第一个 参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如 果对所发送的数据没特殊要求,直接设为0o因为IP数据包的最大长度是65535B ,因此缓冲区的大小不能小于 65535B。设置缓冲区后,可利用循环来 反复监听接收IP包,用recv()函数实现接收功能。3.2.5 IP包的解析解析IP包的字段有两种策略。针

17、对长度为8位、16位和32位的字段(或子 字段)时,可以利用IP-HEADER的成员直接获取。要解析长度不是 8位倍数的 字段(或子字段)时,可以利用C语言中的移位以人、及与、或操作完成。共18页 第8 页成都工业学院计算机工程系1305022班 牟黎明(2013511237)11号四、课程设计过程首先,分析任务,明确该程序需要实现的功能;然后,根据该功能画出相应 的程序流程图;其次,打开VS2012用C、C+邮言书写源代码,并且进行调试, 直到得出正确的结果,并对程序的最后运行结果进行截图; 最后,完成课程设计 报告。4.1 程序流程图如下:解析IP数据包4.2 源程序代码#include

18、"winsock2.h/windows socket(称作"套接字",用于描述IP地址和端口,是一个通信链的句柄 )的头文件 包括/#define IPPROTO_IP0/* dummy for IP */#define IPPROTO_HOPOPTS0/* IPv6 hop-by-hop options */#define IPPROTO_ICMP1/* control message protocol */#define IPPROTO_IGMP2/* internet group managementprotocol */#define IPPROTO_GG

19、P3/* gateway(deprecated) */#define IPPROTOIPV44/* IPv4 */#include "ws2tcpip.h" 与IPv6相关的一个头文件#include "iostream"#include "stdio.h"using namespacestd;#pragma comment(lib ,"ws2_32.lib")/告诉编译器在编译形成的.obj文件和.ex故件中加一条信息,使 得链接器在链接库的时候要去找 wsock32.lib这个库,不要先去找别的库。共18页 第

20、10 页/标志(前3位)分段偏移(后13位)/生命期/协议头校验和/源地址目的地址/选项定义IP头部结构typedef struct _IP_HEADER unionBYTE Version;BYTE HdrLen;BYTE ServiceType;WORD TotalLen;WORD ID;unionWORD Flags;WORD FragOff;BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;IP_HEADER;/版本(前4位)/IP头部长度(后4位)服务类型/总长度

21、/标志识成都工业学院计算机工程系1305022班 牟黎明(2013511237)11号/解析IP包的版本信息void getVersion(BYTE b, BYTE & version)version=b>>4; 右移运算/解析IP包的头部长度void getIHL(BYTE b, BYTE & result)result=(b&0x0f)*4;/解析IP包的服务类型char * parseServiceType_getProcedenceBYTE b)switch(b>>5)/ ">代表右移运算符例如:14 >> 2

22、的值为3,因为14 (即二进制的00001110)向右移两位等于3 (即二进制的00000011)case7:return "Network Control"break;case6:return "Internet work Control"break;case5:return "CRITIC/ECP"break;case4:return "Flash Override"break;case3:return "Flsah"break;case2:return "Immediate&qu

23、ot;break;case1:return "Priority"break;case0:return "Routine"break;default:return "Unknow"break;/解析IP包的服务级别char * parseServiceType_getTOS(BYTE b)b=(b>>1)&0x0f;switch(b)case0:return "Normal service"break;case1:return "Minimize monetary cost"b

24、reak;case2:return "Maximize reliability"break;case4:return "Maximize throughput"break;case8:return "Minimize delay"break;case15:return "Maximize security"break;default:return "Unknow"/解析IP包的标志位void getFlags(WORD w,BYTE & DF,BYTE & MF) DF=(w&g

25、t;>14)&0x01;MF=(w>>13)&0x01;/解析IP包的分段标志位void getFragOff(WORD w,WORD & fragOff)fragOff =w&0x1fff;/解析IP包的协议类型char * getProtocol(BYTE Protocol)switch(Protocol/* 协议 */)case1:return "ICMP"case2:return "IGMP"case4:return "IP in IP"case6:return "T

26、CP"case8:return "EGP"case17:return "UDP"case41:return "IPv6"case46:return "RSVP"case89:return "OSPF"default:return "UNKNOW"/解析完毕,输出结果,从电脑中读取,并打印到屏幕 void ipparse(FILE* file,char* buffer) /IP查询,分析IP_HEADER ip=*( IP_HEADER *)buffer;fseek(

27、file,0,SEEK_END);/解析IP包的版本信息BYTE version;getVersion(ip.Version,version);fprintf( file,"版本号=%dr'n" ,version);/解析IP包的头部长度BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf( file,"报头标长=%d(BYTE)缶n" ,headerLen);/解析IP包的服务类型与等级fprintf( file,"服务类型=%s,%srn",parseServiceType_

28、getProcedence(ip.ServiceType), parseServiceType_getTOS(ip.ServiceType);/解析IP的总长度fprintf( file,"总长度=%d(BYTE)rn" ,ip.TotalLen);/解析IP包的标志符fprintf( file,"标识=%drn" ,ip.ID);/解析IP包的标志位BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,"标志 DF=%d,MF=%drn" ,DF,MF);/解析IP包的分段偏移WORD f

29、ragOff;getFragOff(ip.FragOff,fragOff);fprintf( file,"分段偏移值=%drn",fragOff);/解析IP包的生存期fprintf( file,"生存期=%d (hopes)rn",ip.TimeToLive);/解析IP包的协议类型fprintf( file,"协议=%srn",getProtocol(ip.Protocol);/解析IP包的头部校验和fprintf( file,"头校验和=0x%0xrn" ,ip.HdrChksum);/解析IP包的IP地址f

30、printf( file,"源IP地址二%srn",inet_ntoa(*(in_addr*)&ip.SrcAddr);fprintf( file,"目的IP地址二%srn",inet_ntoa(*(in_addr*)&ip.DstAddr);fprintf( file,”*rn");/以下为主函数int main() 生成一个txt文件,作为记录IP解析的数据int nRetCode = 0;FILE * file;if(file=fopen( "history.txt" ,"wb+"

31、)=NULL ) printf( "fail to open file %s"); return -1; /fopen函数(C语言书中讲到)用来打开一个文件,其调用的一般形式为:文件指针g=fopen (文件名,使用文件方式);/其中,文件指针名”必须是被说明为FILE类型的指针变量/文件名”是被打开文件的文件名;/使用文件方式”是指文件的类型和操作要求。文件名”是字符串常量或字符串数组/初始化SocketWSADATA wsData;WSAStartup(MAKEWORD (2,2),&wsData);/建立原始SocketSOCKET sock;sock=soc

32、ket(AF_INET ,SOCK_RAW ,IPPROTO_IP);/设置IP头部操作选项,flag设置为trueBOOL flag=TRUE;setsockopt(sock,IPPROTO_IP,IP_HDRINCL ,(char*)&flag, sizeof(flag);获取本地主机名char hostName128;gethostname(hostName,100);/获取本地主机IP地址hostent * pHostIP;pHostIP=gethostbyname(hostName);填充SOCKADDR_IN结构sockaddr_in addr_in;addr_in.sin

33、_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);/设置SOCK_RAW为SIO_RCVALL,接收所有的IP包DWORD dwValue=1;#define IO_RCVALL _WSAIOW (IOC_VENDOR ,1)DWORD dwBufferLen10;DWORD dwBufferInLen=1;DWO

34、RD dwBytesReturned=0;WSAIoctl(sock, IO_RCVALL ,&dwBufferInLen, sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBuff erLen),&dwBytesReturned, NULL ,NULL );#defineBUFFER_SIZE 65535监听经过本机的IP包char buffer BUFFER_SIZE;printf("请输入命令符ParsePacketf始抓包! n");char a20;gets_s(a);if(strcmp(a,&qu

35、ot;ParsePacket')=0)printf("开始解析经过本机的IP数据包,请您耐心等待,如果半天没反 应,可能为网络未连接,解析较慢:n");while(true)int size=recv(sock,buffer,BUFFER_SIZE ,0);if (size>0)ipparse(stdout,buffer);ipparse(file,buffer);printf("请选择是否继续,1:继续;2,退出。n");char b20; gets_s(b);if (strcmp(b,"1")=0) ipparse(

36、stdout,buffer);ipparse(file,buffer);elset return 0;fclose(file); 文件关闭 return 0;else(printf("您的输入有误,请退出后从新打开本程序!n");system('pause"); return nRetCode; 4.3程序运行结果4.3.1. 图为登陆界面,提示输入命令符:ParsePacket图7程序的运行方式4.3. 2.命令符输入错误后将提示你输入有误,不能进入:C:Ll sersAd mini stratorD es ktdp解析Ccniol eApplic aticrlDebu gC n soleAo.请输入命令符白P"记七开始才“包1翩罐朋出后从新打林程序14.3. 3.命令符输入正确后进入本程序进行抓包,图为截获的 IP数据包:解析:版本=4,表示版本是IPv4; 头长度=20(BYTE),表示报头字段为20 个字节;服务类型=Routine,Normal service 表示服务类型为一般服务;数据长度=15360(BYTE); 分段标志DF=0, MF=0 表示数据报可以分片,并且是 最后一个分片;分段偏移值=0表示此分片在整个数据包

温馨提示

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

评论

0/150

提交评论