libpcap开源库总汇.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于Linux平台的libpcap源码分析和优化?目录1..... libpcap简介... 12..... libpcap捕包过程... 22.1??????? 数据包基本捕包流程... 22.2??????? libpcap捕包过程... 42.3??????? libpcap 1.3.0源码对照... 62.3.1???????? 创建环形队列... 62.3.2???????? 捕获数据包... 63..... libpcap捕包优化分析... 73.1处理流程单一:... 73.2高中断服务负荷:... 83.3内核态到用户态上下文选择:... 83.4数据拷贝和内存分配消耗:... 84..... 延伸拓展... 84.1 libpcap多线程捕包... 84.2 Linux并行运算... 94.3 零拷贝发包... 95..... 参考资料:... 9???1. ?libpcap简介libpcap是unix/linux平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础。Libpcap可以在绝大多数类unix平台下工作.Libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。Libpcap可以在绝大多数类unix平台下工作。在windows平台下,一个与libpcap 很类似的函数包 winpcap 提供捕获功能,其官方网站是http://winpcap.polito.it/。?????2. libpcap捕包过程2.1???? 数据包基本捕包流程?具体的Linux数据包处理流程如图1 所示。数据包从网卡经过内核最终到达用户空间的应用程序,其中经过三次处理:中断服务、软中断和应用程序,使用三个缓存:DMA、包队列和插口。在网卡驱动中存在运行时内存分配,从内核到用户态时存在一次内存拷贝。???通过对图 1 进行分析可知,以下几个方面的问题可能会限制系统数据包的捕获处理能力:1)处理流程单一:整个处理流程串行化,其处理能力受限于整个流程的任何一处“短板”。在多核架构系统中这样的处理方式无法发挥并行优势,存在极大的资源浪费。?2)高中断服务负荷:由于采用每接收一个数据包就产生一次中断的方式,当数据包以很高的速率到达时,即使最快的处理器也会被持续的中断服务请求占用而无法处理数据包,从而导致数据包丢失。?3)内核态到用户态上下文选择:当数据包由内核态进入用户态时会发生上下文选择切换,从而导致用户态任务延迟几毫秒开始。?4)数据拷贝和内存分配消耗:DMA 缓存、内核及用户内存间的数据拷贝占用了大量的CPU 资源。??2.2???? libpcap捕包过程???在Linux中,数据包捕获的基础是PACKET套接字,libpcap是对PACKET套接字的简单封装.上图是libpcap的结构图,图中的流程分为两部分,箭头表示数据包的流向.上图左半部由网络子系统发起,是PACKET套接字捕获数据包的过程.PACKET套接字在网络协议栈和网卡(network interface card,NIC)设备之间设置钩子函数.当协议栈通过NIC发送数据包或者NIC接收到数据包由驱动送入协议栈处理时,数据包被钩子函数捕获送入PACKET 套接字中.?PACKET套接字的核心模块包括两个部分:1) BPF(berkeley packet filter)过滤器.BPF根据用户设置的过滤规则计算应该接收的数据包长度值,如果该值比数据包的长度小,那么数据包将会被截短.特别地,如果该值为0,数据包会被PACKET套接字丢弃而直接返回协议栈进行网络层的处理.BPF在Linux中,BPF被用于内核进行数据包过滤,以减小提交给应用程序的数据包的包数和字节数,提高系统性能.?2)缓存队列(BufferQ).用于缓存供应用程序读取的数据包,如果队列长度超过了预设缓存区的长度,那么数据包将会被丢弃.共享内存队列,共享内存被划分为固定大小的帧,数据包被按顺序拷贝到帧中,然后内核设置数据有效位,表示该帧存放了一个有效的数据包.图2右半部由应用程序发起,从PACKET 套接字的缓存队列中获取数据包.在共享内存队列中,libpcap在打开NIC设备时,使用mmap 函数将共享内存映射到应用程序的虚拟空间中.libpcap根据帧大小按顺序读取缓存区.如果当前帧的数据有效位被设置,则将该数据包提交给应用程序处理,在处理完毕以后,libpcap清除当前帧的有效位,允许内核再次使用该帧;否则,libpcap使用poll()函数等待数据包的到达.与libpcap1.0之前版本相比,共享内存缓存队列减少了一次数据包拷贝和调用recvmsg()进入、退出内核态的系统开销,因此有较大的性能提升。??把上面比较抽象的文字翻译成一个简单的示例图如下所示

文档评论(0)

1112111 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档