协议解析器程序winpcap
使用winpcap的主要流程

使用winpcap的主要流程1. 安装winpcap
•下载winpcap安装包
•运行安装程序
•按照提示完成安装过程
2. 创建WinPcap的应用程序
•引用WinPcap的头文件
•在应用程序中初始化WinPcap
•打开网络适配器
•设置过滤器条件
3. 捕获网络数据包
•创建一个数据包捕获句柄
•设置过滤器条件(可选)
•进入捕获循环
–清空数据包缓冲区
–捕获一个数据包
–处理捕获到的数据包
4. 处理捕获到的数据包
•解析数据包的头部信息
•进行数据包的分析和处理
•可选地将数据包写入文件或发送数据包5. 关闭数据包捕获
•关闭数据包捕获句柄
•释放资源
•结束应用程序
6. WinPcap的高级用法
•配置超时和非阻塞模式
•对多个适配器进行操作
•同时捕获多个数据流
•进行软件过滤器和内核过滤器
•设置数据包缓冲区大小
•错误处理和异常情况处理
7. 示例代码
下面是一个使用WinPcap进行数据包捕获的示例代码:
```c #include <stdio.h> #include <pcap.h>
int main() { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t handle; const u_char packet; struct pcap_pkthdr header;
// 打开网络适配器
handle = pcap_open_live(\。
基于WinPcap的网络数据解析系统

T P I ae i rdcd j dti i l h ts rsl a rsne . C /P r n oue n ea .f ay te et eu w s peetd t I nl t
Ke wo d y r s: Wi c p d t c p ue poo o nlss n a ; aa at r ; rt cl ay i P a
1引 言
计 算机 网络 的发 展 ,给 人 们 的生 活和 工 作带 来 了方
便 。但 是 ,网络 是 一把 双 刃剑 ,在 给 我们 带 来极 大 方便 的 同时 也给 我 们带 来 了很 大 的 安全 问题 。 因此 ,获 取 网 络 的数 据信 息 ,并 对之 分析 ,也是 保 障 网络 安全 的 重要
2Sho o e e/ n ltc, Wx I tu f T hog , u/ lguZ 4 2 .ha co fM c nsadE c / l h L e rs u/n / t o e noy Wx J ns I 2 c ̄) st e c l ;a 7
Ab ta t F r ovn te ewo k e ue sr c : o sli g h nt r scr
基于 WiP a n c p的网络数据解析系统
魏 敏 ,奚 茂龙 ,周 阳花
(. 1 江南大 学 物联 网工程 学院 ,江苏 无 锡 2 4 2 ;2 无锡职 业技 术学院 机 电学院 ,江苏 无锡 2 4 2 ) 1 12 . 112
摘 要 : 针对 目前的 网络安 全问题 ,设计并实现 了基于 Wncp的网络数据解 析系统 。介绍 了 Wncp i a P i a 的结构组成 ,论述 了基于 P
控编 程提供 了一个 易于 移植 的应用框 架 。
winpcap编程_适合当讲授课件

要向VC++6.0中添加一个新的包含文件所在的路径,你必 须打开Tool菜单,选择Options,然后选择Directories选项卡, 在Show directories下拉框中选择Include files,并且将新的 路径添加到Directories中去 。
二、获得设备列表
通常,编写基于WinPcap应用程序的第一件事情,就是获得已 连接的网络适配器列表。WinPcap提供了 pcap_findalldevs_ex( ) 函数来实现这个功能:
由 pcap_findalldevs_ex()返回的每一个 pcap_if 结构体, 都包含一个 pcap_addr 结构体,这个结构体由如下元素组成:
通过返回的结构,我们可以得到探测到的网卡设备的更 详尽信息。
例子:
二、打开适配器开始捕获数据包
现在,我们已经知道如何获取适配器的信息了,那我们就开始 一项更具意义的工作,打开适配器并捕获数据包。本节中,我们会 编写一个程序,将每一个通过适配器的数据包打印出来。
Sniffer,中文可以翻译为嗅探器,是一种基于被动侦听原理的网络 分析方式。使用这种技术方式,可以监视网络的状态、数据流动情况 以及网络上传输的信息。当信息以明文的形式在网络上传输时,便可 以使用网络监听的方式来进行攻击。将网络接口设置在监听模式,便 可以将网上传输的源源不断的信息截获。 wireshark(2006年之前称为Ethereal)一是全球相当行流行的开放 源代码的网络协议分析软件,功能强大而且支持平台最多,它可以实 时检测网络通讯数据,也可以检测其抓取的网络通讯数据快照文件;可 以通过图形界面浏览这些数据,可以查看网络通讯数据包中每一层的 详细内容;Wireshark还拥有许多强大的特性:包含有强显示过滤器语 言和查看TCP会话重构流的能力。它可以支持七百多种协议的解析和 多种媒体类型。
WinPcap 原理技术

WinPcap 原理技术winpcap是windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
1、网络及协议分析2、网络监控3、通信日志记录4、traffic generators5、用户级别的桥路和路由6、网络入侵检测系统(NIDS)7、网络扫描8、安全工具WinPcap导入WinPcap是一个开源的专业网络数据捕获开发包,其实,WinPcap的强大功能并不仅限于数据包的获取,主要功能:捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;在网络上发送原始的数据包;收集网络通信过程中的统计信息。
Sniffer 嗅探原理Winpcap是针对Win32平台上的抓包和网络分析的一个架构。
它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)Packet.dll提供更方便更易用的编程接口,wpcap.dll中的接口函数Sniffer嗅探器,是一种基于被动侦听原理的网络分析方式。
使用这种技术方式,可以监视网络的状态、数据流动情况以及网络上传输的信息。
当信息以明文的形式在网络上传输时,便可以使用网络监听的方式来进行攻击。
将网络接口设置在监听模式,便可以将网上传输的源源不断的信息截获。
Sniffer技术常常用于网络故障诊断、协议分析、应用性能分析和网络安全保障等各个领域。
实现Sniffer 功能函数序列第一步:获取网络设备指针pcap_findalldevs_ex()第二步:打开网卡pcap_open()第三步:检查链路层pcap_datalink()第四步:编译BPF过滤规则pcap_compile第五步:设置过滤规则pcap_setfilter第六步:注册回调函数,循环捕获数据包pcap_loop()第七步:释放网络设备列表pcap_freealldevs()第八步:关闭WinPcap会话句柄pcap_close()获取网络设备指针(查找机器的所有网络设备接口,并使用链表结构返回)打开网络设备(打开一个用来捕获或发送流量的通用源(网卡))检查链路3层类型(检查链路层类型)编译BFP过滤规则(编译数据包过滤器,将程序中高级的过滤表达式(即过滤规则字符串)转换为能被内核级的过滤引擎所处理的内容)执行过滤规则(把一个过滤器绑定到WinPcap会话句柄)注册回调函数,循环捕获数据包(循环捕获数据包并分析)释放网络设备列表(释放链表空间)关闭WinPcap会话句柄(关闭一个和p关联的文件,并释放资源)数据包分析1.数据包的分析内容数据包(Packet)是TCP/IP协议通信传输中的数据单位,TCP/IP协议是工作在OSI模型第三层(网络层)、第四层(传输层)上的,而帧是工作在第二层(数据链路层)。
winpcap驱动

winpcap驱动WinPcap驱动是一种用于Windows操作系统的网络数据包捕获和分析的工具。
它提供了一种简单和有效的方式,使用户能够捕获和分析计算机与网络之间传输的数据包。
不管是网络管理员、安全专家还是网络开发人员,WinPcap驱动都是一个强大而有用的工具。
WinPcap驱动是一个开源项目,由意大利中科院主导开发,最初是为Unix-like系统设计的。
随着Windows操作系统的普及和用户的需求,WinPcap驱动很快被移植到了Windows平台上。
它可以兼容Windows 2000和后续版本的操作系统。
WinPcap驱动的主要功能是对计算机和网络之间的数据流进行捕获和分析。
通过捕获数据包,用户可以了解网络流量的实时情况、分析网络协议、排查网络问题以及进行网络安全监控等工作。
此外,WinPcap驱动还可以用于网络流量生成、网络性能测试和网络协议栈的开发调试等工作。
WinPcap驱动的使用非常灵活和简单。
用户只需要安装驱动程序,并在自己的应用程序中调用相关的库函数,即可实现数据包的捕获和分析。
WinPcap驱动提供了一组API,这些API可以通过编程语言(如C、C++、Python等)调用,从而方便用户编写自己的网络数据包分析和工具。
另外,WinPcap驱动还支持远程数据包捕获。
用户可以通过在远程计算机上安装WinPcap驱动,并通过网络连接进行远程数据包捕获。
这个功能对于网络管理员或者安全专家来说非常有用,可以在分布式环境中实时监控多个计算机的网络流量。
虽然WinPcap驱动提供了强大的功能和方便的接口,但是用户在使用时也需要注意一些安全和隐私问题。
首先,WinPcap驱动具有高权限的操作系统级别的访问权限,因此需要用户具备足够的权限来安装和使用。
其次,在进行网络流量分析时,用户应当严格遵守相关法律法规,并保护用户隐私和网络安全。
总的来说,WinPcap驱动是一个强大而实用的工具,可以帮助用户更好地理解和分析网络数据包。
WinPcap编程

WinPcap编程WinPcap是一个开源的、运行于Win32平台下的体系结构,它的主要功能是进行数据包捕获和网络分析。
它允许应用程序通过协议栈捕获和传输网络数据包,也包括内核级别的数据包过滤、网络静态引擎和支持远程数据包捕获等有用的功能。
WinPcap由两部分组成:1. 驱动程序: 扩展操作系统功能提供低层次的网络访问2. 动态链接库:运行在Win32平台上的应用程序可以非常方便地访问网络低层次的数据。
Ethereal是大名鼎鼎的捕获数据包专业软件,它的运行是在WinPcap的支持之下的,如果没有安装WinPcap,Ethereal也无法正常捕获数据包。
在正式WinPcap编程之前,要配置运行环境。
Win32 平台下WinPcap应用程序需要以下四个动态链接库才能正常运行:wpcap.dllPacket.dllWanPacket.dllpthreadVC.dll这四个动态链接库在WinPcap驱动程序里。
如果没有这个驱动程序,需要到WinPcap官方网站上下载,下载地址为: 如果应用程序出现一下提示,那就是没有安装驱动程序的原因了。
被过滤广告也可以不安装WinPcap驱动程序。
但是需要把上面提到的四个动态链接库文件拷贝到系统分区/WINDOWS/system32目录下或者接下来配置编程环境。
如果一个源文件使用了WinPcap提供的库函数,那么就需要在该文件开始的位置添加pcap.h 包含文件(或者在引用的文件中),即#include “pcap.h”也许会出现下面的错误:fatal error C1083: 无法打开包括文件:“pcap.h”: No such file or directory这个错误表明找不到pcap.h文件这个头文件在驱动程序安装完成后也是没有的,它是开发包里面的一个头文件所以,如果要运行程序还需要到官方网站上去下载WinPcap SDK―WpdPackWinPcap SDk里面包含库文件,头文件,文档文件和一些例子。
第11讲 WinPCap
过滤数据包
int pcap_compile ( pcap_t * p, struct bpf_program * fp, char * str, //过滤表达式 int optimize, bpf_u_int32 netmask ) //掩码 int pcap_setfilter ( pcap_t * p, struct bpf_program * fp ) pcap_compile() 编译一个包过滤器。将一个高级的、布尔形式表 示的字符串转换成低级的、二进制过滤语句,以便被包驱动使用。 pcap_setfilter() 在核心驱动中将过滤器和捕获过程结合在一起。从 这一时刻起,所有网络的数据包都要经过过滤,通过过滤的数据 包将被传入应用程序。
打开一个适配器开始捕获数据包
pcap_t * pcap_open_live ( const char * device, int snaplen, int promisc, int to_ms, char * ebuf ) pcap_t *adhandle= pcap_open_live(d->name, 65536,1, 1000, errbuf );
解析数据包
不同的网络使用不同的链路层协议,不知道网络类型就无法定位数 据帧(frame) ,所以,首先使用如下函数对网络类型进行判断: int pcap_datalink ( pcap_t *p ) 它返回适配器的链路层标志,例如DLT_EN10MB表示以太网(10Mb, 100Mb,1000Mb及以上),DLT_IEEE802表示令牌环网。可以在设 置过滤条件之前先对各个设备的网络类型进行探测,以获知物理层 的数据帧格式,接下来就可以针对不同的帧格式解析出封装在其中 的报文(packet),例如IP报文,继而拆封IP报文得到TCP或者UDP 等报文,再深层次的拆封就是应用程序数据了。
什么是WinPcap
问题:什么是WinPcap?WinPcap是什么意思?WinPcap是用于网络封包抓取的一套工具,可适用于32位的操作平台上解析网络封包,包含了核心的封包过滤,一个底层动态链接库,和一个高层系统函数库,及可用来直接存取封包的应用程序界面。
Winpcap是一个免费公开的软件系统。
它用于windows系统下的直接的网络编程。
大多数网络应用程序访问网络是通过广泛使用的套接字。
这种方法很容易实现网络数据传输,因为操作系统负责底层的细节(比如协议栈,数据流组装等)以及提供了类似于文件读写的函数接口。
但是有时,简单的方法是不够的。
因为一些应用程序需要一个底层环境去直接操纵网络通信。
因此需要一个不需要协议栈支持的原始的访问网络的方法。
winpcap适用于下面的开发者:1、捕获原始数据包。
不管这个包是发往本地机,还是其他机器之间的交换包。
2、在数据包被发送到应用程序之前,通过用户定义的规则过滤。
3、向网络发送原始数据包。
4、对网络通信量做出统计。
这些功能依赖于Win32系统内核中的设备驱动以及一些动态链接库。
Winpcap提供了一个强大的编程接口,它很容易地在各个操作系统之间进行移植,也很方便程序员进行开发。
什么样的程序需要使用Winpcap很多不同的工具软件使用Winpcap于网络分析,故障排除,网络安全监控等方面。
Win pcap特别适用于下面这几个经典领域:1、网络及协议分析2、网络监控3、通信日志记录4、traffic generators5、用户级别的桥路和路由6、网络入侵检测系统(NIDS)7、网络扫描8、安全工具Winpcap有些方面不能做。
它不依靠主机的诸如TCP/IP协议去收发数据包。
这意味着它不能阻塞,不能处理同一台主机中各程序之间的通信数据。
它只能“嗅探”到物理线路上的数据报。
因此它不适用于traffic shapers,QoS调度,以及个人防火墙。
Winpcap内部结构Winpcap是一个Win32平台下用于抓包和分析的系统。
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. }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四编写协议解析器程序
一、实验要求及目的
使用libpcap/winpcap进行网络抓包,并解析网络数据包的各层首部字段。
通过编写程序,捕获一段时间内以本机为源地址或目的地址的IP数据包,统计IP数据包的信息,解析首部字段,帮助加深对IP协议的工作原理和工作过程的认识以及掌握winpcap抓包原理。
二、实验运行环境
本实验是是用winpcap进行网络抓包,基于windows系统,下载WpdPack 4.1.2安装包,在Visio stdio 2012上配置winpcap抓包环境,再编写C++代码实现网络抓包。
三、实验原理
TCP/IP协议族的分层结构包括应用层,传输层,互联网络层和主机-网络层,其结构如图1所示:
应用层Telnet、TFP、SMTP DNS、TFTP、SNMP
传输层TCP UDP 互联网络层IP
主机-网络层Ethernet,Token Ring,X.25,SLIP,PPP
图1 TCP/IP协议族的分层结构
其中IP协议是保证以太网正常运行的最重要的协议之一,只要用于负责IP 寻址,路由选择和IP数据报的分割与组装。
IP协议是直接位于数据链路层之上,负责将源主机的报文分组发送到目的主机。
IP协议是一种不可靠,无连接的数据报传送服务协议,它提供的是一种“尽力而为”的服务。
为了向传输层屏蔽的通信子网的差异,IP协议制订了统一的IP数据报格式。
IP数据报的长度是可变的,它分为报头和数据两个部分。
基本的IP报头是20B.选项字段的长度范围是0—40B,所以IP数据报报头的长度是范围是20-60B。
IPV4 IP数据报的结构如图2所示:
图2 IP数据包格式
IP首部封装具体解释如下:
(1)版本占4位,是指IP协议的版本。
通信双方使用的IP协议版本必须一致。
目前广泛使用的IP协议版本号为4(即IPv4)
(2)首部长度占4位,可表示的最大十进制数值是15。
这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。
当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。
因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。
首部长度限制为60字节的缺点是有时可能不够用。
但这样做是希望用户尽量减少开销。
最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。
(3)区分服务占8位,用来获得更好的服务。
这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。
1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。
只有在使用区分服务时,这个字段才起作用。
(4)总长度总长度指首部和数据之和的长度,单位为字节。
总长度字段为16位,因此数据报的最大长度为216-1=65535字节。
(5)标识(identification) 占16位。
IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。
但这个“标识”并不
是序号,因为IP是无连接服务,数据报不存在按序接收的问题。
当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。
相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
(6)标志(flag) 占3位,但目前只有2位有意义。
标志字段中的最低位记为MF(More Fragment)。
MF=1即表示后面“还有分片”的数据报。
MF=0表示这已是若干数据报片中的最后一个。
标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。
只有当DF=0时才允许分片。
(7)片偏移占13位。
片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。
也就是说,相对用户数据字段的起点,该片从何处开始。
片偏移以8个字节为偏移单位。
这就是说,每个分片的长度一定是8字节(64位)的整数倍。
(8)生存时间占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。
由发出数据报的源点设置这个字段。
其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。
最初的设计是以秒作为TTL的单位。
每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。
若数据报在路由器消耗的时间小于1秒,就把TTL值减1。
当TTL值为0时,就丢弃这个数据报。
(9)协议占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。
(10)首部检验和占16位。
这个字段只检验数据报的首部,但不包括数据部分。
这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。
不检验数据部分可减少计算的工作量。
(11)源IP地址占32位。
表示发送数据报的源主机的IP地址
(12)目的IP地址占32位。
本实验的IP数据包首部定义如下:
struct ip_header
{
#if defined(WORDS_BIENDIAN)
u_int8_t ip_version:4,
ip_header_length:4;
#else
u_int8_t ip_header_length:4,
ip_version:4;
#endif
u_int8_t ip_tos;
u_int16_t ip_length;
u_int16_t ip_id;
u_int16_t ip_off;
u_int8_t ip_ttl;
u_int8_t ip_protocol;
u_int16_t ip_checksum;
struct in_addr ip_souce_address;
struct in_addr ip_destination_address;
};
捕获IP数据包,一般借助winpcap或libpcap提供的API对网络数据包进行抓取。
winpcap是为windows开发环境提供的库函数,而libpcap则是为Linux 开发环境提供的库函数。
它们都是一个强大的网络开发库,可以实现许多功能,如获取可用的网络适配器、获取指定适配器信息(比如名称和描述信息)、捕获指定网卡的数据封包、发送数据封包、过滤捕获的包以获取特定包等。
两者提供的接口基本一致,只是某些函数名略有不同。
在使用前必须将winpcap或libpcap 安装在系统上,在使用时必须在工程中加入对应的开发包并在程序中声明。
在抓取数据包后,对其进行分析,要参考数据包的格式,所以数据包的格式是相当重要的。
在抓包时,首先是获得链路层的帧,根据帧头可以获得源mac 和目的mac以及上层的协议。
根据帧头的长度将指针往后移,然后可以获得IP数据报的头部指针,根据报头信息可以获得源IP、目的IP、上层协议、头部长度、总长度等信息。
四、实验编程思路
在本次实验编程中使用winpcap捕获IP数据包的过程如下:
首先获取网络设备的列表,这一步骤通过函数pcap_lookupdev()来实现,第二步是用函数pcap_open_live()打开找到的网卡设备。
pcap_open_live()中有一个参数为超时返回的间隔,通常设为500ms即可。
第三步是用pcap_compile()编译抓包的过滤规则。
第四步用pcap_compile()来编译抓包的过滤规则,最后pcap_loop()开始抓包。
最后用函数ip_protool_packet_callback以及函数ethernet_protocol_packet_callback来输出抓包后分析的首部信息。
五、程序运行结果及分析
本次实验一共抓取5个数据包,分析出了数据包的长度,MAC帧源地址,目的地址以及的分析出来上层协议是IP协议。
解析IP数据包的首部,输出了首部的详细信息。
从捕获的第一个网络数据包来看,首先这是一个0800的以太网类型,从上面的实验原理,可以看出这是一个IP数据包。
代码分析出了IP数据包的MAC帧源地址,目的地址。
IP数据包解析出来的首部长度是6,也即4*6=24位。
符合首部长度的范围定义,其次解析出了版本号,总长度,标识等详细信息,从以上原理可以得出抓包及分析正确。