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

时间:2016-10-05 06:23:28

标签: tcpdump

当我开始丢弃数据包时,我正在使用tcpdump捕获网络数据包并遇到问题。我运行了一个通过网络快速交换数据包的应用程序导致高网络带宽。

>> tcpdump -i eno1 -s 64 -B 919400
126716 packets captured
2821976 packets received by filter
167770 packets dropped by kernel

因为我只对TCP数据包中的协议相关部分感兴趣;我想收集没有数据/有效负载的TCP数据包。我希望这种策略还可以帮助在丢弃数据包之前捕获更多数据包。看来我只能将缓冲区大小(-B参数)增加到一定限度。即使有更高的限制,我也会丢弃更多的数据包。

你可以帮助我理解我的上述信息和问题

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

1 个答案:

答案 0 :(得分:4)

来自Guy Harris他自己:

"捕获的数据包" number是每次tcpdump看到数据包时递增的数字,因此它计算tcpdump从libpcap读取的数据包,因此libpcap从BPF读取并提供给tcpdump。

"过滤器收到的数据包" number是" ps_recv"从pcap_stats()调用的数字;使用BPF,它是BIOCGSTATS ioctl中的bs_recv编号。该计数包括所有传递给BPF的数据包;那些数据包可能仍然在libpcap尚未读取的缓冲区中(因此没有传递给tcpdump),或者可能位于libpcap已读取但尚未传递给tcpdump的缓冲区中,因此,它可以计算未报告为"捕获的数据包"。

来自tcpdump man page

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

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

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

来自Wireshark的Performance维基页面:

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

尝试使用PF_RING

你也可以尝试使用dumpcap代替tcpdump,但如果表现完全不同,我会感到惊讶。

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

另一种有希望的可能性:Capturing Packets in Linux at a Speed of Millions of Packets per Second without Using Third Party Libraries

另请参阅Andrew Brown的Sharkfest' 14 Maximizing Packet Capture Performance文件以获取更多想法。

祝你好运!