Wireshark(libpcap)在哪里捕获数据包,在网卡还是内核?

Wireshark(libpcap)在哪里捕获数据包,在网卡还是内核?

Wireshark(libpcap)是否会在数据包仍在 NIC 中时或已传递到内核时捕获数据包?

我运行一个测试程序,该程序使用该函数等待来自 TCP 连接的消息recv,然后立即使用该send函数做出响应。然后我测量接收和发送数据包之间的延迟,该延迟由 Wireshark 中显示的时间戳来测量。我发现当我使用不同的 NIC 时,此延迟会有很大差异。这似乎表明 Wireshark 在数据包仍在 NIC 中时捕获它们,因此 NIC 处理数据包的速度反映在上述延迟中。如果捕获发生在内核,我无法解释为什么使用不同的 NIC 时延迟不同,因为它们都使用(相同的)内核网络堆栈。

但是,如果捕获确实发生在 NIC 中,这怎么可能呢?libpcap 如何以某种方式添加 NIC 本身的一些功能?

答案1

您必须假设这种捕获不能“在 NIC 中”发生。
每个 NIC 都没有通用接口;这就是为什么每个操作系统都必须使用设备驱动程序来抽象接口。您只需指定要与 Wireshark 一起使用的网络接口(例如 eth0)。您无需指定硬件的制造商/型号或设备驱动程序的名称。因此,
根据简单的逻辑,您的替代方案之一一定是错误的。

我读过一种在协议栈处理原始以太网帧之前接收它们的方法。但回答你的问题的正确方法是实际检查 GPL 源代码。

如果捕获发生在内核,我无法解释为什么使用不同的 NIC 时延迟会不同,因为它们都使用(相同的)内核网络堆栈。

(你不清楚什么“潜伏”您正在计算/测量以及它是如何变化的。

显然,您没有考虑到 Wireshark 用于捕获帧的方法可以与为帧添加时间戳的方法完全分开。Linux
支持硬件和软件生成的以太网帧时间戳。
硬件时间戳将由网络适配器生成。软件时间戳
将由 Linux 设备驱动程序生成。
详细信息请参见文档/网络/时间戳.txt

结论
Wireshark 是一个用户空间应用程序。
它只能利用操作系统通过 API 提供的功能。
由于帧的时间戳是网络子系统固有的功能,因此 Wireshark 没有义务执行自己的时间戳,而是利用操作系统的现有功能。
因此,Wireshark 可以使用现有的系统调用“捕获”原始网络数据包(带有时间戳)。

相关内容