我正在编写一个与网络一起工作的应用程序。为了进行一些测试,我需要重现前一天的流量。但同时不允许停止当前正在工作的侦听器。我也无法重写现有程序以保存传入流量。为了解决我的任务,我决定使用 tcpdump。
我使用以下命令在目标机器上运行 tcpdump:
tcpdump -w capture.cap -n "dst host host.domain.com and port 5555"
当我用 tcpick 或 scapy 读取 capture.cap 时,我可以看到所有长度超过 1472 字节的有用数据都被截断为长度 1472。但在报头中仍然写入数据包的原始长度。据我判断,UDP 数据包分为几个部分,然后再次连接。但 tcpdump 可能会过滤掉所有没有报头的包(这应该只出现在第一个数据包中)
有没有什么办法可以转储完整的 UDP 包?
答案1
如果 IP 数据包大于发送该数据包的网络链路的 MTU,则 IP 会将其分片为适合网络的 IP 数据包;这是由 IP 层而不是 UDP 层完成的。
以太网的 MTU 通常为 1500 字节(以太网数据包的最大大小为 1518,其中包括 14 字节的报头、1500 字节的有效负载和 4 字节的 FCS)。如果没有选项,IPv4 报头为 20 字节,UDP 报头为 8 字节,因此 UDP 有效负载的最大大小为 1500-28 = 1472。
所以知识产权将数据包分成两个或多个片段,然后在接收机器上重新组装它们。
请参阅相关问题以了解为什么 tcpdump 没有捕获除第一个片段之外的任何片段的讨论。
答案2
使用 -s 0 可确保捕获整个数据包/帧。如果数据包/帧有碎片,您可以通过分析转储来了解。
尝试使用 wireshark 作为 pcap 数据的 GUI 分析器。它将对输出进行着色等。