libpcap原理及优化

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
libpcap根据帧大小按顺序读 取缓存区.如果当前帧的数据有 效位被设置,则将该数据包提交 给应用程序处理,在处理完毕以 后,libpcap清除当前帧的有效 位,允许内核再次使用该帧;否 则,libpcap使用poll函数等待数 据包的到达。
相比libpcap1.0之前版本,共享内存缓存队列减少了一次数据包拷贝和调 用recvmsg、退出内核态的系统开销,因此有较大的性能提升
Libpcap原理及优化
Mail : Author : panda-bob
Linux数据包处理流程
具体的Linux数据包处理流程如图 1所示。数据包从网卡经过内核最终 到达用户空间的应用程序,其中经过 三次处理:中断服务、软中断和应用 程序。使用三个缓存:DMA、包队列 和插口。在网卡驱动中存在运行时内 存分配,从内核到用户态时存在一次 内存拷贝。
限制系统数据包的捕获处理能力可能原 因
① 处理流程单一:整个处理流程串行化,其处理能力受限于整个流程的 任何一处“短板”。在多核架构系统中这样的处理方式无法发挥并行 优势,存在极大的资源浪费。
② 高中断服务负荷:由于采用每接收一个数据包就产生一次中断的方式, 当数据包以很高的速率到达时,即使最快的处理器也会被持续的中断 服务请求占用而无法处理数据包,从而导致数据包丢失。
PACKET套接字的两大核心模块
1、BPF(berkeley packet filter)过滤器 BPF根据用户设置的过滤规则计算应该接收的数据包长度值,如果该值比数
据包的长度小,那么数据包将会被截短.特别地,如果该值为0,数据包会被 PACKET套接字丢弃而直接返回协议栈进行网络层的处理.BPF在Linux中,BPF被 用于内核进行数据包过滤,以减小提交给应用程序的数据包的包数和字节数,提 高系统性能。 2、缓存队列(BufferQ)
Libpcap 1.0.0 以后捕包不是基于recvmsg的系统调用,而是共享内存队列mmap 内存拷贝采用:共享内存队列
特别说明:Linux centos7 3.10.0+ 需要关闭TPACKETV3 版本的packet_mmap, 使用系统软件仓库中的libpcap ,自己编译安装需要使用TPACKETV2。
③ 内核态到用户态上下文选择:当数据包由内核态进入用户态时会发生 上下文选择切换,从而导致用户态任务延迟几毫秒开始。
④ 数据拷贝和内存分配消耗:DMA 缓存、内核及用户内存间的数据拷贝 占用了大量的CPU 资源
Libpcap捕包过程
在Linux中,数据包捕获的基础是 PACKET套接字,libpcap是对PACKET套 接 字 的 简 单 封 装 。 图 2 是 libpcap 的 结 构图,图中的流程分为两部分,箭头 表示数据包理包,由于处理包比较耗时,捕包与处理包应该分离
优化高中断服务
操作系统捕包优化: 1、把网卡的多个收包队列中断均衡的绑定到多个不同的CPU上 2、更换网卡驱动,可以把网卡一般现有的驱动即依赖中断接收数据包, 改为轮询方式,例如现在的NAPI驱动和Intel的DPDK
内核态到用户态上下文切换
左半部由网络子系统发起,是 PACKET 套 接 字 捕 获 数 据 包 的 过 程 。 PACKET 套 接 字 在 网 络 协 议 栈 和 网 卡 (network interface card , NIC)设备之间 设置钩子函数。
当 协 议 栈 通 过 NIC 发 送 数 据 包 或 者 NIC 接 收 到 数 据 包 由 驱 动 送 入 协 议 栈处理时,数据包被钩子函数捕获送 入PACKET 套接字中
用于缓存供应用程序读取的数据包,如果队列长度超过了预设缓存区的长度, 那么数据包将会被丢弃。共享内存队列,共享内存被划分为固定大小的帧,数据 包被按顺序拷贝到帧中,然后内核设置数据有效位表示该帧存放了一个有效的数 据包。
共享内存循环队列
在共享内存队列中,libpcap 在打开NIC设备时,使用mmap函数 将共享内存映射到应用程序的虚 拟空间中。
相关文档
最新文档