【问题标题】:Why libpcap is better than sniffing with raw?为什么 libpcap 比使用 raw 嗅探更好?
【发布时间】:2020-03-18 08:58:29
【问题描述】:

如果我想在不设置任何过滤器的情况下在 linux 中嗅探数据包,我看到了 2 个选项。

  1. 使用libpcap

  2. 自己使用原始套接字,例如https://www.binarytides.com/packet-sniffer-code-in-c-using-linux-sockets-bsd-part-2/

为什么libpcap 比我自己使用原始套接字更好?

【问题讨论】:

  • “更好”的指标是什么?

标签: c linux libpcap packet-sniffers


【解决方案1】:

三个原因:

1) 正确设置更容易。

2) 它是可移植的,甚至可以移植到 Windows,它使用非常相似但不同的套接字 API。

3) 速度要快得多。

1和2,IMO,不需要太多解释。我会深入到 3。

要了解为什么 libpcap(通常)更快,我们需要了解套接字 API 中的瓶颈。

libpcap 倾向于避免的两个最大瓶颈是系统调用和副本。

如何做到这一点因平台而异。

我将讲述 Linux 的故事。

Linux,自 2.0 IIRC 起,实现了它所谓的 AF_PACKET 套接字系列,以及后来的 PACKET_MMAP。我不完全记得前者的好处,但后者对于避免从内核复制到用户空间(内核端仍有一些副本)和系统调用至关重要。

在 PACKET_MMAP 中,您在用户空间中分配一个大的环形缓冲区,然后将其关联到一个 AF_PACKET 套接字。这个环形缓冲区将包含一些元数据(最重要的是,一个表示区域是否已准备好供用户处理的标记)和数据包内容。

当数据包到达相关接口(通常是您绑定套接字的接口)时,内核会在环形缓冲区中制作一份副本,并将该位置标记为可供用户空间使用*。 如果应用程序在套接字上等待,它会收到通知*。

那么,为什么这比原始套接字更好?因为您可以在设置套接字后使用很少或没有系统调用,具体取决于您是要忙于轮询缓冲区本身还是等待poll 直到准备好几个数据包,并且因为您不需要从套接字的内部 RX 缓冲区到您的用户缓冲区,因为它与您共享。

libpcap 为您完成所有这些工作。并且可以在 Mac、*BSD 以及几乎任何为您提供更快捕获方法的平台上实现。

*在版本 3 上稍微复杂一些,粒度是“块”而不是数据包。

【讨论】:

  • 所以如果我嗅探原始数据包可能会降低我机器中的网络速度?因为它会造成瓶颈,如果我用 libpcap 嗅探我的网络不会很慢?
  • 不,它不会让您的网络变慢。内核将在数据到来时将数据复制到与给定套接字关联的内部缓冲区。如果没有空间,该套接字 将没有副本,并且计数器将递增,用作该套接字丢失数据包的统计信息。任何其他实际有空间的套接字通常会以正常速度接收数据包。您为每个套接字制作副本这一事实有一点细微差别:如果您打开太多套接字,您可能压倒网络堆栈,但这可能由 rlimit 等控制。
猜你喜欢
  • 2013-07-22
  • 2011-05-13
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2010-10-14
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多