Linux

tcpdump 從哪個級別的網路堆棧獲取資訊?

  • October 22, 2011

當我在這裡嘗試修復有故障的乙太網控制器時徒勞無功,我嘗試的一件事是在機器上執行 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 的功能,有人可以向我解釋它是如何檢測到軟體中失去的數據包的嗎?

是的。通過將網路介面置於混雜模式,tcpdump 能夠準確地看到網路介面輸出(和輸入)的內容。

tcpdump 在 layer2 + 執行。它可用於查看乙太網、FDDI、PPP 和 SLIP、令牌環以及 libpcap 支持的任何其他協議,這些協議完成了 tcpdump 的所有繁重工作。

查看pcap 手冊頁的 pcap_datalink() 部分,了解 tcpdump(通過 libpcap)可以分析的第 2 層協議的完整列表。

閱讀tcpdump 手冊頁將使您很好地了解 tcpdump 和 libpcap 與核心和網路介面的介面如何能夠讀取原始數據鏈路層幀。

引用自:https://unix.stackexchange.com/questions/23060