我有两个虚拟机通过 10G 网卡相互连接,现在在一个虚拟机上,我正在使用 libpcap 以连续流的方式播放 pcap 文件中的数据包,在虚拟机的另一端,我正在使用 tcpdump 捕获传入数据包、数据包间隔不是恒定的,但看起来正在缓冲传入数据包的数量,然后附加时间戳,写入 pcap 文件
输入:16包连续流 预期输出:16 个数据包,数据包间隔不断增加
使用的tcpdump命令:
sudo tcpdump -i eth0 --立即模式-w tcp_replay_capture_timestamp1.pcap --时间戳精度纳米
现实:在 5-6 个传入数据包之后,数据包会以较小的时间戳间隔写入 pcap 文件
涉及多个缓冲区。
一是抓包机制中的缓冲区;因为这可能是 Linux(根据设备名称“eth0”),
--immediate-mode
应该防止数据包在超时情况下被缓冲和批量传送。
另一个是标准I/O库机制完成的缓冲。 Tcpdump 使用 libpcap 写入捕获文件,libpcap 使用标准 I/O 库例程
fwrite()
写入使用 fopen()
打开的流,并且该机制缓冲数据,将其写入捕获文件(使用 write()
当标准 I/O 缓冲区(大小可能至少在 1KB 到 4KB 之间,甚至可能更大)时调用)。
要使 tcpdump 刷新每个数据包的缓冲区,以便数据包到达时数据立即出现在文件中,请使用
-U
标志。如果 tcpdump 足够新来支持该标志,并且如果 libpcap 足够新来支持刷新缓冲区,那么这应该会导致数据包一到达就被写入文件。