我正在使用tcpdump捕获网络数据包,并且在开始丢弃数据包时遇到问题。我运行了一个通过网络快速交换数据包的应用程序;导致较高的网络带宽。
>> tcpdump -i eno1 -s 64 -B 919400
126716 packets captured
2821976 packets received by filter
167770 packets dropped by kernel
Run Code Online (Sandbox Code Playgroud)
由于我只对TCP数据包中与协议相关的部分感兴趣,我想收集没有数据/有效载荷的TCP数据包。我希望这种策略也可以帮助在丢弃数据包之前捕获更多数据包。看来我只能将缓冲区大小(-B参数)增加到一定限制。即使具有更高的限制,我丢弃的数据包也比捕获的更多。
你能帮助我理解上面的信息和问题吗
来自盖·哈里斯本人:
“捕获的数据包”数字是每次tcpdump看到数据包时都会递增的数字,因此它将对tcpdump从libpcap读取的数据包进行计数,因此libpcap从BPF读取并提供给tcpdump。
“过滤器接收到的数据包”编号是对pcap_stats()的调用中的“ ps_recv”编号;对于BPF,这是BIOCGSTATS ioctl中的bs_recv编号。该计数包括所有交给BPF的数据包;这些数据包可能仍在尚未被libpcap读取的缓冲区中(因此没有传递给tcpdump),或者可能在libpcap所读取但尚未传递给tcpdump的缓冲区中,因此它可以对那些没有报告为“被俘”。
``被内核丢弃的数据包''(这是由于tcpdump运行所在的OS中的操作系统中的数据包捕获机制由于缺少缓冲区空间而丢弃的数据包的数量;如果OS向应用程序报告了该信息;如果不是,它将报告为0)。
要尝试提高捕获性能,请尝试以下几件事:
-p选项。"tcp"到您的命令来执行此操作。-w file选项执行此操作,或者如果要限制文件大小,请查看-C file_size和-G rotate_seconds选项。tcpdump调度的优先级nice。从Wireshark的Performance Wiki页面:
尝试使用PF_RING。
您也可以尝试使用dumpcap代替tcpdump,尽管如果性能完全不同,我会感到惊讶。
您可以尝试使用TAP或Switch + SPAN端口使用外部专用设备进行捕获。有关想法,请参见Wireshark的Ethernet Capture Setup Wiki页面。
另一个有希望的可能性:在Linux中以每秒数百万个数据包的速度捕获数据包,而无需使用第三方库。
另请参阅Andrew Brown的Sharkfest '14 最大化数据包捕获性能文档。
祝好运!