基于libpcap捕获数据包的开发_第1页
基于libpcap捕获数据包的开发_第2页
基于libpcap捕获数据包的开发_第3页
基于libpcap捕获数据包的开发_第4页
基于libpcap捕获数据包的开发_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在对数据进行捕获时, 主要有两种方法: 1. 主要借助原始套接字Socket , 套接字是网络应用编程接口, 应用程序可以使用它进行网络通信发送和接收网络层以上的原始数据包, 而对底层的细节是透明的. 2. 使用系统抓包库Libpcap 和Winpcap, 通过数据链路层获取以太帧, 可以从网卡捕获或者发送原始数据包, 同时能过滤及存储数据包.这种方式的捕获是工作在网络底层数据链路层,能拦截所有正在网络上传送的数据包,并且可以通过相应的处理,从而实时的分析数据包的内容,使用数据包捕获函数来获得底层数据。2. 1Libpcap 方法开发的过程采用Libpcap捕获网络数据包的开发过程. 主程序的

2、流程如下图所示:捕获网络数据包过程按以下步骤进行, 程序开发过程中主要语句的实现:char * dev, errbuf PCAP- ERRBU FSIZE; / / 定义接口设备名和缓冲区的大小pcap- t p; / / 捕获数据包句柄, 非常重要的数据结构int snaplen = 65535; / / 代表用户期望的捕获数据包最大长度int t imeout= 1000; / / 代表函数超时返回的时间( 1) 进行本地网络设置检测, 获得网络接口设备. 调用函数dev= pcap- lookupdev ( er rbuf ) . Linux中最常见的接口设备名eth0 和lo, 而et

3、h0 对应了实际的网卡, 数据包的传输都要经过eth0.( 2) 设备找到后, 打开以准备捕获数据包. 调用的主函数是p = pcap- open- live ( dev, snaplen, 1,timeout , errbuf ) , 根据给定的接口设备名dev, 获得一个结构为pcap- t 的捕获句柄p, 函数中的1 代表设置接口为混杂模式.( 3) 若用户设置了过滤条件, 则编译和安装过滤代码. 编译过滤规则调用函数pcap- compile( p,&f ilter , f ilter- app, 0, net ) , 函数将规则字符串转化为内核过滤程序. 根据过滤规则设置过滤

4、器pcap- set filter( p, &filter) 传给BPF, 由BPF 过滤器捕获用户所需要的数据包.( 4) 反复捕获数据包. 调用pcap- loo p( p, cnt ,packet - print , NULL) 进入循环捕获, 对捕获的数据包处理放在回调函数( 如packet - print ( ) ) 中进行.( 5) 关闭设备. 调用pcap- close ( p) , 将打开设备时得到的结构为pcap- t 的捕获句柄, 作为参数传入.2. 2对数据包处理的回调函数的开发过程 在实现对捕获的数据包处理的回调函数packet- print ( ) 中, 具体

5、分析的流程如图所示: 函数中主要语句的实现:/ / 对以太头部进行分析, 判断所包含的数据包类型, 做进一步的处理/ / 对捕获的数据进行类型转换, 转化成以太数据包类型eth= ( st ruct ether - header * ) p;/ / 若以太帧的协议类型为TCP/ IPif ( eth-> ether - type = = nto hs ( ETHERTYPE-IP) ) / / 获取IP 头信息iph= ( st ruct ip * ) ( p + sizeof ( st ruct etherheader) ) ;/ / 判断上层协议是否为T CP 协议if( iph-&

6、gt; ip- p= = 6) / / 获取TCP 头信息tcph= ( st ruct tcphdr * ) ( p + sizeof ( st ructether- header) + 4 * iph-> ip- hl ) ;/ / T CP 包内容的长度tcplength = ntohs ( iph-> ip- len) -4 * iph->ip- hl-4* tcph-> doff ;/ / T CP 包的数据内容data= ( u- char * ) ( p+ sizeof ( st ruct etherheader) + 4* iph-> ip- hl

7、+ 4* tcph-> doff ) ;/ / 申请一长度为tcplength 字符串变量tcpdata= ( u- char * ) malloc( tcpleng th) ;/ / 把T CP 内容拷贝到tcpdata 变量中memcpy ( tcpdata, data, tcplength) ;if ( eth-> ether - type = = nto hs ( ETHERTYPE-ARP) )由于在以太帧首部含有协议类型字段, 所以可进一步实现上层协议包的首部提取. 对IP 报头首部提取, 从中可获取源和目的地址; 对T CP 报文段首部提取, 从中可获取源和目的端口号

8、; 若想获取数据包的更多内容, 可继续分析上层协议, 做进一步处理. 至此完成了捕获网络数据包工具的开发工作. 文章编号:1004-9762(2007) 02- 0152-05Linux系统中基于PF_RING套接字的高性能包捕获技术顾瑞春, 谭跃生, 贾元春, 王静宇( 内蒙古科技大学网络中心内蒙古包头 014010)关键词:数据包捕获; 设备轮询;环形缓冲区; PF_RING套接字中图分类号:TP393 文献标识号:A摘 要:介绍一种新型的数据包捕获方式 基于PF_RING套接字的数据包捕获技术. 旨在提高高速复杂网络传输环境中的数据包捕获率.使用环形缓冲区, 用来实现内核空间和用户空间的

9、内存共享,用户空间可以直接对其进行读写操作,而且可以对该缓冲区的大小进行调整配置. 经过实验, 在100M甚至Gbit 网络环境中, 结合设备轮询机制,在普通的PC机上便可以显示出其突出的数据包捕效率.Thehighperformancepacket capturebasedonthePF_RINGsocket inLinuxGURuichun, TANYuesheng, JIAYuanchun,WANGJingyu ( NetworkCenter,Inner MongoliaUniversity of Science andTechnology,Baotou 014010,China)Key

10、words: packet capture;dev_polling;ring buffer; PF_RINGsocketAbstract:Many networkmonitoring toolsarebasedonpacket capture, but theperformance of these popular tools isnot satisfactory. Herein, anewmethodbasedonPF_RINGSocket wasusedto improve the performanceof the packet capture under the heavy compu

11、ter traffics.The ringbuffer inthekernel canbe accessedandconfiguredfreely by the applications of the user space.The experimental result shows that, combinedwiththedev_polling,thePF_RINGsocket canimprove the performance of the packet capture significantly,eveninthe 100Mor the Gbit network.1 概述大多数的网络安

12、全、审计、计费产品都是以数据包捕获技术作为其工作基础的. 随着网络技术的发展, 数据包捕获技术也经历了几个不同的阶段.在Linux2. 2版内核以前, 基本上使用Ipchains来实现系统对网络传输的一个基本的控制; 到了2.4版内核以后Netfilter 的出现, 显示出了很大的优势, 开发人员可以通过Netfiler 提供的各个钩子函数( hook) 来挂接自己编译过的程序, 来实现某些功能.Netfilter的出现使得数据包捕获技术有了新的飞跃.随着网络带宽的不断增加, 网络传输速率的提高, 很多的数据包捕获工具已经渐渐显示出不足, 无法满足当前复杂的网络环境. 目前, 使用较为广泛的S

13、inffer, wireshark等数据包分析软件, 都是基于一个叫做LibPcap的函数库( Windows下的WinPcap 1) 实现的, 这个API 提供了一整套的包捕获机制. 在Windows和Unix 系统下显示出了一定的优越性.LibPcap的主要特点如下 2:(1) 可从以太网、虚拟接口等网络接口捕获数据包;( 2) 平台无关性;( 3) 具有基于BPF的数据包过滤特性. 完善了系统的数据包过滤体系.在100M线速、数据包大于200K的网络环境2007年6月第26卷第2期内蒙古科技大学学报Journal of Inner Mongolia University of Scien

14、ce andTechnologyJune,2007Vol.26,No.2 收稿日期: 2007-03-09基金项目: 内蒙古高校科研基金资助项目(NJ04021)作者简介: 顾瑞春(1982-), 男, 内蒙古武川人, 内蒙古科技大学硕士研究生, 主要从事计算机网络及信息安全研究.中, 其表现比较好, 几乎没有丢包现象. 但是, 一旦处于高速复杂网络环境中, 例如Gbit 线速、数据包长度小于100K的条件下, LibPcap便有些力不从心,随着数据包量的增加和包长度的减小, LibPcap的丢包率成上升趋势. 就是在Window环境下的基于WinPcap的网络监控系统也难以避免瓶颈现象 3.

15、经过分析, 发现在复杂网络环境中, 丢包率上升的原因是在捕包过程中, CUP一直处于接收中断状态, 而没有把时间用于处理数据包的过程中来, 也就是进入了系统的中断活锁状态.为了解决这个问题, Unix系统采用了一种叫做设备轮询的机制 4, 这种机制的具体特点如下:( 1) 当网卡接收到一个数据包, 便产生一个中断信号给系统;( 2) 系统进行如下操作: 关闭网卡中断;!激活轮询进程, 对该网卡进行轮询;打开网卡中断.在Linux系统中, 称这种技术为NAPI 5技术.NAPI技术的使用, 确实在很大程度上提高了系统的数据包捕获效率, 克服了中断活锁现象 6. 在高负载网络环境下, 设备轮询机制

16、( dev_polling) 大幅度增强了数据包捕获能力和系统响应速度.2 PF_RING套接字在大数据包的网络环境下, 设备轮询机制表现出了较高的捕包能力, 但是在小包大流量的网络环境下, 设备轮询机制虽然比LibPcap的表现好了很多, 但依然难以达到让人满意的程度.表1, 2是在我们进行实验后得出的结论.表1 数据包捕获率比较Table 1Percentageof thepacket capture数据包长度/KLinux2.6.1Linux 2.6.1+ LibpcapFreeBSD4.864 0.3% 1% 25%512 1.1% 6% 31%1024 4.3% 10.5% 42%从

17、表1, 2中的数据来看, 在使用了设备轮询机制之后, 各个系统都有了显著的提高. 但是, 在Linux系统和FreeBSD系统之间, 丢包率有着很大的差距.如表1所示, 数据包大小为64K, Linux2. 6. 1内核中使用Libpcap机制的捕包率仅为1%, 而FreeBSD4. 8中的捕包率却高达25%. 表2中的各项也说明它们之间的丢包率有明显差距.经过进一步分析, 在数据包捕获的过程中, CPU的多数时间都被用在把网卡接收到的数据包经过内核的数据结构队列发送到用户空间的过程中. 也就是说是从网卡到内核, 再从内核到用户空间, 这两个步骤, 花去了大量CPU时间, 而没有其他时间用来进

18、行数据包的进一步处理.表2 数据包捕获率比较( 轮询)Table 2 Percentage of capturedpacketsusingkernel polling数据包长度/KLinux2.6. 1+NAPILinux 2.6. 1+NAPI+LibpcapFreeBSD4. 8+DevPolling64 2.5% 14.9% 97.3%512 1.1% 11.7% 47.3%1024 34.3% 93.5% 56.1%基于轮询机制的不足, 在轮询机制的基础上, 提出一种新的包捕获套接字模型 7:( 1) 提出一种基于环形缓冲区的新的套接字 PF_RINGSocket;( 2) 每创建一个

19、PF_RING套接字便分配一个环形缓冲区, 当这个套接字结束时释放这个缓冲区. 不同的套接字拥有不同的环形缓冲区; 如果把PFRING套接字绑定到某一网卡上, 这块网卡在这个套接字结束前, 处于只读状态, 当数据包到达网卡时,将其放入到环形缓冲区, 如果缓冲区已满, 则将其丢弃;( 3) 用户空间可以直接访问这个环形缓冲区中的数据;( 4) 当有新的数据包到来时, 可以直接覆盖掉已经被用户空间读取过的那个数据包的空间.用户程序可以对环形缓冲区的大小进行设置.在使用了PF RING之后, 系统的数据包捕获效率有显著提高. 具体实验数据见表3.PF RING套接字的基本模型如图1. 在应用层的各个

20、应用程序可以建立自己的不同的套接字模型, 用来接收和发送数据, 每一个环形缓冲区可以实现读写功能. 在网卡接收到新的数据包之后, 就将其153 顾瑞春等:Linux系统中基于PF_RING套接字的高性能包捕获技术直接写入到环形缓冲区中, 以便应用程序直接对其进行读操作. 而如果应用程序需要向外发送数据包时, 也可以直接将数据包写入到环形缓冲区, 以便网卡驱动程序将该数据包发送到相应的接口上 8.表3 使用PF RING套接字后的包捕获效率Table 3 Percentage of capturedpacketsusingPF RING数据包长度/KLinux 2.6.1+ NAPILinux

21、2.6.1+ NAPI+ LibpcapLinux 2. 6.1+ NAPI+ PF RING64 2.5% 14.9% 73. 2%512 1.1% 11.7% 45. 1%1024 34.3% 93.5% 91. 8%图1 PF RING套接字结构Figur 1 The Architecture of PF RINGSocket 在数据包捕获的实例中, 我们只使用数据包从网卡经过内核环形缓冲区到达用户空间应用程序的过程; 但是, 如果这台机器将要对数据包进行转发,那么数据包从应用程序到达内核环形缓冲区, 然后再从网卡发送出去, 这个过程也是相当重要的, 其效率和数据包捕获是相同的, 只是读

22、写顺序不同而己.PF RING套接字的主要优势有以下几点:( 1) 数据包并没有列入内核队列中, 而是直接拷贝到环形缓冲区;( 2) 用户空间可以直接访问环形缓冲区;(3) 即使系统不支持轮询机制, 使用PF RING套接字也是相当稳定的. 因为这里用于处理中断的时间相当短暂;( 4) 不用的应用程序可同时打开多个PF RING套接字.3 PF RING套接字的实现PF RING套接字是笔者为了减少网络层传输中的内存拷贝即避免频繁的系统调用而设计的一种新的套接字类型, 这种套接字采用模块方式动态加载. 其中的具体结构如下 8:环形缓冲区簇结构:struct ring clusteru shor

23、t cluster id; / / 缓冲簇idu short num cluster elements;enumcluster typehashing mode;u short hashing id; / / 哈希表id#;环成员结构:struct ring elementstruct list headlist; / / 链表头struct sock*sk;环操作结构:struct ring optstruct net device*ring netdev; / / 设备u short ring id; / / 环idu short cluster id#;采用模块方式加载, 模块初始化函数

24、:staticint init ring init( void)ring table=NULL; / / 调用套接字注册函数sock register(&ring family ops) ; / / 注册环形句柄set ring handler( my ring handler) ;return0;该函数调用sock register( ) 函数将PF RING套接字协议族注册到系统的全局套接字协议族数组net family中, 以便用户层调用sock( ) 函数创建PFRING套接字时, 系统能够从net family数组中找到相应的记录和create( ) .模块清理函数ring

25、exit( )staticvoid exit ring exit( void)154 内蒙古科技大学学报 2007年6月 第26卷第2期set skb ring handler( NULL) ; / / 清除环形句柄set buffer ring handler( NULL; / / 缓冲区句柄sock unregister( PF RING) ; / / 调用套接字清除函数ring proc term( ) ;清除注册信息, 停止运行. 退出系统内核.4 PF RING套接字的使用如果需要使用PF RING套接字, 则需要在用户层调用sock( ) 函数, 并且传递PF RING标志、SOC

26、K RAW以及ETH IP ALL3个参数, 这3个参数必须完全匹配. Sock( ) 函数执行成功则将PFRING套接字描述符返回给用户空间, 应用程序就可以利用这个描述符操作相应的设备轮询机制了.接下来的一个重要操作是调用bind( ) 函数, 切入内核以后调用的sys bind( ) 函数, 最终实际调用的是相应套接字协议族自己定义的bind方法, 而对于PF RING套接字协议族来说, 就是调用ringbind( ) 函数, 事实上, ring bind( ) 函数最终调用packet ring bind( ) 函数完成bind的工作. 这个函数的作用就是为套接字描述符创建一个环形共享

27、缓冲区, 然后绑定到一个设备上.在进行了bind之后, 就可以利用PF RING套接字, 进行数据传输了. 由于用户空间可以直接访问内核空间的环形缓冲区, 效率优于 零拷贝%技术. 在普通的网络接收函数中, 网卡驱动到内核传递数据的核心函数是netif rx( ) 函数, 在NAPI中, 使用netifreceive skb( ) 函数. 无论是否采用设备轮询, 都可以采用PF RING套接字方式传输数据, 实现方法就是在2个关键函数的起始位置插入PF RING套接字处理函数的调用. 在PF RING的处理程序中,定义了一个处理函数skb ring handler( ) , 每当有网络数据通过

28、netif rx( ) 以及netif receive skb( )向上层协议传递的时候, 都会首先经过这个函数的处理. 这个函数的处理过程如图2所示. ( 1) 在ring套接字列表中查找是否有某些ring套接字准备在当前设备上接收数据, 如果有, 则将当前skb加入这个套接字的环形缓冲区中, 如果没有任何套接字准备从当前设备接收数据, 则释放skb然后直接返回;图2 PF RING工作流程Fig. 2 The workflowchart of PF RINGSocket( 2) 查看当前缓冲区中是否有空闲空间, 有则将其加入;( 3) 查看当前缓冲区中是否有skb已经被用户空间拷贝过, 有

29、的话, 则直接将其覆盖;( 4) 如果当前环形缓冲区已满, 且全部处于等待处理过程中, 则直接将该skb丢弃.5 结论基于现有数据包捕获工具的效率低、稳定性差的现状, 为了提高高速( Gbit 甚至更高) 网络环境下数据包的捕获效率, 本文提出一种基于环形缓冲区的数据包捕获方法. 实验结果表明, PF RING套接字确实能显著提高系统的数据包捕获性能. 但是, 受到网卡物理性能和是否支持设备轮询的局限, 这种方法并非能够在任何条件下完全发挥其优越性. 这值得我们在今后的实验中进一步研究和探讨.参考文献:1 赵海雁, 陈立潮, 叶树华, 基于Windows的网络监听技术在局域网中的实现 J .

30、计算机工程, 2004, 30( 22):117- 1242 DeryL. Improving the passive packet capture:Beyonddevicepolling EB/OL. http: / luca. ntop. org/Ring. pdf, 2004-11.3 李雪莹, 刘宝旭, 许榕生. 基于WinPcap的网络监控系统性能优化J. 计算机工程,2004,30(1):89,47.4 Rizzo L. Device polling support for free BSD EB/OL.155 顾瑞春等:Linux系统中基于PF_RING套接字的高性能包捕获技术h

31、ttp:/ /info.iet. unipi.it/ luigi/polling/,2001- 11. 5 徐林,张德运, 孙钦东, 等.基于NAPI 的数据包捕获技术研究 J .计算机工程与应用, 2004,26:138139,159. 6 Degioanni L. Profiling andoptimizationof softwarebasednetworkanalysis A . Proceedings of the 15th IEEESBACPAD2003SymposiumC . SanPaulo,Brazil: 2003.7 WoodP. Libpcapmmap, Los Alomos National Labs EB/OL.http: / public. lanl. gov/ cpw,200604.8 Corbet J, Rubini AandGreg KroahHartman. Linux DeviceDriversM.USA:O& Reilly,2005.知识窗干熄焦 值得推广的节能减排技术(一)干熄焦是干法熄灭炽热焦炭的简称,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论