winpcap捕捉网络数据包.docx |
您所在的位置:网站首页 › winpcap下载 › winpcap捕捉网络数据包.docx |
winpcap捕捉网络数据包.docx 《winpcap捕捉网络数据包.docx》由会员分享,可在线阅读,更多相关《winpcap捕捉网络数据包.docx(20页珍藏版)》请在冰豆网上搜索。 winpcap捕捉网络数据包 利用WIPCAP捕捉IP数据包分析局域网流量 1、背景知识 1.1、IP协议 IP(InternetProtocol,互联网协议)协议是TCP/IP协议族中最为核心的协议,所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。 IP协议把传输层送来的消息封装成IP数据包,并把IP数据包传递给数据链路层。 IP协议制定了统一的IP数据报格式,向传输层屏蔽了通信子网的差异,从而为消息的收发双方提供了一条透明的传输通道。 IP数据包结构如图1-1: 图1-1IP包结构 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的服务类型(typeofservice,TOS)字段和1bit的保留位,保留位必须置0。 该字段用于指示路由器如何处理该数据报。 图1-2服务类型字段结构 3bit的优先级表示数据报的重要性,共分8级,数值越大等级越高,优先级越高则表示数据报越重要(该字段值现在已被忽略)。 4bit的TOS字段分别表示: 最小时延(D)、最大吞吐量(T)、最高可靠性(R)和最小费用(C)。 每个位都有0或1两个值,但4bit中最多只能有一个位的值为1。 如果所有4bit均为0,那么就意味着是一般服务。 4.总长度 总长度域占16bit,它以字节为单位具体说明包括报头在内的整个IP数据包的总长度。 利用报头长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。 因为该字段有16bit,所以IP数据报最长可达65535字节。 尽管可以传送一个长达65535字节的IP数据报,但是大多数的链路层都要求对它进行分片,总长度不得超过最大传输单元MTU。 当数据报被分片时,该字段的值也随着变化。 5.标识 标识字段占16bit,用来唯一地标识主机发送的每一份数据报,通常每发送一份报文它的值就会加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 IGMP TCP EGP UDP IPv6 OSPF 协议域数值 1 2 6 8 17 41 89 10.头部校验和 IP头部校验和占16bit,它设置的目的是保证数据报头部的数据完整性,而不包括数据部分。 这样做的目的有两个: 一是所有将数据封装在IP数据报中的高层协议均含有覆盖整个数据的校验码,因此IP数据报没有必要再对其所承载的数据部分进行校验;二是因为每经过一个路由器,IP数据报的头部都要发生改变,而数据部分并不改变,这样,校验和只对发生改变的首部进行校验显然这不需要花费太多的处理时间。 为了减少计算校验和的开销,IP数据报头部校验和不采用CRC校验码,而是采用更简单的分段计算方法: 发送端先把检验和字段置为0,然后将头部划分为长度为16bit的比特序列,对头部中每个16bit进行二进制反码求和,结果存在检验和字段中;当收到一份IP数据报后,同样对头部中每个16bit进行二进制反码的求和。 由于接收方在计算过程中包含了发送方存在头部中的检验和,因此,如果头部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全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头部 0151631 源端口号 目的端口号 总长度 校验和 图1-3UDP数据包结构 源端口和目的端口分别代表本次UDP通信发起主机和目的主机所使用的端口号,总长度代表整个UDP数据包头和其发送数据的总长度。 校验和是针对整个数据包内容的网际校验值,提供对本数据包正确性的检查功能。 1.3、TCP协议 TCP协议是一种端对端的协议。 使用TCP没有任何广播或类似的概念。 要用TCP协议与另一台计算机通信,两台机之间必须像打电话一样连接在一起,每一端都为通话做好准备。 “流传输”(Streamdelivery)是TCP一个常用术语。 这个术语的含义是TCP协议主要用来处理数据流,可以正确处理乱序的数据包。 TCP协议甚至还允许存在丢失的或者损坏的数据包,最终它可以再次得到这些数据包。 程序员也可以在TCP流中发送非结构化数据。 TCP协议以它自己的方式缓存数据。 不过,其缓存过程对程序员和用户是透明的。 TCP数据包头的结构如图1-4所示。 TCP头部 0151631 源端口号 目的端口号 序号 确认号 头长 保留 URG ACK PSH RST SYN FIN 窗口大小 校验和(16位) 紧急指针 选项及填充 图1-4TCP数据包结构 (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(WindowsPacketCapture)是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以人类可以阅读的形式,记录了设备的信息。 该函数原型为: intpcap_findalldevs_ex(char*source, structpcap_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(constchar* source, intsnaplen, int flags, intread_timeout, structpcap_rmtauth*auth, char*errbuf ) source--指向需要打开的网络接口卡的名字,该名字可从获取网络接口设备列表中得到。 snaplen--指定了要捕捉的数据包的最大长度。 我们使用一个高出MTU最大值的值(65536)以确保可以捕捉到成个数据包。 flags--指定以何种方式打开网络接口设备并获取网络数据包。 通常我们使用混杂模式(PCAP_OPENFLAG_PROMISCUOUS)打开网络接口卡,用于捕获所有流经该网卡的数据包。 read_timeout--用以设置超时,单位是毫秒。 数据包捕获函数是pcap_next_ex(),如果这段时间内没有捕捉到数据包,该函数将返回0。 auth--在远程捕获网络数据包时使用,在编写捕获本机网络数据包的程序中,要将该值赋为NULL。 errbuf--存放错误信息的缓冲区。 调用出错时,pcap_open()函数返回NULL,成功时返回一个指向pcap_t的指针,该指针在后续调用的函数中会被使用。 3)在打开的网络接口卡上发送或捕获网络数据包 一旦打开网络接口卡,就可使用WinPcap提供的pcap_sendpacket()函数发送网络数据包,pcap_sendpacket()函数原型如下: intpcap_sendpacket(pcap_t* p, u_char*buf, intsize ) 此函数可以让应用程序发送原始数据包,而不用直接访问底层的API函数。 p--发送数据包的网络接口。 Buf--包含了待大宋的数据(包括各层网络协议的包头)。 Size—是buf的大小。 打开网络接口卡后,还可使用WinPcap提供的pcap_next_ex()函数捕获流经的网络数据包,pcap_next_ex()函数原型如下: intpcap_next_ex(pcap_t* p, structpcap_pkthdr**pkt_header, constu_char**pkt_data ) p--通过该参数指定捕获哪个接口卡上的网络数据包,该参数通常调用pcap_open()函数执行成功后的返回值。 pkt_header--该参数指向的pcap_pkthdr结构包含有所捕获的网络数据包的一些基本信息。 pkt_data--指向捕获到的网络数据包。 1.5、相关知识介绍 1.5.1、捕获IP流量的基本原理 Ethernet是目前应用广泛的进算计联网方式,它是基于总线结构,物理层是采用广播方式的。 当一台主机向另一台主机发送数据时,发送主机会包含目的主机正确地址的数据帧发送到总线上,因此同一链路上所有活跃主机的网卡都能收到该帧。 正常情况下,网卡收到传输来的数据帧后,会先检查帧头的目的地址字段,如果该地址不是本机的MAC地址,则丢弃不管,因此只有具有该地址的主机会接收这个数据帧。 但是,如果某个程序能够修改网卡的接收模式,使其成为“混杂”模式,即一台主机可以接收网络上所有的数据帧而不理会帧头的目的地址,利用这一点,可以实现捕获网络中所有的数据帧。 一个良好的数据帧捕获程序可以工作在网络环境中的底层,拦截所有正在网络上传送的数据,并且通过相应的解析处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。 1.5.2、TCP/IP分层体系结构 计算机网络实际上是按照不同的通信功能划分的层次结构,每一层功能都由特定的协议来完成。 TCP/IP协议族是当前最流行也是最成功的一套的网络协议栈,其结构自底向上分为4层,分别为主机-网络层、互联网层、传输层和应用层。 主机至网络层在TCP/IP中并没有做具体的规定。 通常情况下我们选择Ethernet网作为底层网络环境并使用常用的5层网络体系结构即物理层、数据链路层、网络层、传输层和应用层作为分层标准。 如图给出了一些常见的协议以及其所属层次。
图1-5TCP/IP常见协议及其所在层次 1.5.3、数据帧的封装与解析 当应用程序通过IP网络传送数据时,数据被送入TCP/IP协议栈中,然后从上至下逐一通过每一层,直到最后被当作一串比特流送入网络。 其中每一层收到的数据都要增加一些首部信息,这个过程被称作封装。 通过以太网传输的比特流称作帧。 在传输的另一端,当目的主机收到一个以太网数据帧时,数据就开始从协议栈由底向上逐层解析,去掉各层协议所加上的报文头部。 每层协议均要检查头部中的协议标识字段,以确定要接收数据的上层协议,最终从报文解析出应用层数据后交给应用程序处理。 封装与解析过程入图所示:
封装解析
图1-5数据的封装与解析 2、程序编译、执行和运行方式 2.1、程序开发环境 (1)操作系统: WindowsXPsp2专业版 (2)开发工具: MicrosoftVisualC++6.0,WinPcap4.0.1 (3)编译环境: MicrosoftVisualC++6.0 2.2、程序执行环境 WindowsXP,WinPcap4.0.1 2.3、程序运行方式 运行步骤如下: (1)双击IPMonitor.exe文件,打开IP包流量统计程序。 (2)选择要使用的网卡。 (3)点击“获取主机”按钮,开始搜索当前的活动主机,活动主机的IP地址则显示在下面的列表中。 (4)选择要统计流量的活动主机IP,如果不选择则会统计所有活动主机的IP包流量。 (5)输入侦听时间,点击“开始拦截”按钮,程序开始捕获流经网卡的IP数据包,同时解析捕获到的数据包。 (6)当到达侦听时间时则列出所有捕获到的数据包,包含源IP地址、目的IP地址、源端口号、目的端口号、协议类型、数据包数量。 如图2-1所示: 图2-1效果图 3、程序说明 3.1、程序设计思路 根据作业要求,使用winpcap编写程序,监控本地网络,捕获一段时间内以用户选择的主机地址为源地址或目的地址的IP数据包,并统计IP数据包的信息,列出用户选择的主机与其他主机之间不同协议类型的IP数据包的数量。 因此: 首先,要监控网络,首先要获取当前活动主机的IP,方法是向本地网络中发送Arp请求数据包,如果得到某主机的响应则该主机为当前活动主机,将该主机的IP地址添加到列表中。 然后,用户可以选择要统计流量的IP地址,捕获所有IP数据包,如果捕获的数据包的源IP地址或目的IP地址与用户选择的一样,则将该信息添加到一个链表中。 最后,将链表中的信息显示出来。 3.2、程序流程图 程序的主流程图如图3-1: 图3-1程序主流程图 捕获IP数据包流程图如图3-2: 图3-2捕获IP数据包流程图 3.3、主要数据结构 ●Ethernet帧首部: ●Arp帧 ●IP帧头 ●TCPUDP帧头 3.4、函数介绍 ●搜索活动主机用到以下函数: 1.封装ARP包的函数staticARPFramePacketARPFrame(BYTEsrcMAC[6],ULONGsrcIP,ULONGdestIP); 2.发送ARP包的函数staticvoidSendARPFrame(pcap_if_t*dev,BYTEmac[6],unsignedlonglocalIP); 3.接收ARP包的函数staticvoidReceiveARPFrame(pcap_t*networkHandle,pcap_if_t*dev); 4.获得本机IP地址的函数staticvoidGetLocalMac(char*devName,unsignedlonglocalIPAddr); 5.得到活动主机IP列表的辅助函数staticvoidAddrToHost(CListCtrl*Hostlist,CStringmessage,intindex); 6.设置接收ARP包线程与发送ARP包线程,如下图所示 图3-3线程函数设置 由于第二次作业为使用ARP协议获取局域网内活动主机物理地址,在此不做详细介绍。 ●IP流量统计 1、已混杂模式打开网卡、编译并设置过滤器代码如下图所示: 图3-4混杂模式打开网卡、设置编译过滤器代码 2.若选择网络中所有IP包和统计选定IP地址为源地址或目的地址的数据包 以选定IP包为例介绍,代码如下图所示: 图3-5使用map存储IP包信息代码 3显示统计结果,代码如下图所示: 图3-7显示统计结果代码 4返回IP包协议类型的辅助函数 图3-8返回IP包协议类型代码 4、遇到的问题及解决办法 4.1、监听时间的控制 题目要求提供一个计时器,让用户输入需要监控的时间,让捕获线程在点击开始捕获若干秒后结束,那么,如何设定这个时间? 程序设置clock_tbeginTime,endTime;在用户点击“开始拦截”按钮时,记录下一个时间,beginTime=clock();每次捕获IP包之后记录endTime=clock();并判断(endTime-beginTime)/1000是否超过用户填写的侦听时间,若超过则退出捕获包的循环。 4.2、端口号的获得 题目要求显示捕获包的源端口号和目的端口号,而可知TCP和UDP封装在IP包里,由此可由一下代码得到TCP和UDP的头,从而从里面提取端口号,进行显示。 ipHead=(IPHead*)(pktdata+14); tcpUdpHead=(TCPUDPHead*)(pktdata+14+20); tcpUdpHead->DestPort即为端口号。 5、参考资料 1、《计算机网络课程设计》吴功宜胡晓英张仁何云王宁 2、《计算机网络》吴功宜清华大学出版社 3、《计算机网络高级软件编程技术》吴功宜董大凡清华大学出版社 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |