版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于Linux平台的libpcap源码分析和优化 目录1. libpcap简介. 12. libpcap捕包过程. 22.1 数据包基本捕包流程. 22.2 libpcap捕包过程. 42.3 libpcap 1.3.0源码对照. 62.3.1
2、0; 创建环形队列. 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平台下的网络数据包捕获函数包,大多数网络监
3、控软件都以它为基础。Libpcap可以在绝大多数类unix平台下工作.Libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。Libpcap可以在绝大多数类unix平台下工作。在windows平台下,一个与libpcap 很类似的函数包 winpcap 提供捕获功能,其官方网站是http:/winpcap.polito.it/。 2. libpcap捕包过程2.1 数据包基本捕包流程 具体的Linux数据包处理流程如图1 所示。数据包从网卡经过内
4、核最终到达用户空间的应用程序,其中经过三次处理:中断服务、软中断和应用程序,使用三个缓存:DMA、包队列和插口。在网卡驱动中存在运行时内存分配,从内核到用户态时存在一次内存拷贝。 通过对图 1 进行分析可知,以下几个方面的问题可能会限制系统数据包的捕获处理能力:1)处理流程单一:整个处理流程串行化,其处理能力受限于整个流程的任何一处“短板”。在多核架构系统中这样的处理方式无法发挥并行优势,存在极大的资源浪费。 2)高中断服务负荷:由于采用每接收一个数据包就产生一次中断的方式,当数据包以很高的速率到达时,即使最快的处理器也会被持续的中断服务请求占用而无
5、法处理数据包,从而导致数据包丢失。 3)内核态到用户态上下文选择:当数据包由内核态进入用户态时会发生上下文选择切换,从而导致用户态任务延迟几毫秒开始。 4)数据拷贝和内存分配消耗:DMA 缓存、内核及用户内存间的数据拷贝占用了大量的CPU 资源。 2.2 libpcap捕包过程 在Linux中,数据包捕获的基础是PACKET套接字,libpcap是对PACKET套接字的简单封装上图是libpcap的结构图,图中的流程分为两部分,箭头表示数据包的流向上图左半部由网络子系统发
6、起,是PACKET套接字捕获数据包的过程PACKET套接字在网络协议栈和网卡(network interface card,NIC)设备之间设置钩子函数当协议栈通过NIC发送数据包或者NIC接收到数据包由驱动送入协议栈处理时,数据包被钩子函数捕获送入PACKET 套接字中 PACKET套接字的核心模块包括两个部分:1) BPF(berkeleypacket filter)过滤器BPF根据用户设置的过滤规则计算应该接收的数据包长度值,如果该值比数据包的长度小,那么数据包将会被截短特别地,如果该值为,数据包会被PACKET套接字丢弃而直接返回协议栈进行网络层的处理BPF在Linux中,B
7、PF被用于内核进行数据包过滤,以减小提交给应用程序的数据包的包数和字节数,提高系统性能 2)缓存队列(BufferQ)用于缓存供应用程序读取的数据包,如果队列长度超过了预设缓存区的长度,那么数据包将会被丢弃共享内存队列,共享内存被划分为固定大小的帧,数据包被按顺序拷贝到帧中,然后内核设置数据有效位,表示该帧存放了一个有效的数据包图2右半部由应用程序发起,从PACKET 套接字的缓存队列中获取数据包在共享内存队列中,libpcap在打开NIC设备时,使用mmap 函数将共享内存映射到应用程序的虚拟空间中libpcap根据帧大小按顺序读取缓存区如果当前帧的数据有效位被设置,则将该数据包提
8、交给应用程序处理,在处理完毕以后,libpcap清除当前帧的有效位,允许内核再次使用该帧;否则,libpcap使用poll()函数等待数据包的到达与libpcap1.0之前版本相比,共享内存缓存队列减少了一次数据包拷贝和调用recvmsg()进入、退出内核态的系统开销,因此有较大的性能提升。 把上面比较抽象的文字翻译成一个简单的示例图如下所示: 2.3 libpcap 1.3.0源码对照 对应于libpcap 1.3.0源代码如下:2.3.1 创建环形队列主要步骤:1.setup
9、socket() -> creation of the capture socket2.setsockopt() -> allocation of the circular buffer (ring)3.mmap() -> maping of the allocated buffer to theuser process对应libpcap-1.3.0源代码:static intcreate_ring(pcap_t *handle, int *status)函数中:2.pcap-linux.c:3594行 if (setsockopt(handle->fd, SOL_PA
10、CKET, PACKET_RX_RING, (void *) &req, sizeof(req) 3.Pcap-linux.c:3627行 handle->md.mmapbuf = mmap(0, handle-
11、>md.mmapbuflen, PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0); 2.3.2 捕获数据包capture poll() -> to wait for incoming packetsprocesstrigger the user processreset frame reset the status of the frame for kernel to reuse 对应libpcap-1.3.0源代码:static intpcap_read_li
12、nux_mmap(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user)函数中:1.pcap-linux.c:3811行ret = poll(&pollinfo, 1, timeout);2.pcap-linux.c:4053行callback(user, &pcaphdr, bp);3.pcap-linux.c:4060行switch (handle->md.tp_version) case TPACKET_V1:h.h1->tp_status = TP_STATUS_KERNEL
13、;break; 3. libpcap捕包优化分析我们把之前2.1提到的可能会限制系统数据包的捕获处理能力的地方写出来:3.1处理流程单一: 因为原生的libpcap是单线程的,一个数据包的处理流程是“捕包处理包捕下个包-处理下个包。”所以处理包的时间长短会影响下一个捕包的开始时间,解决这个有2个办法,一个是优化处理包流程,缩短处理包时间,但这个方法治标不治本,另一个方法是用多线程的方式捕包和处理包。 3.2高中断服务负荷: 这个是操作系统捕包的关键,现在一般有2种思路A:把网卡的多个收包队列
14、中断均衡的绑定到多个不同的cpu上。(网上有很多教程)B:更换网卡驱动,可以把网卡一般现有的驱动即依赖中断接收数据包,改为轮询方式,例如现在的NAPI驱动和Intel的DPDK都有用到。 3.3内核态到用户态上下文选择:现在的libpcap1.3.0支持一次捕获多个数据包, 通过指定pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)接口中的cnt变量,而且现在的捕包不是基于recvmsg的系统调用,而是共享内存队列,所以大大减少了上下切换。 3.4数据拷贝和内存分配消耗:由于采用了现在的共享内存环形队列,即零拷贝技术,用户态和内核态只有一份数据拷贝,所以捕获每个数据包都减少了一次数据拷贝。 4. 延伸拓展4.1 libpcap多线程捕包用什么样的多线程架构方式更能发挥libpcap捕包性能? 4.2 Linux并行运算使用多线程或移植到多线程的时候,有什么注意事项? 4.3 零
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年高铁安全考试题库及答案
- 2026年营销经理考试题库(含答案)
- 2026年重庆两江新区鸳鸯社区卫生服务中心招聘考试题库带答案
- 2026年工厂电气考试题库及答案
- 2026年自贡市嘉祥外国语学校招聘备考题库带答案
- 2026年碱减量操作工三级安全教育(公司级)考核模拟试卷(含答案)
- 2026年育婴员(五级)复审考试及考试题库(含答案)
- 2026年工程质量检测管理制度
- 2026年煤矿冲击地压监测员实操试题及答案
- 2026年注册建筑师《建筑文化》模拟试卷
- 一年级上册数学期中质量检测卷(青岛版五四学制)(含答案)
- 四川省南充市高2027届高考适应性考试(一诊)(全科)数学+答案
- 2026北京市海淀区招聘社区工作者123人笔试备考试题及答案解析
- 半导体供应链韧性研究与对策分析
- 医学康复科病历书写规范培训
- 2026年秋季小学低年级班主任课堂纪律管理经验课件
- 2026秋新教材人教PEP版六年级上册英语全册教案(单元整体教学设计)
- 文书模板-城市公交客运企业安全管理检查表
- 2026版《残疾人保障和发展“十五五”规划》学习与解读
- 2026新教材语文 10《往事依依》教学课件
- 2026年广东省春季高考(学考)语文真题(含解析)
评论
0/150
提交评论