tcpdump :丢失数据包

tcpdump :丢失数据包

运行,无论是否处于混杂模式:

tcpdump -i "$INTERFACE" -vvv -n -XX -S -s0 -e

当我停止它时,我得到了一堆行和这个结论:

601 packets captured
938 packets received by filter
230 packets dropped by kernel

为什么有区别? 107个数据包丢失在哪里?是否有可能获取/捕获本地网络上 100% 的数据包 - 只有我在路由器后面?

答案1

当 tcpdump“丢弃”数据包时,是因为它没有足够的缓冲区空间来跟上从网络到达的数据包。

捕获和接收的数据包之间的差异可能是由于操作系统或 tcpdump 的实现造成的,或更常见的是由于使用 ^C 中止进程造成的。

使用“s0”设置每个数据包的缓冲区大小会将其设置为每个 64KB man tcpdump;通常,如果使用 -X 查看整个数据包,并且仅使用 tcpdump 来查看标头,则最多将其设置为 1500,甚至小于所需的值 - 160 字节,即 IPv4 标头的大小。

通常使用屏幕工作也较慢,如果需要速度,如果您不需要真正实时地观看它,我会将输出定向到文件。

来自男人“tcpdump”:

“请注意,拍摄较大的快照不仅会增加处理数据包所需的时间,而且会有效地减少数据包缓冲量。这可能会导致数据包丢失。您应该将 snaplen 限制为捕获协议信息的最小数量你感兴趣。”

答案2

正如所回答的别处, 和这里,tcpdump(从 4.0 开始默认,libpcap 从 1.0 开始)有一个-B NNNN设置缓冲区大小的选项(以 NNNN*1024 字节为单位,在 Linux 上默认为 2MiB)。如果您不想将 snaplen 设置得更低,这是一个有用的替代方案。

例子:

tcpdump -i "${INTERFACE}" -B 4096 -nn -w capture.pcap

您也可以考虑使用 pcap捕获过滤器如果您正在寻找某种已知类型或具有已知属性的数据包,并且您对捕获所有内容不感兴趣。

瑞的答案包括另一个有用的点:如果您不需要实时查看数据包捕获,那么最好输出到文件而不是终端。

相关内容