winpcap捕捉网络数据包
WinPcap编程

Packet.dll应用步骤
2) 打开指定的网卡 lpAdapter = PacketOpenAdapter(AdapterList [0 ]) ; if ( ! lpAdapter | | (lpAdapter - > hFile = = INVALID_HANDLE_VALUE) ) { dwErrorCode = GetLastError() ; sprintf ( szErr ,″Unable to open the adapter ,error code : %lx″, dwErrorCode) ; AfxMessageBox(szErr) ; return FALSE; }
1> LPPACKET PacketAllocatePacket(void) 如果运行成功,返回一个_PACKET结构的指针, 否则返回NULL。成功返回的结果将会传送到 PacketReceivePacket()函数,接收来自驱动的网络 数据报。 2> VOID PacketFreePacket(LPPACKET lpPacket) 释放参数提供的_PACKET结构。 3> VOID PacketCloseAdapter(LPADAPTER lpAdapter) 关闭参数中提供的网络适配器,释放相关的 ADAPTER结构。
WinPcap
WinPcap包括三个部分 第一个模块:内核级的包过滤驱动程序
NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件, 是架构的核心(在Win95/98 中是一个VXD文件,在NT/2000 中是 一个SYS 文件) ,它的主要功能是过滤数据包,在包上附加时间戳、 数据包长度等信息。
第二个模块:低级动态链接库packet.dll,在Win32 平台 上提供了与NPF 的一个通用接口。 packet.dll数据包驱 动程序库是与libpcap 相兼容的一组用户级的函数库。 第三个模块:用户级的Wpcap.dll。通过调用packet.dll 提供的函数生成,它包括了过滤器生成等一系列可以被 用户级调用的高级函数,另外还有诸如数据包统计及发 送功能。
基于WinPcap包捕获算法的实现

winpcap分析

4.3.2 4.3.3 4.4 4.4.1 4.4.2
结构图............................................................................................................... 25 源码分析............................................................................................................29 系统特色............................................................................................................46 分布式网络监听 .................................................................................................46 简单网络管理.................................................................................................... 46
第 5 章 系统测试与使用说明书 ......................................................................................47 5.1 5.1.1 5.1.2 5.1.2 5.1.3 5.2 5.3 结论 致谢: 系统测试............................................................................................................47 监听功能............................................................................................................47 显示功能............................................................................................................48 管理功能............................................................................................................51 连接功能............................................................................................................52 工具软件的配置 .................................................................................................54 监听工具的使用 .................................................................................................55 .....................................................................................................................56 .....................................................................................................................61
winpcap编程解析数据包

winpcap编程解析数据包WinPcap和Libpcap的最强⼤的特性之⼀,是拥有过滤数据包的引擎。
它提供了有效的⽅法去获取⽹络中的某些数据包,这也是WinPcap捕获机制中的⼀个组成部分。
⽤来过滤数据包的函数是和。
它将⼀个⾼层的布尔过滤表达式编译成⼀个能够被过滤引擎所解释的低层的字节码。
有关布尔过滤表达式的语法可以参见这⼀节的内容。
将⼀个过滤器与内核捕获会话向关联。
当被调⽤时,这个过滤器将被应⽤到来⾃⽹络的所有数据包,并且,所有的符合要求的数据包 (即那些经过过滤器以后,布尔表达式为真的包) ,将会⽴即复制给应⽤程序。
现在,我们可以捕捉并过滤⽹络流量了,那就让我们学以致⽤,来做⼀个简单使⽤的程序吧。
在本讲中,我们将会利⽤上⼀讲的⼀些代码,来建⽴⼀个更实⽤的程序。
本程序的主要⽬标是展⽰如何解析所捕获的数据包的协议⾸部。
这个程序可以称为UDPdump,打印⼀些⽹络上传输的UDP数据的信息。
我们选择分析和现实UDP协议⽽不是TCP等其它协议,是因为它⽐其它的协议更简单,作为⼀个⼊门程序范例,是很不错的选择。
让我们看看代码:[cpp]01. #include "pcap.h"02.03. /* 4字节的IP地址 */04. typedef struct ip_address{05. u_char byte1;06. u_char byte2;07. u_char byte3;08. u_char byte4;09. }ip_address;10.11. /* IPv4 ⾸部 */12. typedef struct ip_header{13. u_char ver_ihl; // 版本 (4 bits) + ⾸部长度 (4 bits)14. u_char tos; // 服务类型(Type of service)15. u_short tlen; // 总长(Total length)16. u_short identification; // 标识(Identification)17. u_short flags_fo; // 标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits)18. u_char ttl; // 存活时间(Time to live)19. u_char proto; // 协议(Protocol)20. u_short crc; // ⾸部校验和(Header checksum)21. ip_address saddr; // 源地址(Source address)22. ip_address daddr; // ⽬的地址(Destination address)23. u_int op_pad; // 选项与填充(Option + Padding)24. }ip_header;25.26. /* UDP ⾸部*/27. typedef struct udp_header{28. u_short sport; // 源端⼝(Source port)29. u_short dport; // ⽬的端⼝(Destination port)30. u_short len; // UDP数据包长度(Datagram length)31. u_short crc; // 校验和(Checksum)32. }udp_header;33.34. /* 回调函数原型 */35. void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);36.37.38. int main()39. {40. pcap_if_t *alldevs;41. pcap_if_t *d;42. int inum;43. int i=0;44. pcap_t *adhandle;45. char errbuf[PCAP_ERRBUF_SIZE];46. u_int netmask;47. char packet_filter[] = "ip and udp";48. struct bpf_program fcode;49.50. /* 获得设备列表 */51. if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)52. {53. fprintf(stderr,"Error in pcap_findalldevs: %s/n", errbuf);54. exit(1);55. }55. }56.57. /* 打印列表 */58. for(d=alldevs; d; d=d->next)59. {60. printf("%d. %s", ++i, d->name);61. if (d->description)62. printf(" (%s)/n", d->description);63. else64. printf(" (No description available)/n");65. }66.67. if(i==0)68. {69. printf("/nNo interfaces found! Make sure WinPcap is installed./n");70. return -1;71. }72.73. printf("Enter the interface number (1-%d):",i);74. scanf("%d", &inum);75.76. if(inum < 1 || inum > i)77. {78. printf("/nInterface number out of range./n");79. /* 释放设备列表 */80. pcap_freealldevs(alldevs);81. return -1;82. }83.84. /* 跳转到已选设备 */85. for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);86.87. /* 打开适配器 */88. if ( (adhandle= pcap_open(d->name, // 设备名89. 65536, // 要捕捉的数据包的部分90. // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容91. PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式92. 1000, // 读取超时时间93. NULL, // 远程机器验证94. errbuf // 错误缓冲池95. ) ) == NULL)96. {97. fprintf(stderr,"/nUnable to open the adapter. %s is not supported by WinPcap/n");98. /* 释放设备列表 */99. pcap_freealldevs(alldevs);100. return -1;101. }102.103. /* 检查数据链路层,为了简单,我们只考虑以太⽹ */104. if(pcap_datalink(adhandle) != DLT_EN10MB)105. {106. fprintf(stderr,"/nThis program works only on Ethernet networks./n");107. /* 释放设备列表 */108. pcap_freealldevs(alldevs);109. return -1;110. }111.112. if(d->addresses != NULL)113. /* 获得接⼝第⼀个地址的掩码 */114. netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr; 115. else116. /* 如果接⼝没有地址,那么我们假设⼀个C类的掩码 */117. netmask=0xffffff;118.119.120. //编译过滤器121. if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 )122. {123. fprintf(stderr,"/nUnable to compile the packet filter. Check the syntax./n");124. /* 释放设备列表 */125. pcap_freealldevs(alldevs);126. return -1;127. }128.129. //设置过滤器130. if (pcap_setfilter(adhandle, &fcode)<0)131. {132. fprintf(stderr,"/nError setting the filter./n");133. /* 释放设备列表 */134. pcap_freealldevs(alldevs);135. return -1;136. }137.138. printf("/nlistening on %s.../n", d->description);139.140. /* 释放设备列表 */141. pcap_freealldevs(alldevs);142.143. /* 开始捕捉 */144. pcap_loop(adhandle, 0, packet_handler, NULL);145.146. return 0;147. }148.149. /* 回调函数,当收到每⼀个数据包时会被libpcap所调⽤ */150. void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) 151. {152. struct tm *ltime;153. char timestr[16];154. ip_header *ih;155. udp_header *uh;156. u_int ip_len;157. u_short sport,dport;158. time_t local_tv_sec;159.160. /* 将时间戳转换成可识别的格式 */161. local_tv_sec = header->_sec;162. ltime=localtime(&local_tv_sec);163. strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);164.165. /* 打印数据包的时间戳和长度 */166. printf("%s.%.6d len:%d ", timestr, header->_usec, header->len);167.168. /* 获得IP数据包头部的位置 */169. ih = (ip_header *) (pkt_data +170. 14); //以太⽹头部长度171.172. /* 获得UDP⾸部的位置 */173. ip_len = (ih->ver_ihl & 0xf) * 4;174. uh = (udp_header *) ((u_char*)ih + ip_len);175.176. /* 将⽹络字节序列转换成主机字节序列 */177. sport = ntohs( uh->sport );178. dport = ntohs( uh->dport );179.180. /* 打印IP地址和UDP端⼝ */181. printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d/n",182. ih->saddr.byte1,183. ih->saddr.byte2,184. ih->saddr.byte3,185. ih->saddr.byte4,186. sport,187. ih->daddr.byte1,188. ih->daddr.byte2,189. ih->daddr.byte3,190. ih->daddr.byte4,191. dport);192. }。
winpcap的简介

WinPcap的简介winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
它提供了以下的各项功能:1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;3> 在网络上发送原始的数据报;4> 收集网络通信过程中的统计信息。
winpcap的主要功能在于独立于主机协议(如TCP/IP)而发送和接收原始数据报。
也就是说,winpcap 不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。
因此,它不能用于QoS调度程序或个人防火墙。
目前,winpcap开发的主要对象是windows NT/2000/XP,这主要是因为在使用winpcap的用户中只有一小部分是仅使用windows 95/98/Me,并且微软也已经放弃了对win9x 的开发。
因此本文相关的程序T-ARP也是面向NT/2000/XP用户的。
WinPcap的安装和例程调试By 曹佳caojia@1.DownLoad2.安装解压得三文件:WinPcap_4_0_1_drivel.exe,WpcapSrc_4_0_1_Source_code.zip和WpdPack_4_0_1_Include_Lib.zip,第一个是驱动的安装程序,第二个是驱动的源代码,第三个是使用Winpcap所要用到的所有.h文件和.lib文件。
1)安装驱动(WinPcap_4_0_1_drivel.exe)2)WpdPack_4_0_1_Include_Lib.zip解压到一个“正式的”位置(用来配置编程环境)3)配置VC6.0环境在Tools->options->Directories里面加入解压以后的include文件夹,在Tools->options->Directories的lib里面加入解压以后的lib文件夹。
WINPCAP编程环境设置

因为项目需要,而且以前从没用过Winpcap,所以不得不从头学起。
以前虽然看过winsocket,但是,Winpcap的第一个程序,我花了很长时间才编译通过。
对于初学者来说,不太好做的可能是编译程序之前应该做什么事。
我就大体说一下我的过程。
首先先大体介绍下Winpcap。
winpcap(windows packet capture)windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
它提供了以下的各项功能:1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;2> 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;3> 在网络上发送原始的数据包;4> 收集网络通信过程中的统计信息。
具体介绍参见/view/696423.htm这里有Winpcap的详细介绍。
下面说一下你在编译Winpcap之前要做的事情。
1 下载Winpcap安装包,地址/install/default.htm。
2 然后到/devel.htm下载WinPcap developer's pack包,解压,里面有配置好的例子和include library。
3 在VC6.0菜单中,点Tolls->Options->Directories中的include files 和library files中添加包里面的include和library。
然后我们就来编写一个最简单的Winpcap程序——获取已连接的网络适配器列表。
首先新建一个工程,选择Win32 Console Application,工程名我们设为winpcap.然后这这个工程中新建一个C++源文件,名字winpcap。
在里面填写如下代码:#include <pcap.h>main( )pcap_if_t *alldevs;pcap_if_t *d;int i=0;char errbuf[PCAP_ERRBUF_SIZE];if (pcap_findalldevs(&alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf); exit(1);}for(d= alldevs; d != NULL; d= d->next){printf("%d. %s", ++i, d->name);if (d->description)printf(" (%s)\n", d->description);elseprintf(" (No description available)\n");}if (i == 0){printf("\nNo interfaces found! Make sure WinPcap is installed.\n");return -1;}pcap_freealldevs(alldevs);return 0;}运行之前我们要手动给它添加一个动态链接库wpcap.lib,方法是在菜单Project中点Settings,然后在选项中选Link,在library modules 后面填上wpcap.lib,注意和前面的要有空格隔开。
使用Winpcap开发网络数据包分析器
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
I…
…
实用第一 智慧密集
使 用 Wip a n cp开发 网络数据包分析器
江 洪
摘 要 :使 用 W ip a n cp开 发 包 实现 了一 个 网 络 数 据 包 分 析 器 。 该 分 析 器 可 以 捕 获 UDP或 T P数 C
据 包,并对数 据 包头进 行 分析。
表 3 I 头 结构 表 P
名称 版本 号 长度 4位 4表 示这 是 IV4 . P 说明
表 4和表 5所 示 。
协议 。数 据包 是 进 行 网 络数 据 通 信 的基 本 单 位 。每块 数据 都 包
含 在 数 据 包 中 。 数 据包 中 ,除 了 数据 本 身外 , 还有 数 据 包 头 。
表 2 PPP OE 结 构 表
名 称 版本 号 类型 代 码 长 度 4位 4位 8位 设为 1 设为 I 设为0 说 明
目的 端 u
U DP长度 U DP校验 和
表 5 TCP 结构 表
名称 源端 L J 长度 J 6位 说明 表示数 据 包m哪 个端 u发 出
表 1 以 太 头 结 构 表
名称 长度 说 明 k 层 议 I P校验 和 源 l 址 P地 8位 1 6位 3 2位
l ,如 该值降 为 0就 会破 抛弃
本 文H涉 及 0 H T P和 1H. P这 两种 6.C I UD 校验 I 数据 是 正确 P头 表 示数据 包是 f 哪 个 I j = { P地址 发 出的 表 示数据 包磷 发给 哪个 l 址 P地
基于WinPcap的网络分析研究与实现
基于WinPcap的网络分析研究与实现摘要近几年,我国经济发展迅速,各个领域的事业都趋于完善。
在网络信息技术的不断发展下,通过对WinPcap的应用,真正实现了Windows下网络数据包的捕获技术,下文将详细阐述IP、Tcp等等协议的解析过程。
网络数据的储存通过msspl来实现,进而建立系统硬件运行环境。
对局域网,通过测试实现了全局监控。
关键词信息技术;网络分析;分析与研究;运行环境;数据包;源代码1 应用环境网络监控系统承载介质中,硬件与软件监控系统共同构成网络监控。
网络监控系统标准功能是对局域网中的违规行为进行记录与监控。
在国外一些发达国家,有两款软件Ethereal与Sniffer,后者主要任务就是给网管及时提供网络监视情况与数据包捕以及故障分析等内容,这样能方便网管对现场进行迅速的故障处理以及诊断能力。
与此同时,还能使用户得到更好的网络管理以及故障分析功能。
前者作为一种可以捕获数据包,并且将这个数据包的信息显示出来,这样的一款网络数据包分析软件,在通用许可证的保障范围内,其数据包分析软件用户能免费得到。
除此之外,还可以得到其源代码,并且也能够根据自身的需要来将其源代码进行修改。
现阶段,Wireshark是全球应用最多的一种网络数据包分析软件[1]。
2 Win Pcap研究抓包的过程,是通过用户级的程序接口来完成的。
在这些接口中,用户程序能够利用内核驱动提供的高级特性。
作为WinPcap所提供的2个库,PACKET 提供一个底层api,应用这个库能够访问驱动的函数。
这些函数能够实现来抓包时,网络硬件与操作系统独立。
NDIS作为一种管理网络适配器的驱动程序和协议驱动之间的规范。
其还是一个可以让协议驱动发生与接收数据包并且不用看特定的适配器或者特定的Win32操作系统的封装。
捕获数据包是通过NPF来实现的。
在进行数据包的捕获时,数据包的监控任务是一个网络接口,进而应用程序才能够完整抹除这部分数据包。
基于WinPcap的数据包捕获及应用
基于WinPcap的数据包捕获及应用
张伟;王韬;潘艳辉;郝震华
【期刊名称】《计算机工程与设计》
【年(卷),期】2008(29)7
【摘要】网络数据包捕获是进行网络分析的基础,通过对Windows操作系统平台下网络数据包捕获模型的论述,重点对基于NDIS的优秀包捕获开发包WinPcap的结构和功能的进行了详细的介绍和分析,实现了如何在VC 6.0环境下借助WinPcap提供的各个接口函数对网卡进行编程进而对网络数据包进行捕获和分析的方法,最后突出叙述了数据包捕获在网络分析中的应用.
【总页数】3页(P1649-1651)
【作者】张伟;王韬;潘艳辉;郝震华
【作者单位】解放军军械工程学院计算机工程系,河北石家庄,050003;解放军军械工程学院计算机工程系,河北石家庄,050003;解放军军械工程学院计算机工程系,河北石家庄,050003;解放军军械工程学院计算机工程系,河北石家庄,050003
【正文语种】中文
【中图分类】TP393.08
【相关文献】
1.基于WinPcap的网络数据包捕获系统设计与实现 [J], 黄培花;宋科
2.基于Winpcap网络数据包的捕获与存储技术研究 [J], 李星;熊列彬;王昌
3.基于WinPcap的公安信息网络数据包捕获分析系统研究 [J], 刘传军
4.基于WinPcap网络数据包捕获实现 [J], 赵建勋
5.基于Winpcap网络数据包的捕获与存储技术研究 [J], 李星;熊列彬;王昌
因版权原因,仅展示原文概要,查看原文内容请购买。
pcap原理
pcap原理
PCAP(Packet Capture)是一种捕获代理网络数据包的技术。
它是网络编程中非常重要的一种技术,可以帮助开发人员分析、调试和研究网络协议。
PCAP通常用于抓取广域网(WAN)或局域网(LAN)上的数据包,以帮助管理员、开发人员进行网络故障诊断与分析。
在计算机网络中,数据是以数据包的形式传输的。
当一个计算机从网络上接收到数据包时,它会把数据包交给操作系统,而操作系统需要将数据包传递给应用程序,以便进行二次开发或分析。
在这个过程中,操作系统需要使用一定的技术来对数据包进行捕获和处理。
而PCAP就是一种捕获和处理网络数据包的技术。
PCAP技术基于操作系统内核层的实现来进行数据包的捕获。
在Linux中,内核中实现了一个Packet Socket接口,用于向用户程序提供数据包的捕获和发送功能。
Windows中则是使用WinPcap或Npcap等第三方库来实现PCAP功能。
PCAP技术可以捕获数据包并进行多种操作,例如过滤、深度分析等。
通过PCAP 技术,开发人员或管理员可以对数据包进行捕获和分析,以便定位网络问题,或优化网络性能。
常见的分析工具包括Wireshark等,通过这些工具的分析,可以有效的发现网络问题,快速解决故障。
总的来说,PCAP技术已经成为了一个网络开发人员不可缺少的技能。
掌握PCAP 技术可以帮助开发人员更全面地了解网络协议和通信机制,定位网络问题,提高
网络性能,同时可以提升工作效率和开发速度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用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 IGMP TCP EGP UDP IPv6 OSPF 协议域数值 1 2 6 8 17 41 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,