tcpdump 在捕获过程中将 UDP 数据包中的有用数据截断为 1472 字节

Gav*_*ock 3 networking linux udp tcpdump

我正在编写一个与网络一起使用的应用程序。为了执行一些测试,我需要重现前一天的流程。但同时不允许停止当前工作的监听器。我也无法重写现有程序以保存传入流。为了解决我的任务,我决定使用 tcpdump。

我使用以下命令在目标机器上运行 tcpdump:

tcpdump -w capture.cap -n "dst host host.domain.com and port 5555"
Run Code Online (Sandbox Code Playgroud)

当我用 tcpick 或 scapy 阅读 capture.cap 时。我可以看到所有超过 1472 字节的有用数据都被截断为长度为 1472。但在标头中它仍然写入数据包的原始长度。我可以判断,UDP 数据包拆分为多个,然后再次连接。但是 tcpdump 可能会过滤掉所有没有标头的包(应该只出现在第一个包中)

有没有办法转储完整的 UDP 包?

小智 11

如果 IP 数据包大于发送数据包的网络链路的 MTU,IP 会将其分片为适合网络的 IP 数据包;这是由 IP 层完成的,而不是 UDP 层。

以太网的 MTU 通常为 1500 字节(最大以太网数据包大小为 1518,其中包括 14 字节的标头、1500 字节的有效载荷和 4 字节的 FCS)。如果没有选项,IPv4 标头为 20 字节,UDP 标头为 8 字节,因此最大 UDP 有效负载大小为 1500-28 = 1472。

因此IP将数据包拆分为两个或多个片段,并在接收机器上重新组装它们。

有关为什么 tcpdump 不捕获除第一个片段以外的任何片段的讨论,请参阅相关问题。