Winpcap的体系结构与性能研究
- 格式:doc
- 大小:14.49 KB
- 文档页数:4
深度剖析WinPcap之(序言)——分析WinPcap源代码的缘由过去我一直在开发软件,包括Windows操作系统的应用软件,Linux操作系统的应用软件与驱动程序,也开发过一些嵌入式软件,并在后来的工作中逐渐专注于对软件的测试工作,主要从事软件测试技术与测试方法、软件工程的研究。
在此过程中与其他开发人员、测试人员一同工作,帮助他们构建达到工业级标准的软件,或者指导他们提高软件开发或测试的技术水平。
随着不断的遇见问题、解决问题,我也在思考一个问题:那就是软件开发人员与软件测试人员除了对应用程序需要清晰的理解之外,是否还需要对支撑应用软件运行的操作系统,共享库等有深入的了解?下面通过我亲身经历的两个案例来考虑该问题:案例1:嗅探软件掉包问题某自行开发的网络数据包嗅探软件,在对被测试设备进行数据包分析时,发现有掉包现象,但待测设备运行正常。
经过仔细分析,发现该嗅探软件设计有如下问题:针对高速网络流量,从软件架构上就没考虑到如何防止掉包的问题。
软件开发人员对该嗅探软件进行各种优化,比如增加缓冲区的大小,降低显示的复杂度、分析代码性能瓶颈,但都改善不大。
通过对所调用WinPcap库的仔细分析,获得下列解决方案:让WinPcap的内核驱动程序NPF实现协议过滤,而不是通过嗅探软件进行过滤,同时就在内核实现数据包的存储,而不导入应用层后进行存储。
该案例提醒我们,在测试人员开发测试工具时,需要对所用的支撑软件有深入的了解,才能更好的解决所遇到的实际问题。
内核层的过滤与转储功能是WinPcap的NPF驱动程序提供的优化功能,就是解决高速网络流量掉包问题的。
案例2:AD数据采集系统掉点问题某AD数据采集系统,基于嵌入式Linux系统实现,对所采集的数据进行分析,出现掉点现象。
经过仔细调试发现采样率还不到所要求一半时就开始出现掉点现象,采样率越高掉点现象越严重。
项目组相关人员对Linux驱动程序的机制了解不够深入,应用层软件开发人员对软件进行各种调优,收效甚微,曾一度怀疑是文件系统存储速度慢或硬件问题导致,项目陷入困境。
深度剖析WinPcap之WinPcap简介WinPcap是Windows平台下访问网络数据链路层的开源库,该库已达到工业标准的应用要求。
WinPcap允许应用程序绕开网络协议栈来捕获与传递网络数据包,并具有额外的有用特性,包括内核层的数据包过滤、一个网络统计引擎与支持远程数据包捕获。
1.1. 什么是WinPcap大多数网络应用程序通过被广泛使用的操作系统原语来访问网络,诸如sockets。
操作系统已经处理了底层的细节问题(如协议处理,数据包的封装等),并提供与读写文件类似的、熟悉的接口,这使得用该方法可以很容易的访问网络中的数据。
然而有些时候,这种“简单的方式”并不能满足任务要求,因为有些应用程序需要直接访问网络中的数据包。
也就是说,应用程序需要访问网络中的“原始”数据包,即没有被操作系统使用网络协议进行处理过的数据包。
WinPcap的目的就是为Win32应用程序提供这种访问方式。
WinPcap提供下列功能:•捕获原始数据包,无论是发送到运行WinPcap机器上的数据包,还是在其它主机(共享介质)上进行交换的数据包•在数据包分派给应用程序前,根据用户指定的规则过滤数据包•将原始数据包发送到网络•收集网络流量的统计信息1.2. WinPcap的优点自由 WinPcap遵循BSD open source licence发布。
这意味着你的应用程序拥有全部自由来修改与使用它,即使应用程序是商业化的。
高性能WinPcap实现了有关数据包捕获文献中描述的所有典型的优化方法(比如内核级的过滤与缓冲,减少上下文交换,数据包部分内容复制),加上一些原创的优化方法,如JIT过滤器编辑(JIT filter compilation)与内核级的统计过程。
因为这些原因,WinPcap胜过其它可比的方法。
普及WinPcap被许多工具作为网络接口使用——无论是自由软件还是商业软件。
包括网络协议分析器、网络监视器、网络入侵检测系统、网络嗅探器、网络流量生成器、网络测试器等等。
WinPcap 的体系架构深度剖析WinPcap 之(四)——WinPcap 的体系架构(1) 2009-08-31 20:02:37 标签:架构WinPcapWinPcap 是Win32 平台下用于数据包捕获与网络分析的一个架构。
它包含一个内核层数据包过滤器,一个底层动态链接库( packet.dll ),与一个高层并独立于系统的库 (wpcap.dll )1.1 WinPcap 的主要组成WinPcap 的各个主要组成部分如图2-1 所示。
图2-1 WinPcap 的主要组成首先,为了访问网络上传输的原始数据,一个捕获系统需要绕过操作系统的协议栈。
这需要一部分程序运行于操作系统的内核中,来与网络接口驱动直接交互。
该部分与操作系统密切相关,WinPcap 的解决方案是实现一个叫做Netgroup Packet Filter (NPF )的设备驱动程序,并对Windows 95 、Windows 98 、Windows ME 、Windows NT 4 、Windows 2000 与Windows XP 等不同操作系统提供不同版本的驱动程序。
这些驱动程序提供了数据包捕获与发送的基本特性,同时也提供诸如一个可编程的过滤系统与一个监控引擎之类的更高级特性。
第一个特性可用于限制一个捕获会话,只捕获特定的网络数据包(比如,可以只捕获一个特定主机生成的ftp 数据包)。
第二个特性提供了一个强大但简单的方式,来获取网络流量的统计信息(比如,可以获取网络负载或两个主机间所交换数据的数量)。
其次,捕获系统必须导出一个接口,使得用户层应用程序可使用内核驱动所提供的特性。
WinPcap 提供两个不同的库:packet.dll 与wpcap.dll 。
第一个库提供一个底层的API ,可用来直接访问驱动程序的函数,提供一个独立于微软的不同操作系统的编程接口。
第二个库导出了更强大的、更高层的捕获函数接口,并提供与UNIX 捕获库libpcap 的兼容性。
winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
目录winpcap 驱动各项功能Winpcap的内部结构Winpcap程序实例winpcap卸载不干净的解决方法编辑本段winpcap 驱动各项功能1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据winpcap结构包;2> 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;3> 在网络上发送原始的数据包;4> 收集网络通信过程中的统计信息。
winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据包。
也就是说,winpcap不能阻塞,过滤或控制其他应用程序数据包的发收,它仅仅只是监听共享网络上传送的数据包。
因此,它不能用于QoS调度程序或个人防火墙。
目前,winpcap开发的主要对象是windows NT/2000/XP,这主要是因为在使用winpcap的用户中只有一小部分是仅使用windows 95/98/Me,并且MS也已经放弃了对win9x的开发。
因此本文相关的程序T-ARP也是面向NT/2000/XP用户的。
其实winpcap中的面向9x系统的概念和NT系统的非常相似,只是在某些实现上有点差异,比如说9x只支持ANSI编码,而NT系统则提倡使用Unicode编码。
有个软件叫sniffer pro.可以作网管软件用,有很多功能,可监视网络运行情况,每台网内机器的数据流量,实时反映每台机器所访问IP以及它们之间的数据流通情况,可以抓包,可对过滤器进行设置,以便只抓取想要的包,比如POP3包,smtp包,ftp包等,并可从中找到邮箱用户名和密码,还有ftp用户名和密码。
它还可以在使用交换机的网络上监听,不过要在交换机上装它的一个软件。
实验6 利用WinPcap技术捕获数据包实验目的:通过掌握WinPcap函数库的结构和功能,实现在windows环境下对网卡进行编程,进行网络数据包的捕获。
实验准备:(1)winpcap简介WinPcap 是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows 操作平台上来实现对底层包的截取过滤。
WinPcap 为用户级的数据包提供了Windows 下的一个平台。
WinPcap 是 BPF 模型和 Libpcap 函数库在Windows 平台下网络数据包捕获和网络状态分析的一种体系结构,这个体系结构是由一个核心的包过滤驱动程序,一个底层的动态连接库 Packet.dll 和一个高层的独立于系统的函数库 Libpcap 组成。
底层的包捕获驱动程序实际为一个协议网络驱动程序,通过对 NDIS 中函数的调用为 Win95、Win98、WinNT、和 Win2000 提供一类似于 UNIX 系统下 Berkeley Packet Filter 的捕获和发送原始数据包的能力。
Packet.dll 是对这个 BPF 驱动程序进行访问的 API 接口,同时它有一套符合 Libpcap 接口(UNIX 下的捕获函数库)的函数库。
WinPcap的结构图如图1。
WinPcap 包括三个部分:第一个模块NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件。
它的功能是过滤数据包,并把这些数据包原封不动地传给用户态模块,这个过程中包括了一些操作系统特有的代码。
第二个模块packet.dll为win32平台提供了一个公共的接口。
不同版本的Windows系统都有自己的内核模块和用户层模块。
Packet.dll用于解决这些不同。
调用Packet.dll的程序可以运行在不同版本的Windows平台上,而无需重新编译。
第三个模块 Wpcap.dll是不依赖于操作系统的。
它提供了更加高层、抽象的函数。
基于WinPcap的网络分析研究与实现摘要近几年,我国经济发展迅速,各个领域的事业都趋于完善。
在网络信息技术的不断发展下,通过对WinPcap的应用,真正实现了Windows下网络数据包的捕获技术,下文将详细阐述IP、Tcp等等协议的解析过程。
网络数据的储存通过msspl来实现,进而建立系统硬件运行环境。
对局域网,通过测试实现了全局监控。
关键词信息技术;网络分析;分析与研究;运行环境;数据包;源代码1 应用环境网络监控系统承载介质中,硬件与软件监控系统共同构成网络监控。
网络监控系统标准功能是对局域网中的违规行为进行记录与监控。
在国外一些发达国家,有两款软件Ethereal与Sniffer,后者主要任务就是给网管及时提供网络监视情况与数据包捕以及故障分析等内容,这样能方便网管对现场进行迅速的故障处理以及诊断能力。
与此同时,还能使用户得到更好的网络管理以及故障分析功能。
前者作为一种可以捕获数据包,并且将这个数据包的信息显示出来,这样的一款网络数据包分析软件,在通用许可证的保障范围内,其数据包分析软件用户能免费得到。
除此之外,还可以得到其源代码,并且也能够根据自身的需要来将其源代码进行修改。
现阶段,Wireshark是全球应用最多的一种网络数据包分析软件[1]。
2 Win Pcap研究抓包的过程,是通过用户级的程序接口来完成的。
在这些接口中,用户程序能够利用内核驱动提供的高级特性。
作为WinPcap所提供的2个库,PACKET 提供一个底层api,应用这个库能够访问驱动的函数。
这些函数能够实现来抓包时,网络硬件与操作系统独立。
NDIS作为一种管理网络适配器的驱动程序和协议驱动之间的规范。
其还是一个可以让协议驱动发生与接收数据包并且不用看特定的适配器或者特定的Win32操作系统的封装。
捕获数据包是通过NPF来实现的。
在进行数据包的捕获时,数据包的监控任务是一个网络接口,进而应用程序才能够完整抹除这部分数据包。
Winpcap的体系结构与性能研究摘要: Winpcap有一系列创新(如数据包监视和数据包注入)的特点,这在以前的操作系统中是见不到的。
介绍了Winpcap的系统结构及其功能。
关键词: Winpcap;数据包监测;数据包注入网络分析软件通常依赖底层调用抓取数据包,进行数据包监视或流量分析等。
大多数的Unix系统都提供这些功能(至少是数据包抓取),而Windows提供的这些功能却不令人满意。
Windows提供了一些与各种内核组件相关的API,但这些API存在严重的缺陷,如并不是所有的Netmon API都可用,而且其扩展存在很多限制。
IP过滤驱动程序(IP filter driver)只存在Windows 2000及以上系统中,而且它只支持IP协议,虽然它能够控制和丢弃数据包但却不能监测和构造数据包。
PCAUSA提供了一个商业产品,该产品含有数据包捕获和BPF兼容的过滤器,然而它的用户接口处于底层且没有提供过滤器构造这样的抽象方法。
随着原本在Unix系统上的应用不断转向Windows系统,这些特性的缺失成了不可忽视的问题。
本文主要介绍一个强大可扩展的Win32平台的网络监听框架系统Winpcap的结构及其功能。
该体系结构填补了Unix和Windows间网络监听能力的间隔,使得Unix应用到Windows的移植更简单,而且Winpcap把性能放在最首位,使其能满足更苛刻的需求。
1 Winpcap的体系结构Winpcap的基本结构,由1个过滤引擎、2个缓冲区(内核层与用户层)以及一系列供开发人员使用的组件库组成。
尽管Libpcap具有稳固的结构并且功能强大,但Winpcap在结构和数据捕获上仍然有自己独到的地方,而且甚至可以认为是对Libpcap的创新。
Winpcap的过滤可从用户层开始(与Libpcap兼容),开发人员可以自定义包过滤条件(如picks up all udp packets);Winpcap会把它们编译成一些虚拟指令(如if the packet is ip and the protocol type field is equal to 17,then return true),同时把这些虚拟指令发送到过滤引擎,并且激活这些功能。
要实现这些目的,内核模块必须能够执行指令,因此需要一个“虚拟BPF”用来在每个接收的数据包执行这些虚拟代码。
其中内核层的过滤引擎是获得高性能的关键。
NPF与BPF在体系上最大的不同是对循环缓冲区的使用选择[1]。
Winpcap每次复制一部分数据包,Winpcap的缓冲区不再是固定大小(Libpcap 的内核缓冲区与用户缓冲区都是32 KB),而且在将数据包从内核缓冲区复制到用户缓冲区的过程中对数据包进行更新,而不是复制完后更新。
在复制过程中,将已经传送的数据包所占用的空间立即释放,因为尽管Winpcap工作在较高的优先级并且可能一直垄断CPU,但内核层的捕获程序可能会中断复制过程。
只要交换缓冲区允许占用一般的内存,Winpcap的缓冲区就可以存放大量的数据包。
内核缓冲区仅通过一个read函数就可以完全复制,这可以减少大量的系统调用并且避免程序在内核层与用户层之间频繁切换。
因为环境的切换之前必须保存任务状态(CPU描述符与任务状态大约有几百个字节),频繁切换会导致CPU使用率下降。
Winpcap的内核缓冲区比BPF的要大(为1 MB),因为较小的内核缓存也会带来一些问题,特别是当程序无法与捕获数据包的驱动程序的速度保持一致情况下,这种情况在将数据发往硬盘或网络数据量激增的情况下很常见。
相反,用户缓冲区需要小一些,通常情况下为256 KB。
内核缓冲区与用户缓冲区都可以在运行时调整。
用户缓冲区的大小至关重要,因为它决定了仅通过一个调用最多可以从内核读多少数据,同时,一次从内核中至少应该读多少数据也很重要。
如果给出一个较大的值,则内核可以在数据送往用户缓冲区之前等待足够多的数据包到达,这可以减少一些系统调用。
如果给出一个较小的值,则意味着内核可以将数据包尽快送往用户缓存。
这对那些实时性要求比较高的应用来说很重要,一个好的捕获引擎会在两者之间做出好的平衡。
NPF是可配置的,让用户选择程序具有好的执行效率或快速的反应。
而Winpcap提供了一组函数可以设置数据包读延时和数据包拷贝的最小值。
当读延时或内核缓冲区获得的数据包数据量满足了最小值,数据都会被送往用户缓冲区。
延时默认设置为1 s,最小数据量设置为16 KB,这种功能被称之为“延迟写入”。
1.1 统计模式包捕获与网络分析会过多占用CPU,因为有大量的数据需要处理和拷贝。
提高执行速度最常用的方法是提高过滤引擎的速度与一次拷贝结构,这种方法是通过将内核缓冲区映射到程序内存来实现。
一次拷贝的操作会减少数据的拷贝,但并不会减少内核层与用户层之间的系统调用。
如果用户一次读一个数据包,环境切换的代价会抵消一次拷贝所带来的好处。
一种新的方法是监视时并不将数据包送往用户层,而是Winpcap将监视的功能放在内核层,这样就可以避免数据送往用户层。
Winpcap提供了一种嵌入在NPF过滤引擎中的可编程的统计模式,可以使过滤器成为强大的分类器而不仅仅是过滤器。
应用程序可以使用这个模块监视任意的网络行为(如网络下载、两台主机间的网络流量、每秒钟的网页访问数量),并且可以在预先设定的时间间隔获得这些结果。
统计模式避免了数据拷贝,并且实行0拷贝模式(统计行为在数据包到达网卡驱动的存储区时执行,之后数据包被丢弃),所以不需要缓冲区。
统计模式是监视网络的一种极为有效的方法,且能在高速网络中表现出良好的性能。
Winpcap为开发人员提供了一组高层调用可以很容易地使用统计模式,对那些习惯了Libpcap的开发人员来说很容易掌握。
1.2 数据包注入BPF与NPF都提供了直接发送原始包的功能,可以将数据包直接发送到网络中。
但是Libpcap并没有使用这些调用,而BPF也并不是用于此目的。
大多数Unix系统都提供了直接发送原始包的功能,而Windows只有2000才提供了此功能,且功能受限。
因此,Winpcap是Win32平台上第一标准的而且可靠的发送原始包的类库。
NPF 提供了许多新的函数可以发送多个数据包而只在内核层与用户层之间切换一次。
Winpcap虽然提供了很多函数可以去开发这些新的功能(但并没有直接提供这些功能),它需要开发人员手工构造数据包或利用已有的工具。
而用户可以使用Libnet Packet Assembly Library(即在Winpcap上加了一层功能),就可以构造数据包并发送到网络中。
2 性能分析主要是对Winpcap的性能进行测试,用Winpcap在Windows98与Windows2000下的表现与Libpcap/BPF 在FreeBSD下的表现进行比较。
图2为两台主机直接相连,以排除外部数据包的干扰,使实验结果更精确。
一台主机是Windows2000操作系统,使用基于Winpcap的工具产生大量的数据包发送到网络中,并保证高速率。
数据包的大小选择,是以保证每秒所产生的数据包都能够达到一个极限值。
操作系统安装在同一台主机上的不同硬盘分区上,以避免由于硬件原因带来的差异。
数据包被发送到不同的主机上,这样可以使两台主机之间不用进行交互。
接收端的主机网卡设置为混杂模式,根据测试主题的不同而用不同的工具捕获数据包。
根据测试需要,数据包收到后或丢弃、或传送给应用程序、或存储在硬盘中。
FreeBSD的CPU负载可以在TOP PROGRAM 查看,Windows2000可以通过任务管理器查看,Windows98则可以用CPUMETER查看(可以从网上获得)。
被测试的软件都是最新的发行版,Winpcap的内核缓冲区为1 MB,Libpcap的缓冲区被设置为2个512 KB大小的空间(默认为32 KB)。
这些实验将努力避免其他软件对实验结果的影响,但是结果并不能准确地表现出单独组件的性能,因为不同的组件不交互基本上是不可能的。
2.1 发送实验发送实验是测试发送性能,只在Windows2000下进行(95/98没有对这个功能做优化)。
图3显示了当每个包都为88 B的情况下达到每秒发送的最大值(原认为在每个包为64 B的情况下会达到最大值),这出乎意料。
因为测试并不依赖NPF,CPU的负载始终没有达到100%,这也说明了NPF并不是瓶颈所在。
当数据包为400 B 时网络达到全速。
经实验发现发送能力更多依赖于网卡,当更换网卡、并在相同情况下进行测试时,发送速度只能达到每秒30 000个包。
2.2 接收与过滤实验接收与过滤能力实验测试:数据包被网络接口接收并被过滤器检查,如果所有的包都不会满足过滤条件,它们将在检查后被丢弃(不会被拷贝)。
测试在两种情况下进行:第一种使用3条BPF虚拟指令;第二种使用13条复杂的BPF虚拟指令。
图4为网络分离和过滤性能,几乎所有的包都被接受并没有被过滤器检查。
Windows98的CPU负载明显高于Windows2000(但是也在可以接受的范围内)FreeBSD 表现很差,只捕获大约一半的数据包,而且CPU负载始终较高。
2.3 向应用程序传送数据包的测试测试应用程序从Winpcap接收数据包的能力(收到后直接丢弃,并不做进一步的处理),检验整个Winpcap体系的功能,包括数据从网卡复制到内核缓冲区再到用户缓冲区,而且将不使用过滤功能。
图5为测试结果,Winpcap几乎可以将所有从网络接口获得的数据全部送至应用程序,没有数据包在内核缓冲区被丢弃。
而FreeBSD并不能做到这些,特别是在高数据率的情况下,大部分的数据包在没有到达过滤器之前已被丢弃。
无论在Windows2000还是FreeBSD中,CPU的负载都随着数据包容量的增大而降低,Windows98因为没有延迟写入的能力而表现一般。
2.4 程序性能实验实验将使用基于Winpcap的工具将获得的数据包转存在文件中,结果。
程序将每个数据包的68 B的内容存到文件中。
所有的系统在高数据率的情况下都会丢失一些数据包:一部分是因为恪守CPU时间(当一个数据包到达时,程序却还在处理前面的包);另一部分则因为内核缓冲区没有足够的空间去存放数据包。
图7为整个数据包被写入文件时的结果。
2.5 监视实验监视实验在AD-HOC网络上进行。
实验结果表明CPU负载一直维持在较低的水平,而且结果与图4相类似。
图5显示了在用户层监视的代价远高于内核层,这些多余的代价会给用户层监视的性能带来折扣。
另外,用户层的监视需要大容量的缓冲区。
3 Winpcap 的改进意见根据实验结果与体系结构的特点,采取了如下相应的改进措施:3.1 过滤引擎改进因为采用动态代码生成技术对BPF进行改进,使BPF性能取得明显效果,因此对NPF 也进行了类似的改进,采用JIT(Just In Time)技术,将过滤代码翻译成X86的二进制代码,这项改进使整体的捕获性能提高了约8%。