tcpdump 返回数据包前有一秒钟的延迟

tcpdump 返回数据包前有一秒钟的延迟

使用 Ubuntu,我尝试将 tcpdump 嗅探与来自客户端设备的自识别“ping”同步。问题是,由于 tcpdump 中似乎存在内置延迟,因此很难获得精确的开始和停止。这是我的脚本中的关键行:

sudo timeout .5s tcpdump -i wlan0 -e

当我将超时设置为在半秒后停止 tcpdump 时(如我的示例所示),没有返回任何数据包。事实上,任何低于 1.1 秒的值都无法返回数据包(而 1.1 秒及更长的值则工作正常)。

我尝试添加 -n 参数来抑制 DNS,但没有任何效果。我还尝试使用两个完全不同的 wifi 卡(Intel Centrino 和 TP-Link N900)来确保这不仅仅是一个硬件“功能”。

我不是开发人员,但我对 tcpdump 源代码进行了 grep,查找了“delay”、“latency”和“timeout”,但没有找到任何可以解释的东西。

有任何想法吗?

答案1

默认情况下,tcpdump 将尝试对正在通信的 IP 地址执行反向 DNS 查找。如果 tcpdump 没有收到此类 DNS 查找的响应,一秒钟的延迟听起来像是一个合理的超时。

添加-n到 tcpdump 命令行将禁用 DNS 查找。将命令更改为以下内容是否有帮助:sudo timeout .5s tcpdump -ni wlan0 -e

答案2

gnu coreutils timeout.c 对于没有 timer_settime() 的系统有一个后备功能 - 它将恢复为单秒分辨率:

/* timer_settime() provides potentially nanosecond resolution.
setitimer() is more portable (to Darwin for example),
but only provides microsecond resolution and thus is
a little more awkward to use with timespecs, as well as being
deprecated by POSIX.  Instead we fallback to single second
resolution provided by alarm().  */

也许这就是你的问题。我没有运行 ubuntu,所以我无法亲自检查,但例如我的 openbsd 机器只有 setitimer(),所以它只会对我使用整秒超时

--编辑:再看一下,它仍然应该等待至少 1 秒,除非它四舍五入...或者 tcpdump 以某种方式获得了早期信号...并且可能在间隔期间没有数据包?

答案3

添加-ltcpdump 选项有帮助吗?它使 tcpdump 行的标准输出缓冲,以便每行在收到后立即输出,而不是在输出之前缓冲更多数据。

答案4

我无法重现您的问题。如果我启动ping -i 0.3 google.com然后运行, timeout .5s tcpdump -i wlan0 -e我会看到流量。

沙克支持在不同条件下停止捕获,包括经过的时间。你可以尝试

tshark -a duration:1 -i wlan0
tshark -a duration:2 -i wlan0

如果两者都显示流量,则问题可能与 kasperd 所提示的一致。如果第一个不显示流量,而第二个显示,则问题可能出在您的网络硬件或其驱动程序上。

相关内容