文档章节

【原创】图解抓包

摩云飞
 摩云飞
发布于 2017/05/13 13:05
字数 2344
阅读 587
收藏 0

图解抓包


在研究 libpcap 和 PF_RING 时,在网上看到了很多相关示意图,然而各种图由于侧重不同,呈现的面貌也千差万别;本文就针对这些示意图进行一些总结性说明;

由于水平有限,解释说明难免有所纰漏,望各路大神不吝指教!!

Linux 网络栈

Linux 网络栈

Libpcap 抓包系统模型

Subsystems involved in the capturing process

上图为 libpcap 机制涉及的相关内容(简化);

Libpcap 的包捕获机制

上图为 libpcap 机制涉及的相关内容(详细);

tcpdump程序调用模型

上图标明基于 libpcap 的抓包工具和常规应用程序使用不同的包处理路径(注意:此处的 libpcap 是基于 PF_PACKET 的标准版本);

Elements involved in the capture process

这张图细化了 libpcap 的包处理路径(但没有明确指明 BPF 和 tap);

libpcap工作原理

packet path

抓包流程

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

BPF and ZC BPF

上图描述了基于 BPF 和 ZC BPF 的标准 libpcap 实现是如何进行数据包读取的;

数据包接收

linux-server-packet-fig

这张图给出了很多信息:

  • 可能导致丢包问题的两处缓冲区: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 存在一个)

PF_RING 相关

Hardware Acceleration

硬件加速卡的实现:FPGA + NIC Memory Map 关键:专用、昂贵

PF_RING DNA

PF_RING DNA 对 Vanilla PF_RING 的改进:NIC NPU + NIC Memory Map 关键:常规 Commodity NIC 即可达到专用硬件加速卡效果;

PF_RING

PF_RING Internals

Socket Packet Ring (PF_RING)

PF_RING Internals

值得注意的一个细节:

  • netif_receive_skb() 对应 NAPI
  • netif_rx() 对应 No NAPI

PF_RING Packet Journey

PF_RING Packet Journey - 1

PF_RING Packet Journey - 2

libpcap v.s. PF_RING

PF_RING and legacy architecture

PF_RING 的地位和 PF_PACKET 是类似的,本质上都是向内核注册了一种 socket 类型;图中有一个地方画错了,即 Linux Network Stack 上方应该是非抓包的其它服务,如 telnet 和 tftp 等;

PF_RING and PF_PACKET under Linux

基于 PF_PACKET 和 PF_RING 两种方式下的包处理路径对比:明显 PF_RING 路径更短;这也就是为何 PF_RING 速度更快,更不容易丢包的原因;

另外,需要注意,Ethernet driver 和 Low-level packet reception 之间的 netif_rx()/netif_receive_skb() 分别对应了 No NAPI 和 NAPI ;而从 Ethernet driver 上进行包搬移操作的应该是之前提及的、作为 libpcap 组成部分之一的、网络分接头 tap ;

PF_RING is a replacement for PF_PACKET that not only uses memory mapping instead of processing expensive buffer copies from kernel space to userspace, but it also uses ring buffers making to transportation in a more efficient way.

NAPI v.s. TNAPI

NAPI

Enhanced NIC Drivers_Linux NAPI

Linux NAPI Limitations

上面两图说明:传统的 NAPI + RSS 方案存在问题,即 NAPI 对多 RX queue 是顺序轮询的,并且在 driver 和用户应用的接口层存在 Merge & Split 等资源竞争问题;

TNAPI

Enhanced NIC Drivers_TNAPI

上图说明:基于 TNAPI + PF_RING 解决了传统 NAPI 方案遇到的问题;

Explaiting PF_RING Multi-Queue_nProbe

nCap and Legacy


libpcap抓包原理

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

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 过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,进而传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户缓冲区。

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() 函数用于关闭网络设备,释放资源。

libpcap-mmap

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

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

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


Libpcap is one of the more vastly open source library for packet capturing and uses by default PF_PACKET protocol in order to transfer the packets from the driver to the userspace.

It is the de facto library that facilitates the packet transition from kernel onto the userspace is libpcap. It provides an API for the programmer to select the capturing interface (device) and gives the ability to compile Linux Packet Filters (LPF) into the kernel for selective packet capturing based on the 5 tuple (protocol, source/destination IP address and source/destination port).

One important feature of PF_RING is the way it exchanges packets between user space and kernel: Monitoring applications usually access a library like libpcap to retrieve captured packets from the kernel. Libpcap is an abstraction from the operating systems’ capturing mechanisms and allows to run a capturing application on several operating systems without porting it to the special capturing architecture. Back in 2004, the then current libpcap version 0.9.8 used a copy operation to pass packets from the kernel to the user space on Linux. An unofficial patch against that libpcap version from Phil Woods existed, which replaced the copy operation by a shared memory area that was used to exchange packets between kernel and application. This modification will be called MMAP throughout the rest of the paper. PF RING uses a similar structure to exchange packets by default. Libpcap version 1.0.0, which was released in late 2008, is the first version that ships built-in shared memory (SHM) exchange support; hence the patch from Phil Woods is not longer necessary.

© 著作权归作者所有

摩云飞
粉丝 371
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
用 Wireshark 图解:TCP 三次握手

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “snow warn throughout the winter” 一、什么是 Wireshark ? 简单地说,Wireshark 是抓包工具。官网说,“W...

泥沙砖瓦浆木匠
2016/11/22
74
0
监控io性能/free命令/ps命令/查看网络状态/linux下抓包

监控io性能 使用iostat命令查看磁盘负载情况 重点关注:%util占比,如果这个值越大则表示你的硬盘越忙,这也会是你系统变慢的原因; 查看具体哪个进程在读写,使用iotop,首次使用需要Yum安装...

Hi_Yolks
2018/07/11
0
0
LoRa Gateway 笔记 3.1.3 帮助程序 util_pkt_logger 进行 LoRa 空口抓包

版权声明:本文为twowinter原创文章,请联系微信公众号twowinter,未经博主允许不得转载。 https://blog.csdn.net/iotisan/article/details/90180761 文章目录 前言 以前小能手使用 SX1276 做...

iotisan
05/13
0
0
Wireshark抓取网易音乐的下载地址

版权声明:本文为LeeKwen的原创文章,请联系微信@leekwenty后转载。 https://blog.csdn.net/leekwen/article/details/78870526 如果通过抓包的技术,那么几乎所有的音乐都能找到链接! 以网易...

Leekwen
2017/12/22
0
0
Wireshark抓包与流向ip的国家城市检索

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tj134679258/article/details/80908792 最近笔者游戏在做台湾版本,对于大陆版本已知到台湾版本,与前几年项目...

滕云麒麟
2018/07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅析大数据 学习大数据后能做什么

大数据时代的到来使得大数据开发人才迎来了前所未有的机遇和挑战!一个绝佳的入行机会摆在了众人面前!于是,很多人都在打听,大数据到底有何应用?可以用来做什么?好程序员今天就为大家作出...

好程序员IT
17分钟前
1
0
C# USB视频人脸检测

此程序基于 虹软人脸识别进行的开发 SDK下载地址:https://ai.arcsoft.com.cn/ucenter/user/reg?utm_source=csdn1&utm_medium=referral 前提条件 从虹软官网下载获取ArcFace引擎应用开发包,...

是哇兴哥棒棒哒
28分钟前
2
0
Vagrant虚拟机硬盘扩容

# 停止虚拟机vagrant halt <machine_name># 进入VirtualBox VMs目录,查看并记录原磁盘uuid,留作后用vboxmanage showhdinfo box-disk1.vmdk# 克隆磁盘,vmdk格式无法调整大小,需要...

sskill
29分钟前
1
0
分布式商业萌芽,银行迎来发展新机遇

01 分布式商业萌芽,银行迎来发展新机遇 金融界:近几年区块链的热度经历了过山车般的转折。目前追逐区块链的资本也开始冷静下来,于此同时,各大商业银行对区块链的研究应用也越来越多。您认...

Java领航员
35分钟前
2
0
Spring系列教程六: Spring jdbcTemplate在Dao中的使用

概念 Spring中的jdbcTemplate的主要作用是实现数据的交互,下面我们就在dao层中如何使用jdbctemplate写测试案例 项目目录如下 基于xml实现jdbctemplate 这里我们使用的是JdbcDaoSupport这个类...

我叫小糖主
38分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部