您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 大作业2IP包的截获和解析
1IP包的截获和解析实验报告Q1201012刘倩君一.实验目的:设计一个能够截获并解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而IP层的工作原理有更好的理解和认识。二.实验要求:本实验的目标是捕获网络中数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件.程序的具体要求如下:1、能够捕获以太网数据帧,并且能够解析:数据包类型,数据包长度,源、目的MAC,2、如果是IP数据包,则进行进一步解析。输出版本,头长度,服务类型,数据包总长度,数据包标识,分段标志,分段偏移值,生存时间,上层协议类型,头校验和,源IP地址和目的IP地址等内容.3、在指定的日志文件中写入网卡、时间、数据包解析结果等内容。当程序接收到键盘输入Ctrl+C时退出.三.主要数据结构各种包头部、IP地址等的结构体定义在Header.h中。1、以太网帧格式因此,以太网帧头部的数据结构定义为:typedefstructtagDLCHeader/*以太网数据帧头部结构*/{u_charDesMAC[6];/*destinationHWaddrress*/u_charSrcMAC[6];/*sourceHWaddresss*/u_charEthertype;/*ethernettype*/}DLCHEADER;22、IP数据报格式04816192431版本报头标长服务类型总长度标识标志片偏移生存时间协议头校验和源IP地址目的IP地址选项填充域数据部分IP数据包的第一个字段是版本字段,其度是4位,表示所使用的IP协议的版本。本程序主要针对版本是IPV4的数据包的解析。报头标长字段为4位,它定义了以4B为一个单位的IP包的报文长度.报头中除了选项字段和填充域字段外,其他各字段是定长的。因此,IP数据包的头长度在20—40B之间,是可变的。服务类型字段共8位,用于指示路由器如何处理该数据包。总长度字段为2B,它定义了以字节为单位的数据包的总长度,IP数据包的最大长度为65535B。标识字段的长度为16位,用于识别IP数据包的编号,每批数据都要有一个标识值,用于让目的主机判断新来的数据属于哪个分组。标志字段共3位,最高位是0.禁止分片标志DF(donotfragment)字段的值若为1,表示不能对数据包分片;若DF值为0,则表明可以分片。分片标志MF(morefragment)的值为1,表示接收到的不是最后一个分片;若MF值为0,表示接收到的是最后一个分片。片偏移字段共13位,说明分片在整个数据包中的相对位置,片偏移值是以8B为单位来记数的,因此选择的分片长度应该是8B的整数倍。生存时间(TTL)字段为8位,用来设置数据包在互联网络的传输过程的寿命,通常是用一个数据包可以经过的最多的路由器跳步数来限定的。协议字段为8位,表示使用此IP数据包的高层协议类型,常用的协议号如下表所示.序号协议名称序号协议名称12468ICMPIGMPIPinIPTCPEGP17414689UDPIPV6RSVPOSPFA头校验和字段为16位,用于存放检查报头错误的校验码,检验的范围是整个IP包的3报头。校验和为0,说明数据报报头没有出错。地址字段包括源地址和目的地址。源地址和目的地址的长度都是32位,分别表示发送数据包的源主机和目的主机的IP地址。选项字段的长度范围为0~40B,主要用于控制和测试。在使用选项字段的过程中,有可能出现报头部分的长度不是32位的整数倍的情况。如果出现这种情况,就需要通过填充位来凑齐。因此,IP数据报的头部定义如下:typedefstructip_header{u_charver_ihl;//4bit的版本信息+4bits的头长u_chartos;//TOS类型u_shorttlen;//总长度u_shortidentification;//Identificationu_shortflags_fo;//Flags(3bits)+Fragmentoffset(13bits)u_charttl;//生存期u_charproto;//后面的协议信息u_shortcrc;//校验和ip_addresssaddr;//源IPip_addressdaddr;//目的IPip_addressselection;//选项}ip_header;3、各类报头TCP/UDP/ICMP/IP结构当我们使用RawSocket的时候,可以完全自定义IP包,一切形式的包都可以制造出来。因此,本文事先必须对TCP/IP所涉及IP包结构进行必要的交待。目前,IPv4的报头结构为常用的ICMP报文包括ECHO-REQUEST(响应请求消息)、ECHO-REPLY(响应应答消息)、DestinationUnreachable(目标不可到达消息)、TimeExceeded(超时消息)、ParameterProblems(参数错误消息)、SourceQuenchs(源抑制消息)、Redirects(重定向消息)、Timestamps(时间戳消息)、TimestampReplies(时间戳响应消息)、AddressMasks(地址掩码请求消息)、AddressMaskReplies(地址掩码响应消息)等,是Internet上十分重要的消息。后面章节中所涉及到的ping命令、ICMP拒绝服务攻击、路由欺骗都与ICMP协议息息相关。TCP报头结构为:4对应数据结构:typedefstructpsd_hdr//定义TCP伪报头{unsignedlongsaddr;//源地址unsignedlongdaddr;//目的地址charmbz;charptcl;//协议类型unsignedshorttcpl;//TCP长度}PSD_HEADER;typedefstruct_tcphdr//定义TCP报头{unsignedshortth_sport;//16位源端口unsignedshortth_dport;//16位目的端口unsignedintth_seq;//32位序列号unsignedintth_ack;//32位确认号unsignedcharth_lenres;//4位首部长度/4位保留字unsignedcharth_flag;//6位标志位unsignedshortth_win;//16位窗口大小unsignedshortth_sum;//16位校验和unsignedshortth_urp;//16位紧急数据偏移量}TCP_HEADER;UDP报头为:对应的数据结构为:typedefstruct_udphdr//定义UDP报头{unsignedshortuh_sport;//16位源端口unsignedshortuh_dport;//16位目的端口unsignedshortuh_len;//16位长度unsignedshortuh_sum;//16位校验和}UDP_HEADER;ICMP协议是网络层中一个非常重要的协议,其全称为InternetControlMessageProtocol(因特网控制报文协议),ICMP协议弥补了IP的缺限,它使用IP协议进行信息传递,向数据包中的源端节点提供发生在网络层的错误信息反馈。ICMP报头为:常用的回送与或回送响应ICMP消息对应数据结构为:typedefstruct_icmphdr//定义ICMP报头(回送与或回送响应)5{unsignedchari_type;//8位类型unsignedchari_code;//8位代码unsignedshorti_cksum;//16位校验和unsignedshorti_id;//识别号(一般用进程号作为识别号)unsignedshorti_seq;//报文序列号unsignedinttimestamp;//时间戳}ICMP_HEADER;四.程序设计分析为了获取网络中的IP数据包,必须对网卡进行编程,在这里我们觊觎winpcap提供的库函数进行编程。但是,在通常情况下,网络通信只能响应与自己硬件地址相匹配的数据包或是以广播形式出发的数据包。对于其他形式的数据包,如已到达网络接口但却不是发送到此地址的数据包,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。我们要想获取流经网络设备的所有数据包,就需要将网卡设置为混杂模式。1、获取所有存在的网络设备的链表。Pcap_if_t*alldevs;//网络设备结构链表Charerrbuf[PCAP_ERRBUF_SIZE];//错误信息/*所有网络设备的信息以链表形式存在alldevs中*/pcap_findalldevs(&alldevs,errbuf);2、从链表中选择物理Ethernet卡后,用混杂模式打开。if((adhandle=pcap_open_live(d-name,//设备名称65536,//portionofthepackettocapture.1,//采用混杂模式1000,//读超时为1秒errbuf//errorbuffer))==NULL){fprintf(stderr,\nUnabletoopentheadapter.%sisnotsupportedbyWinPcap\n);pcap_freealldevs(alldevs);return-1;}在这个函数中,第一个参数为要打开的设备名称,这里是Ethernet卡,可以从设备链表alldevs中选出。第二个参数应为捕获的数据包长度,填入65535以保证在链路层的整个数据包都被捕获。第三个参数为打开模式,填入1表明用混杂模式打开网卡。最后两个参数本别为读入超时的时间和保存错误信息。最后返回一个网卡描述符adhandle.3、捕获数据包。6res=pcap_next_ex(adhandle,&header,&pkt_data))adhandle是由pcap_open_live()返回的所打开网卡的指,header是pcap_pkthdr型的结构体,存储时间,包的长度,pkt_data存储数据包的内容,为一个char型数组。返回值res等于1时成功;等于0时超时;等于-1时说明发生错误。对于捕获的数据包,去掉数据链路层的14B的头部后才是真正的IP包信息。5.参考程序流程图7五.结果分析1、选择网卡2.捕获的IP数据包********************************************************************数据包5抓包信息:时间:10:03:32编号:751530数据包长度:67捕获的数据包长度:67DLC帧分析:MAC地址:00000052506a-000000525064以太网协议类型:0x0800(IP包)IP报头分析:IP42005323213不分01UDP2b65192.168.146.1-224.0.0.252UDP报头分析:端口:eb-b821报文长:46409校验和:96根据IP报头结构:IP协议的版本号|包头长度|服务类型|总长|ID|Flag|片偏移|生存时间|协议类型|包头校验和|源IP|目的IP|可以知道这个IP数据报是从192.168.146.1(本机)发给224.0.0.252(默认网关)的,包头长度为20字节,总长度为53字节,不分片,片偏移为0,生存时间为1,协议类型为UDP,包头校验和为2b65。还可以进一步对封装的UDP数据报进行分析。83.捕获的其他数据包*****************************************************************************数据包2抓包信息:时间:10:03:32编号:750418数据包长度:87捕获的数据包长度:87DLC帧分析:MAC地址:000000524f3a-000000524f34以太网上协议类型:34304未知包丢弃*****************************************************
本文标题:大作业2IP包的截获和解析
链接地址:https://www.777doc.com/doc-2506013 .html