libpcap 还是 PF_PACKET?

6

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

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

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

1个回答

4
据我所知,libpcap会在每个数据包上标记时间戳。
但实际上,libpcap是从OS数据包捕获机制中获取数据包的时间戳。在Linux上,它使用的是PF_PACKET套接字。
Linux内核会为收到的数据包打上时间戳。PF_PACKET套接字有多种读取方式:
1. 普通的套接字接收,你可以通过显式ioctl获取时间戳(这样你就可以避免将其提取到用户空间,但是你无法避免内核首先给数据包打上时间戳; 当使用普通套接字接收时,libpcap总是要求获取时间戳);
2. 内存映射访问,始终提供时间戳。
只要内存映射可用,libpcap就会使用它。如果你关心捕获性能,你可能也要这么做。然而,这不容易使用。

谢谢您的解释。关于“每当可用时,Libpcap使用内存映射访问”,这是lipcap v1.0之后的功能吗?那么1.0之前的版本呢? - user2975098
是的,该支持是在 libpcap 1.0 中添加的(大约6年前);旧版本的 libpcap 没有它。 (请注意,例如 Debian libpcap 包和用于 Debian 派生版(如 Ubuntu)的软件包名称中的版本号与 libpcap 发布无关 - 在 Debian 中的“libpcap-0.8”可能具有 libpcap 1.x。) - user862787

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接