tcpdump 从网络堆栈的哪个级别获取信息?

Eri*_*ric 13 linux networking ethernet tcp tcpdump

当我试图在这里修复一个有故障的以太网控制器时,我尝试的一件事是在机器上运行 tcpdump。

我发现有趣的是,tcpdump 能够检测到 ping 应用程序认为它发送的某些 ICMP 数据包实际上并未通过网络发送出去,即使它在同一台机器上运行。我在这里复制了那些 tcpdump 结果:

14:25:01.162331 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 1, length 64
14:25:02.168630 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 2, length 64
14:25:02.228192 IP 74.125.224.80 > debian.local: ICMP echo reply, id 2334, seq 2, length 64
14:25:07.236359 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 3, length 64
14:25:07.259431 IP 74.125.224.80 > debian.local: ICMP echo reply, id 2334, seq 3, length 64
14:25:31.307707 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 9, length 64
14:25:32.316628 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 10, length 64
14:25:33.324623 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 11, length 64
14:25:33.349896 IP 74.125.224.80 > debian.local: ICMP echo reply, id 2334, seq 11, length 64
14:25:43.368625 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 17, length 64
14:25:43.394590 IP 74.125.224.80 > debian.local: ICMP echo reply, id 2334, seq 17, length 64
14:26:18.518391 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 30, length 64
14:26:18.537866 IP 74.125.224.80 > debian.local: ICMP echo reply, id 2334, seq 30, length 64
14:26:19.519554 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 31, length 64
14:26:20.518588 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 32, length 64
14:26:21.518559 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 33, length 64
14:26:21.538623 IP 74.125.224.80 > debian.local: ICMP echo reply, id 2334, seq 33, length 64
14:26:37.573641 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 35, length 64
14:26:38.580648 IP debian.local > 74.125.224.80: ICMP echo request, id 2334, seq 36, length 64
14:26:38.602195 IP 74.125.224.80 > debian.local: ICMP echo reply, id 2334, seq 36, length 64
Run Code Online (Sandbox Code Playgroud)

请注意 seq 编号如何跳跃多次……这表明 ping 应用程序生成的数据包实际上并未离开盒子。

这让我想到了我的问题:tcpdump 如何能够检测到 ICMP 数据包实际上没有出去?它是否能够以某种方式直接监控线路上的内容?

如果它确实实现了这一点,我认为它是通过与内核的某些部分接口,而内核又与作为网络控制器标准部分的某些硬件接口。

即便如此,这也很酷!如果这实际上不是 tcpdump 的功能,有人可以向我解释它是如何检测到软件中丢失的数据包的吗?

Tim*_*edy 14

是的。通过将网络接口置于混杂模式,tcpdump 能够准确查看出(和入)网络接口的内容。

tcpdump 运行在 layer2+。它可用于查看以太网、FDDI、PPP 和 SLIP、令牌环以及 libpcap 支持的任何其他协议,这些协议完成了 tcpdump 的所有繁重工作。

查看pcap 手册页的 pcap_datalink() 部分,了解 tcpdump(通过 libpcap)可以分析的第 2 层协议的完整列表。

阅读tcpdump 手册页将使您很好地理解 tcpdump 和 libpcap 与内核和网络接口的接口究竟如何才能读取原始数据链路层帧。