winpcap捕捉网络数据包

2020-06-03 14:49

利用WIPCAP捕捉IP数据包分析局域网流量

1、背景知识

1.1、IP协议

IP(Internet Protocol,互联网协议)协议是TCP/IP协议族中最为核心的协议,所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。IP协议把传输层送来的消息封装成IP数据包,并把IP数据包传递给数据链路层。IP协议制定了统一的IP数据报格式,向传输层屏蔽了通信子网的差异,从而为消息的收发双方提供了一条透明的传输通道。

IP数据包结构如图1-1:

图1-1 IP包结构

1. 版本

IP数据报的第一个域是版本域,其长度为4bit,表示所使用的IP协议的版本。通信双方使用的IP协议的版本必须一致。版本域值为4则表示IPv4;版本域值为6则表示IPv6。当前的版本为IPv4。

2. 报头长度

报头长度域长度为4bit,它以4个字节为计算单位表示报头的长度,该长度不包含数据部分。报头中除了IP选项域与填充域之外,其他各项是定长的。因为很少使用IP选项功能,所以,该域的值一般为5,意味着报头的长度是5个4字节,也就是20个字节。

协议规定:IP数据报的报头长度必须是4字节的整数倍。当IP报头长度不是4字节的整数倍时,必须利用最后一个填充域“添0”来加以填充。

3. 服务类型

如图1-2所示,该字段占8bit,包括3bit的优先级字段,4bit的服务类型(type of service,TOS)字段和1bit的保留位,保留位必须置0。该字段用于指示路由器如何处理该数据报。

图1-2 服务类型字段结构

3bit的优先级表示数据报的重要性,共分8级,数值越大等级越高,优先级越高则表示数据报越重要(该字段值现在已被忽略)。

4bit的TOS字段分别表示:最小时延(D)、最大吞吐量(T)、最高可靠性(R)和最小费用(C)。每个位都有0或1两个值,但4bit中最多只能有一个位的值为1。如果所有4 bit均为0,那么就意味着是一般服务。

4. 总长度

总长度域占16 bit,它以字节为单位具体说明包括报头在内的整个IP数据包的总长度。利用报头长度字段和总长度字段,就可以知道I P数据报中数据内容的起始位置和长度。因为该字段有16 bit,所以IP数据报最长可达65535字节。尽管可以传送一个长达65535字节的IP数据报,但是大多数的链路层都要求对它进行分片,总长度不得超过最大传输单元MTU。当数据报被分片时,该字段的值也随着变化。

5. 标识

标识字段占16 bit,用来唯一地标识主机发送的每一份数据报,通常每发送一份报文它的值就会加1。当IP数据报必须进行分片时,这个标识域的值将被复制到所有数据报分片的标识域中。相同的标识域值使各数据报分片最后能正确地重装为原来的数据报。

6. 标志

标志字段占3bit,第一bit保留并总设为0;第二bit 是禁止分片标志DF,标识报文能否被分片,如果该位为0,说明数据报可以被分片,如果等于1,表示不允许被分片;第三bit是分片标志MF,只有在DF为0时该字段才有意义,用以标识此报文是否是这系列分片的最后一个,0表示接收到的是最后一个分片。

7. 片偏移

片偏移量表示该分片在整个数据报中的原来数据报中的相对位置。片偏移以8B为偏移单位,因此选择的分片长度应该是8B的整数倍。

8. 生存时间(TTL)

生存时间TTL(time-to-live)字段占8bit,它设置了数据报可以经过的最多路由器数。TTL的初始值由源主机设置,一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。设置生存时间是为了避免无法发送的数据报永远在互联网上流动。

9. 协议类型

该字段占8bit,指出此IP数据报的高层协议类型,以便目的主机的IP层将数据部分上交给哪个高层协议处理。许多高层协议的数据能够被封装到IP数据报中,如TCP、UDP和ICMP等。常用的协议号如表1-1所示。该字段是本程序要求输出的信息之一。

表1-1 常用的高层协议与其协议域值的对应关系

高层协议类型 协议域数值 ICMP 1 IGMP 2 TCP 6 EGP 8 UDP 17 IPv6 41 OSPF 89 10. 头部校验和 IP头部校验和占16 bit,它设置的目的是保证数据报头部的数据完整性,而不包括数据部分。这样做的目的有两个:一是所有将数据封装在IP数据报中的高层协议均含有覆盖整个数据的校验码,因此IP数据报没有必要再对其所承载的数据部分进行校验;二是因为每经过一个路由器,IP数据报的头部都要发生改变,而数据部分并不改变,这样,校验和只对发生改变的首部进行校验显然这不需要花费太多的处理时间。

为了减少计算校验和的开销,IP数据报头部校验和不采用CRC校验码,而是采用更简单的分段计算方法:发送端先把检验和字段置为0,然后将头部划分为长度为16 bit的比特序列,对头部中每个16 bit进行二进制反码求和,结果存在检验和字段中;当收到一份IP数据报后,同样对头部中每个16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在头部中的检验和,因此,如果头部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。

11. 源IP地址

源IP地址是32bit,表示发送数据报的源主机的IP地址。在IP数据报从源主机发送到目的主机的过程中,这个域的值必须保持不变。该字段是本程序要求输出的信息之一。

12. 目的IP地址

目的IP地址也是32bit,表示接收数据报的目的主机的IP地址。同样地,在IP数据报从源主机发送到目的主机的过程中,这个域的值也必须保持不变。该字段也是本程序要求输出的信息之一。

13. 选项域

选项预的长度范围为0~40B,主要用于支持纠错、测量及安全等措施。在使用选项字段的过程中,有可能出现报头部分的长度不是4B的整数倍。如果出现这种情况,就需要通过增加全0的填充域凑齐。

1.2、UDP协议

UDP协议是一种无连接,不可靠的简单通信协议,所以其报头结构也较为简单。UDP数据包报头结构如图1-3所示。 UDP头部

0 15 16 31 源端口号 总长度 目的端口号 校验和 图1-3 UDP数据包结构

源端口和目的端口分别代表本次UDP通信发起主机和目的主机所使用的端口号,总长度代表整个UDP数据包头和其发送数据的总长度。校验和是针对整个数据包内容的网际校验值,提供对本数据包正确性的检查功能。

1.3、TCP协议

TCP协议是一种端对端的协议。使用TCP没有任何广播或类似的概念。要用TCP协议与另一台计算机通信,两台机之间必须像打电话一样连接在一起,每一端都为通话做好准备。“流传输”(Stream delivery)是TCP一个常用术语。这个术语的含义是TCP协议主要用来处理数据流,可以正确处理乱序的数据包。TCP协议甚至还允许存在丢失的或者损坏的数据包,最终它可以再次得到这些数据包。程序员也可以在TCP流中发送非结构化数据。TCP协议以它自己的方式缓存数据。不过,其缓存过程对程序员和用户是透明的。TCP数据包头的结构如图1-4所示。

TCP头部 0 15 16 31 源端口号 序号 确认号 头长 保留 URG ACK PSH RST SYN FIN 目的端口号 窗口大小 紧急指针 校验和(16位) 选项及填充 图1-4 TCP数据包结构

(1) 源端口号和目的端口号:分别代表本次TCP通信发起主机和目的主机所使用的端口号;

(2) 序列号:由于TCP协议是面向数据流的,它所传递的报文可以被视为持续的数据流,所以可以按照数据流中的先后顺序给每个字节编号,本序列号就是该数据包中传递的第一个数据字节的编号;

(3) 确认号:表示接收端希望接收的下一个TCP包第一个字节的编号,与发送端的序列号对应;

(4) 报头长度:TCP数据包头部长度,其范围在5-15之间,所以TCP包头最长可达60B(长度单位为ULONG);

(5) 保留:无实际用途,置为零;

(6) 控制字段:包括SYN、ACK、PSH、RST、URG、FIN,其中SYN表示同步信息,用来建立一个新的TCP连接,ACK表示确认,只有当该位置位时,确认号有效,PSH表示希望协议栈尽快向上层传递数据,RST表示Reset,即强制切断连接,URG表示需要紧急处理的数据存在,FIN代表连接正常终止,用来结束现有TCP连接;

(7) 窗口大小:表示当前滑动窗口大小,具体介绍参见滑动窗口协议模拟一章。

(8) 校验和:数据报的网际校验值,提供错误发现功能;

(9) 紧急指针:代表紧急数据在数据包中的位置,在URG置位时有效;

1.4、Winpcap开发包

1.2.1、Winpcap简介

WinPcap(Windows Packet Capture)是Windows平台下一个免费,公共的网络访问系统。开发WinPcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:

捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;

在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;

在网络上发送原始的数据报; 收集网络通信过程中的统计信息。

WinPcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报。也就是说,WinPcap不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。因此,它不能用于QoS调度程序或个人防火墙。

使用基于WinPcap开发包开发的程序要在电脑上运行需要首先在电脑上安装WinPcap相关的驱动程序。

本次作业使用WinPcap实现的主要功能有:查询网络适配器信息,发送ARP数据包和侦听ARP应答以及IP流量监控。

1.2.2、Winpcap 工作流程

1)获取网络设备列表

通常, 一个基于WinPcap的应用程序所要做的第一件事, 就是获得适合的网络接口的列表。获取该列表可调用pcap_findalldevs_ex()函数: 这个函数返回一个pcap_if结构的列表, 每个元素都记录了一个接口的信息。 其中, name和description以人类可以阅读的形式, 记录了设备的信息。该函数原型为: int pcap_findalldevs_ex( char* source,

struct pcap_rmtauth * auth, pcap_if_t ** alldevs, char * errbuf )

当pcap_findalldevs_ex()返回成功后,alldevs参数指向获取的网络接口列表的第一个元素。

2)利用WinPcap的pcap_findalldevs_ex()函数获取本机网络接口列表和每个网络接口IP地址。

打开网络接口得到网络设备列表之后,就可以选择感兴趣的网络接口卡并对其上的网络流量进行监听。在监听前需要将其打开,可使用WinPcap提供的pcap_open()函数,pcap_open()函数原型如下:

pcap_t* pcap_open(const char * source,

int snaplen,


winpcap捕捉网络数据包.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:XX公司CATIA竟赛选拔题(含答案)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: