如何解决tcpdump丢弃的数据包?

ank*_*tel 3 tcpdump

我正在使用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参数)增加到一定限制。即使具有更高的限制,我丢弃的数据包也比捕获的更多。

你能帮助我理解上面的信息和问题吗

  1. 捕获了什么数据包?
  2. 过滤器收到什么数据包?
  3. 内核丢弃的数据包是什么?
  4. 如何在不丢失任何数据包的情况下以高带宽捕获所有数据包。我的测试应用程序运行了3分钟,并以很高的速率交换数据包。我只对协议相关的信息感兴趣,而对发送的实际数据/有效载荷不感兴趣。

Chr*_*ard 5

来自盖·哈里斯本人:

“捕获的数据包”数字是每次tcpdump看到数据包时都会递增的数字,因此它将对tcpdump从libpcap读取的数据包进行计数,因此libpcap从BPF读取并提供给tcpdump。

“过滤器接收到的数据包”编号是对pcap_stats()的调用中的“ ps_recv”编号;对于BPF,这是BIOCGSTATS ioctl中的bs_recv编号。该计数包括所有交给BPF的数据包;这些数据包可能仍在尚未被libpcap读取的缓冲区中(因此没有传递给tcpdump),或者可能在libpcap所读取但尚未传递给tcpdump的缓冲区中,因此它可以对那些没有报告为“被俘”。

tcpdump手册页

``被内核丢弃的数据包''(这是由于tcpdump运行所在的OS中的操作系统中的数据包捕获机制由于缺少缓冲区空间而丢弃的数据包的数量;如果OS向应用程序报告了该信息;如果不是,它将报告为0)。

要尝试提高捕获性能,请尝试以下几件事:

  • 如果不需要,不要以混杂模式捕获。这将减少内核必须处理的通信量。通过使用该-p选项。
  • 由于您仅对TCP通信感兴趣,因此应用捕获表达式将通信限制为仅TCP。通过添加"tcp"到您的命令来执行此操作。
  • 尝试将数据包写入文件(或限制大小的文件),而不是在屏幕上显示数据包。使用-w file选项执行此操作,或者如果要限制文件大小,请查看-C file_size-G rotate_seconds选项。
  • 您可以尝试通过改善tcpdump调度的优先级nice

从Wireshark的Performance Wiki页面:

  • 停止该计算机上运行的其他程序,以消除系统负载
  • 购买更大,更快的机器:)
  • 增加缓冲区大小(您已经在做)
  • 设置捕捉长度(您已经在做)
  • 将捕获文件写入RAM磁盘

尝试使用PF_RING

您也可以尝试使用dumpcap代替tcpdump,尽管如果性能完全不同,我会感到惊讶。

您可以尝试使用TAP或Switch + SPAN端口使用外部专用设备进行捕获。有关想法,请参见Wireshark的Ethernet Capture Setup Wiki页面。

另一个有希望的可能性:在Linux中以每秒数百万个数据包的速度捕获数据包,而无需使用第三方库

另请参阅Andrew Brown的Sharkfest '14 最大化数据包捕获性能文档。

祝好运!