当我开始丢弃数据包时,我正在使用tcpdump捕获网络数据包并遇到问题。我运行了一个通过网络快速交换数据包的应用程序导致高网络带宽。
>> tcpdump -i eno1 -s 64 -B 919400
126716 packets captured
2821976 packets received by filter
167770 packets dropped by kernel
因为我只对TCP数据包中的协议相关部分感兴趣;我想收集没有数据/有效负载的TCP数据包。我希望这种策略还可以帮助在丢弃数据包之前捕获更多数据包。看来我只能将缓冲区大小(-B参数)增加到一定限度。即使有更高的限制,我也会丢弃更多的数据包。
你可以帮助我理解我的上述信息和问题答案 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的操作系统中的数据包捕获机制,如果操作系统向应用程序报告该信息;如果不是,则报告为0)。
要尝试提高捕获性能,请尝试以下几点:
-p
选项执行此操作。"tcp"
附加到您的命令来执行此操作。-w file
选项执行此操作,或查看-C file_size
和-G rotate_seconds
选项。 nice
改善tcpdump
的日程安排优先级。来自Wireshark的Performance维基页面:
尝试使用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文件以获取更多想法。
祝你好运!