我正在写一个与networking一起工作的应用程序。 为了执行一些testing,我需要重现一天之前的stream程。 但同时也不允许停止当前的工作倾听者。 我也不能重写现有的程序,以保存传入的stream量。 为了解决我的任务,我决定使用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数据包大于发送数据包的networking链路的MTU,则IP会将数据包分解成适合networking的IP数据包; 这是由IP层完成的,而不是UDP层完成的。
以太网的MTU一般为1500字节(以太网报文的最大长度为1518,包括14个字节的报头,1500个字节的有效载荷和4个字节的FCS)。 如果IPv4头没有选项,则它的长度是20个字节,而UDP头的长度是8个字节,所以最大的UDP净荷大小是1500-28 = 1472。
所以IP将数据包分成两个或多个片段,然后在接收机上重新组装。
请参阅相关问题,了解为什么tcpdump没有捕获除第一个片段以外的任何片段。
使用-s 0确保捕获整个数据包/帧。 如果它是零散的,那么你会从分析转储知道。
尝试使用wireshark作为pcap数据的GUI分析器。 它会着色输出等。