一、架构图

1、Linux 网络栈

2、Libpcap 抓包系统模型

3、libpcap 机制涉及的相关内容
4、基于 libpcap 的抓包工具和常规应用程序使用不同的包处理路径(注意:此处的 libpcap 是基于 PF_PACKET 的标准版本)

5、细化了 libpcap 的包处理路径(但没有明确指明 BPF 和 tap)

6、更加细化了 libpcap 的包处理路径,并明确给出了 libpcap 的组成部分有 BPF 和 tap ;但没有提及 libpcap 是在数据链路层上通过旁路进行的包处理,实际通过网络分接头(tap)从位于数据链路层的 NIC driver 中进行的数据包拷贝;



7、基于 BPF 和 ZC BPF 的标准 libpcap 实现是如何进行数据包读取的

二、数据包接收


这张图给出了很多信息:

  • 可能导致丢包问题的两处缓冲区:Ring Buffer 和 poll_queue (per CPU);其中 poll_queue 的 size 由内核参数 net.core.netdev_max_backlog 决定,默认为 1000 ;
  • 数据包(由网卡驱动程序)通过 DMA 方式从 NIC Rx queue 拷贝到操作系统内核内存中(Ring Buffer中保存的是内存索引);
  • IRQ 和 softirq


这张图提供的有用信息:

  • 图中 Poll List 即前图中的 Poll_queue (per CPU) ;
  • Poll List 每个 CPU 一个,也称之为backlog ,注意和图中 Socket backlog 进行区分;
  • 图中给出了 IP 层和 TCP 层的位置,以及两种类型backlog 所处位置;


上图给出了(单队列网卡)包处理相关的更多信息:

  • 物理层:NIC RX queue、NIC memory 和 NIC controller ;
  • 链路层:NIC driver、NAPI、Ring Buffer
  • 网络层:PF_PACKET 数据包通过 DMA 方式从物理层 NIC RX queue 拷贝到操作系统内存中;
  • NIC memory 中维护的是用于在 Ring Buffer 中进行位置定位的指针;而 Ring Buffer 中的内容为指向保存 DMA 拷贝包的操作系统内存的指针; NIC controller 通过 NIC memory 中的信息定位 Ring Buffer 的 head 位置,之后触发 IRQ 给 CPU0 ; CPU0 通过 NIC driver、NAPI 机制、PF_PACKET,以及 softirq 完成对操作系统内存中数据包的获取;

多队列网卡与单队列网卡的差别:

  • NIC memory 维护多个 Ring Buffer 的 head/tail 索引信息;
  • 链路层中包含多个 Ring Buffer(针对每个 RX queue 存在一个)

三、libpcap抓包原理

libpcap (Packet Capture Library),即数据包捕获函数库,是 Unix/Linux 平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的 API 接口,为底层网络监测提供了一个可移植的框架。

3.1 libpcap 工作原理

libpcap 主要由两部份组成:

  • 网络分接头(Network Tap)
  • 数据过滤器(Packet Filter)

网络分接头从网络设备驱动程序(NIC driver)中收集数据拷贝,过滤器决定是否接收该数据包。Libpcap 利用 BSD Packet Filter (BPF) 算法对网卡接收到的链路层数据包进行过滤。

BPF 算法的基本思想:在有 BPF 监听的网络中,网卡驱动将接收到的数据包复制一份交给 BPF 过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的哪些内容,然后将过滤后的数据交给与过滤器相关联的上层应用程序。

libpcap 的包捕获机制:在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap 首先利用已经创建的类型为 PF_PACKET 的 Socket ,从位于链路层中的 NIC driver 中获得数据包的拷贝,再通过 Tap 函数将数据包发给 BPF 过滤器。BPF 过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,进而传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户缓冲区。

3.2 libpcap 的抓包框架

  • pcap_lookupdev() 函数用于查找网络设备,返回可被 pcap_open_live() 函数调用的网络设备名指针。
  • pcap_open_live()函数用于打开网络设备,并且返回用于捕获网络数据包的数据包捕获描述字。对于此网络设备的操作都要基于此网络设备描述字。
  • pcap_lookupnet() 函数获得指定网络设备的网络号和掩码。
  • pcap_compile()函数用于将用户制定的过滤策略编译到过滤程序中。
  • pcap_setfilter() 函数用于设置过滤器。
  • pcap_loop() 函数pcap_dispatch() 函数用于捕获数据包,捕获后还可以进行处理,此外 pcap_next() 和 pcap_next_ex()两个函数也可以用来捕获数据包。
  • pcap_close() 函数用于关闭网络设备,释放资源。

3.3 libpcap-mmap

libpcap-mmap 是 libpcap 的一个改进版本,它们捕获数据包的结构相同。不同的地方主要有以下两点:

libpcap 使用固定大小的存储缓冲器保持缓冲器来完成数据包从内核缓冲区到用户缓冲区的传递,而 libpcap-mmap 设计了一个大小可以配置的循环缓冲器,允许用户程序和内核程序同时对该循环缓冲器的不同数据区域进行直接的读取。

在 libpcap 中,当网卡接收到一个数据包之后,网卡驱动程序通过 DMA 方式调用系统函数 netif_rx() 将数据包从网卡(Rx queue)拷贝到核心态内存,应用程序想访问位于核心态内存的数据时,就必须将数据包从核心态内存中拷贝到用户态内存中(即两次拷贝问题),这种方式会占用了很多系统资源,降低数据包捕获的性能以及对数据包的处理能力。而 libpcap-mmap 采用 MMAP 技术,建立核心态内存和用户态内存的映射,将系统分配给网卡设备文件的核心态内存映射到一块用户态内存,这样应用程序就可以通过系统函数 recvfrom() 把数据包从网卡设备文件对应的核心态内存上直接传送到用户态内存;

原文链接:https://my.oschina.net/moooofly/blog/898798

libpcap-mmap分析(五)相关推荐

  1. nux 平台的 libpcap 源代码分析

    nux 平台的 libpcap 源代码分析 施聪 (javer@163.com), 高级程序员.网络设计师 简介: libpcap 是 unix/linux 平台下的网络数据包捕获函数包,大多数网络监 ...

  2. ML之NBLoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+TfidfVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测

    ML之NB&LoR:利用NB(朴素贝叶斯).LoR(逻辑斯蒂回归)算法(+TfidfVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析-五分类预测 目录 输出结果 ...

  3. ML之NBLoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测

    ML之NB&LoR:利用NB(朴素贝叶斯).LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析-五分类预测 目录 输出结果 ...

  4. Linux ALSA音频框架分析五:HDA Driver分析

    Linux ALSA音频框架分析五:HDA Driver分析 一 概述 HDA(High Definition Audio)是intel设计的用来取代AC97的音频标准,硬件架构上由hda dodec ...

  5. NLP之TEA之NB/LoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+TfidfVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测

    NLP之TEA之NB/LoR:利用NB(朴素贝叶斯).LoR(逻辑斯蒂回归)算法(+TfidfVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析-五分类预测 目录 输出结 ...

  6. NLP之TEA之NB/LoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测

    NLP之TEA之NB/LoR:利用NB(朴素贝叶斯).LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析-五分类预测 目录 输出结 ...

  7. 基于 linux 平台的 libpcap 源代码分析

    libpcap 是 unix/linux 平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础.Libpcap 可以在绝大多数类 unix 平台下工作,本文分析了 libpcap 在 linu ...

  8. libpcap 源代码分析(二)

    网络监控 绝大多数的现代操作系统都提供了对底层网络数据包捕获的机制,在捕获机制之上可以建立网络监控(Network Monitoring)应用软件.网络监控也常简称为sniffer,其最初的目的在于对 ...

  9. 五年级计算机学情分析,五年级学情分析

    与<五年级学情分析>相关的范文 2016届文学类文本阅读典型题例 (2016年6月高考前版本) 散文类文本 高考题:见<2011-2015年江苏高考语文试题汇编> ●2011江 ...

  10. 月考分析五年级英语html,五年级英语月考总结

    五年级英语月考总结 针对此次月考出现的问题,现总结如下: 1.短语.学生对于短语的理解记忆不够扎实,理解片面化,很多短语曲解了其本意,没有结合实际语言环境,翻译过于死板. 2.单词.在单词各种形式的转 ...

最新文章

  1. 数字孪生技术从概念走向实际应用
  2. 使用Qt Assistant
  3. PL/SQL工具执行SQL脚本文件
  4. 易优Eyoucms企业建站系统 1.4.2
  5. vSAN其实很简单-重启大法真的适用于vSAN吗?
  6. 300G的python资料等着你
  7. 我的世界java营火如何合成_我的世界:营火在1.15版本中得到加强?它的六个用途别忘了!...
  8. 头条搜集的Redis视频教程
  9. ARM学习日记--开发板的使用
  10. 虚拟专用网络安全技术
  11. 寂静岭2java攻略_寂静岭2攻略
  12. 经典Java题目:输入一个数字,输出它的大写汉字(阿拉伯数字转汉字)
  13. BZOJ3560 DZY Loves Math V
  14. Vuex 之二:3种拿到 state 中数据并执行 getters 中方法的过程与实例剖析
  15. 一些好用的手机软件分享
  16. oracle 纵列 转 横列,oracle sql小结(主要讲横列转换的例子)decode 以及case
  17. poj 1659 Havel-hakimi定理
  18. jenkins配置报错,javax.servlet.ServletException: java.lang.RuntimeException: ssh executable not found.
  19. 欧几里得扩展欧几里得算法及相关的数学证明
  20. INE深圳硅谷双线发布演讲实录 | CEOCTO羽睿-去中心化的最后一块版图

热门文章

  1. python用于什么-Python用于哪些领域
  2. python编程入门经典实例-总算明了python编程入门经典实例
  3. python序列类型-Python内置序列类型之集合类型详解
  4. python电脑配置要求cpu-Python限制内存和CPU使用量的方法(Unix系统适用)
  5. python3.7.2安装-Centos7.6,安装python3.7.2
  6. 流程的python-什么时候学流畅的python合适?
  7. python系统-python实现用户登录系统
  8. monty python-Monty Python
  9. python编程小学生学好吗-小学生都开始学的Python编程到底是什么?
  10. python线下培训-Python培训是应该选择线上还是线下呢?