本地网络上机器的高且可变的 ping 时间

Dav*_*one 2 networking linux wireless-networking ping

我的本地网络上有两台机器,都连接到无线路由器。从机器 A 上,如果我 ping 路由器,我会得到以下信息:

10 packets transmitted, 10 received, 0% packet loss, time 9038ms
rtt min/avg/max/mdev = 0.836/2.488/3.749/0.931 ms
Run Code Online (Sandbox Code Playgroud)

从机器 B 上,如果我 ping 我的路由器,我会得到以下信息:

10 packets transmitted, 10 received, 0% packet loss, time 9017ms
rtt min/avg/max/mdev = 2.068/3.452/4.908/0.795 ms
Run Code Online (Sandbox Code Playgroud)

但如果我从 A ping B,我会得到

10 packets transmitted, 10 received, 0% packet loss, time 9010ms
rtt min/avg/max/mdev = 3.077/223.724/507.174/186.355 ms
Run Code Online (Sandbox Code Playgroud)

从 B ping A 的结果类似。

可能是什么原因造成的?我该如何解决?两台机器都使用完全最新的 Arch Linux。

use*_*686 5

Wi-Fi 硬件通常会尝试尽可能进入低功耗状态,在此期间 AP 将缓冲数据包,而客户端设备只会以一定的时间间隔检查等待传入的数据包:

当机器首先发送ping 数据包时,其 Wi-Fi 接口将保持在线状态一段时间,等待响应到达,因此不会有任何明显的延迟。但是,当计算机完全空闲并且即将从另一台设备接收第一个数据包时,它不会立即看到您正在尝试对它执行 ping 操作,直到下一次轮询,这可能需要很长时间。

如果您希望将计算机用作服务器(使用交流电源,接受传入的 SSH 或其他连接),您可以使用以下方法禁用省电功能:

iw dev wlan0 set power_save off
Run Code Online (Sandbox Code Playgroud)

可以将其添加到 udev 规则中以在每次启动时应用它,或者添加到 acpid 脚本中以在系统连接到 AC 时应用它。(不过它影响电池寿命,所以我不会仅仅为了看起来ping mylaptop更好而禁用它)。我是在半梦半醒的时候写下这篇文章的。