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 可以使用现有的系统调用“捕获”原始网络数据包(带有时间戳)。