当我徒劳地尝试修复有故障的以太网控制器时这里,我尝试的一件事是在机器上运行 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
请注意 seq 编号如何跳跃几次...这表明 ping 应用程序生成的数据包实际上并未离开盒子。
这让我想到了我的问题:tcpdump 如何检测到 ICMP 数据包实际上并未发出?它是否能够以某种方式直接监控线路上的内容?
如果它确实实现了这一点,我认为它是通过连接到内核的某些部分,而内核又连接到作为网络控制器的标准部分的某些硬件。
即便如此,这也太酷了吧!如果这实际上不是 tcpdump 的功能,有人可以向我解释它是如何检测软件中丢失的数据包的吗?
答案1
是的。通过将网络接口置于混杂模式,tcpdump 能够准确地查看网络接口出(入)的内容。
tcpdump 在 Layer2+ 上运行。它可用于查看以太网、FDDI、PPP 和 SLIP、令牌环以及 libpcap 支持的任何其他协议,libpcap 完成了所有 tcpdump 的繁重工作。
看一下 pcap_datalink() 部分pcap 手册页有关 tcpdump(通过 libpcap)可以分析的第 2 层协议的完整列表。
阅读了tcpdump 手册页将使您很好地了解 tcpdump 和 libpcap 与内核和网络接口究竟如何能够读取原始数据链路层帧。