《计算机网络课程设计实验报告--解析IP数据包.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计实验报告--解析IP数据包.docx(12页珍藏版)》请在第一文库网上搜索。
1、计算机网络课程设计报告题目:解析IP数据包一、问题描述课题内容:本设计的目标是捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。程序的具体要求如下:1、捕获网络中的IP数据包;2、解析数据包,在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、总长度、标识、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。二、概要设计1、本程序主要由三部分构成:初始化原始套接字,反复监听捕获数据包和解析数据包。2、为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字(SOCket)编程。但是,要注意的是:通常情况下,网络通
2、信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。3、流程图如下:三、详细设计1、捕获数据包方法目前常用的捕获数据包的方法有原始套接字、1ibPCap、WinPCaP和JPCaP等方法。本次实验选用套接字方法。套接字是网络应用编程接口。应用程序可以使用它进行网络通信而不需要知道底层发生的细节。有时需要自己生成一些定制的数据包或者功能并希望绕开S
3、ocket提供的功能,原始套接字(RaWSoCket)满足了这样的要求。原始套接字能够生成自己的数据报文,包括报头和数据报本身的内容。通过原始套接字,可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。网络数据包截获机制一般指通过截获整个网络的所有信息流,根据信息源主机,目标主机,服务协议端口等信息,简单过滤掉不关心的数据,再将用户感兴趣的数据发送给更高层的应用程序进行分析。一般数据包的传输路径依次为网卡、设备驱动层、数据链路层、IP层、传输层、最后到达应用程序。IP数据包的捕获就是将经过数据链路层的以太网帧拷贝出一个备份,传送给IP数据包捕获程序进行相关的处理
4、。IP数据包的捕获程序一般由数据包捕获函数库和数据包分析器组成。数据包捕获函数库是一个独立于操作系统的标准捕获函数库。主要提供一组可用于查找网络接口名称、打开选定的网络接口、初始化、设置包过滤条件、编译过滤代码、捕获数据包等功能函数。对捕获程序而言,只需要调用数据包捕获函数库的这些函数就能获得所期望的IP数据包。这种捕获程序与数据包捕获函数库分离的机制,使得编写的程序具有很好的可移植性。IP数据包捕获程序的核心部分就是数据包分析器。数据包分析器应具有识别和理解各种协议格式(IP.TCP、UCP、ICMP协议)和帧格式的能力,并对捕获的数据进行分析和统计处理。编写数据包捕获程序的主要工作就是如何
5、实现数据包分析器的功能。2、数据包捕获与解析的程序设计首先对以太网帧头进行结构体定义,总共有以下13项内容:Version.Head1en.ServiceTypeTota11enIdentifierF1ags、FragOffsetTimeTo1iveProtoco1HeadChecksumSourceddrDestinAddrOptions0根据数据包的捕获机制,分别对以上13个内容编写捕获的C语言程序,进行一一捕获,通过开始的运行程序中运行编译程序后所得到的.exe文件,就可以看到捕获到的信息。捕获成功之后,最后将其各个信息进行解析,并写到一个文件之中。以上各个程序的编写都是在Visua1S
6、tdioC+6.0编译器中完成。3、网卡设置为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字进行编程。但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在雅投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。要想获取网络设备的所有数据包,就需要将网卡设置为混杂模式。完整程序源代码:inc1udeinc1ude#inc1ude#inc1udeinc1ude即QgmaCOmment(IibJWS2_32)指定连接到网络应用
7、和internet#defineIO_RCVA11_WSAIOW(IOC_VENDOR,1)typedefstruct_IP_HEADER定义IP头union(BYTEVersion;BYTEHdr1en;.版本(前4位)/IH1(后4位),报头标长bBYTEServiceType;WORDTbtaI1en;WORDID;union(服务类型总长标识WORDF1ags;WORDFragOff;.标志(前3位)分段偏移(后13位)hBYTETimeTo1ive;BYTEProtoco1;WORDHdrChksum;DWORDSrcAddr;DWORDDstAddr;BYTEOptions;IP_
8、HEADER;生命期协议头校验和源地址目的地址选项逐位解析IP头中的信息voidgetVersion(BYTEb,BYTE&version)version=b4;右移4位,获取版本字段)voidget1H1(BYTEb,BYTE&resu1t)resu1t=(b&0x0f)*4;获取头部长度字段)char*parseServiceType_getProcedence(BYTEb)switch(b5)获取服务类型字段中优先级子域case7:returnNetworkContro1;break;case6:returnInternetworkContro1;break;case5:returnCR
9、ITIC/ECP;break;case4:returnF1ashOverride;break;case3:returnF1sah;break;case2:returnImmediate;break;case1:returnPriority;break;case0:returnRoutine;break;defau1t:returnUnknow;break;)char*parseServiceType_getTOS(BYTEb)(b=(b1)&OxOf;获取服务类型字段中的TOS子域switch(b)(caseO:returnNorma1service;break;returnMinimizem
10、onetarycost;break;returnMaximizere1iabi1ity;break;case4:returnMaximizethroughput;break;case8:returnMinimizede1ay;break;case15:returnMaximizesecurity;break;defau1t:returnUnknow;)voidgetF1ags(WORDw,BYTE&DFzBYTE&MF)(DF=(w14)&0x01;MF=(w13)&0x01;)voidgetFragOff(WORDw,WORD&fragff)(fragOff=w&Ox1fff;)char*g
11、etProtoco1(BYTEProtoco1)(Switch(ProtocoI)(returnICMP;returnIGMP;case4:return,IPinIP;case6:returnTCP;case8:returnEGP;case17:returnUDP;case41:returnIPv6;case46:returnRSVP;case89:returnOSPF;defau1t:returnUNKNOW;)voidipparse(FI1E*fi1ezchar*buffer)(IP_HEADERip=*(IP_HEADER*)buffer;fseek(fi1e,O,SEEK_END);B
12、YTEversion;getVersion(ip.Version,version);fprintf(fi1ej版本号=%drn,version);BYTEheader1en;解析标志字段获取分段偏移字段获取协议字段共8位以下为协议号说明:通过指针把缓冲区的内容强制转化为IP,HEADER数据结构get1H1(ip.Hdr1enzHeader1en);fprintf(fi1e,报头标长=%d(BYTE)rn,header1en);fprintf(fi1e,服务类型=%s,%srn,parseServiceType_getProcedence(ip.ServiceType),parseServic
13、eType_getTOS(ip.ServiceType);fprintf(fi1e=%d(BYTE)rnJp.Tota11en);fprintf(fi1e,标识=%drn,ip.1D);BYTEDF,MF;getF1ags(ip.F1ags,DF,MF);fprintf(fi电标志DF=%MF=%drn,DFzMF);WORDfragff;getFragOff(ip.FragOffJragOff);fprintf(fi1e,“分段偏移值=%drn,fragff);fprintf(fi1e,生存期=%d(hopes)rnzip.TimeTo1ive);fprintf(fi1e,tftZ=%srn
14、,getProtoco1(ip.Protoco1);fprintf(fi1e,”头校验和=0x%0xrn”,ip.HdrChksum);fprintf(fi1e,源IPJi1t=%srn,Jnet-ntoa(*(in-addr*)8ip.SrcAddr);fprintf(fi1e,目的IP地址=%srn,ineJntOa(*(in_addr*)&ip.DstAddrj);fprintf(fi1e,-h);)Intmain()(intnRetCode=0;FI1E*fi1e;if(fi1e=fopen(history.txt,wb+)=NU11)(printf(fai1toopenfi1e%s);return-1;)WSADATAwsData;WSAStartUP(MAKEWoRD(2,2),&wsData);建立套接字SOCKETsock;SoCk=SoCket(AFNE1;SOCK_RAW,IPPRoT0P);BOO1fIag=TRUE;设置IP头操作选项,用户可对IP头处理Se