Linux
tcpdump 在擷取期間將 UDP 數據包中的有用數據截斷為 1472 字節
我正在編寫一個與網路一起使用的應用程序。要執行一些測試,我需要重現前一天的流程。但同時不允許停止目前工作的監聽器。我也無法重寫現有程序以保存傳入流。為了解決我的任務,我決定使用 tcpdump。
我使用以下命令在目標機器上執行 tcpdump:
tcpdump -w capture.cap -n "dst host host.domain.com and port 5555"
當我使用 tcpick 或 scapy 閱讀 capture.cap 時。我可以看到所有長於 1472 字節的有用數據都被截斷為長度為 1472。但在標頭中仍然寫入了數據包的原始長度。正如我可以判斷的那樣,UDP數據包分成幾個然後再次連接。但是 tcpdump 可能會過濾掉所有沒有標頭的包(應該只出現在第一個包中)
有沒有辦法轉儲完整的 UDP 包?
如果 IP 數據包大於發送數據包的網路鏈路的 MTU,IP 會將其分段為適合網路的 IP 數據包;這是由 IP 層完成的,而不是 UDP 層。
乙太網的 MTU 通常為 1500 字節(乙太網數據包最大大小為 1518,其中包括 14 字節的報頭、1500 字節的有效負載和 4 字節的 FCS)。如果沒有選項,IPv4 標頭為 20 字節,而 UDP 標頭為 8 字節,因此最大 UDP 有效負載大小為 1500-28 = 1472。
因此IP將數據包分成兩個或多個片段,並在接收機器上重新組合它們。
有關為什麼 tcpdump 不擷取除第一個片段以外的任何片段的討論,請參閱相關問題。