libpcap 还是 PF_PACKET?

use*_*098 5 linux network-programming linux-kernel libpcap

我明白这个问题已经讨论过很多次了:我应该使用 libpcap 还是 PF_PACKET(数据链接套接字)来捕获数据包?

根据我的研究,几乎所有地方都建议使用 libpcap 而不是 PF_PACKET,主要是因为它的可移植性。

但是,对于我目前的项目(在生产系统中使用),可移植性根本不是问题,我关心的是性能(速度,丢包率)。我的程序在 CentOS 5.10(内核 2.6.18)上运行,据我所知,libpcap 在每个数据包上放置了一个时间戳。这会导致很大的性能损失吗?是否还有其他因素使 libpcap 不适用于高速网络?

小智 4

据我所知,libpcap 在每个数据包上放置了一个时间戳。

不,libpcap 从它使用的操作系统数据包捕获机制中获取数据包的时间戳 - 在 Linux 上是......

...PF_PACKET 套接字。

Linux 内核为传入数据包添加时间戳。PF_PACKET 套接字有多种读取方式:

  • 常规套接字接收,您可以使用显式 ioctl 获取时间戳(这样您可以避免将其获取到 userland,但您无法避免内核首先对数据包进行时间戳标记;libpcap,当使用常规套接字时接收,总是要求时间戳);
  • 内存映射访问,始终提供时间戳。

只要可用,Libpcap 就会使用内存映射访问;如果您关心捕获性能,您可能也想这样做。然而,它并不容易使用。