过去两个星期我也遇到了类似的情况,昨天(5月11日)我找到了一个解决方案,目前有效(双启动Ubuntu 20.04 / Windows,无线网卡Broadcom 4325)。
令人惊讶的是,我的问题并不是由于无线驱动程序或电源管理引起的(在之前的几天里尝试了很多方法,但没有改善),而是与我的计算机在本地路由器上的ARP条目过期有关(ARP代表地址解析协议,用于IP地址和MAC地址之间的转换)。
为了简洁起见(调查细节请参见本答案末尾):
- 我的路由器的ARP条目超时时间为20分钟,
- 对于我的计算机,它在逐渐减少直至过期(导致我每20分钟失去连接),
- 对于其他设备也是如此,但它们的超时时间在过期之前会自动刷新。我进行了网络捕获以找出这些设备做了什么不同的事情,并发现它们发送ARP请求时超时时间会被刷新。
=> 出现了一个解决方案,我需要告诉我的计算机也这样做!(发送ARP请求)
解决方案的实施
发送ARP请求,我使用了
arping,你可以从其软件包安装:
sudo apt install arping
当你启动它时,它会说它必须以 root 或具有 cap_net_raw 权限运行。
由于我不想以 root 启动它,所以我添加了该权限:
sudo setcap "cap_net_raw+ep" /usr/sbin/arping
我使用了以下命令向我的路由器发送一个ARP请求(请将IP地址替换为您相关的地址):
arping -c 1 192.168.1.1
然后我希望这个命令每隔15分钟运行一次,以便定期刷新ARP条目。
这可以通过编辑文件
/etc/crontab来完成:
sudo vi /etc/crontab
在文件末尾添加这行代码:
*/15 * * * * <username> arping -c 1 192.168.1.1
这将使ARP请求每15分钟发送一次。
详细的调查过程
以下是我发现问题的更多细节:
- 开发了一个小部件,用时间戳告诉我何时失去连接和何时恢复连接。
- 运行tcpdump捕获,直到发生断开/重新连接(小部件的目的)。
- 在捕获的数据中,发现了与问题时间相关的ARP消息。
- 查看了我的pfSense路由器的ARP表,发现PC的超时条目一直在减少,直到过期;对于其他连接的设备,它们也会减少,但在某个时刻会重置为默认值(我这里是1200秒)。
- 等待直到超时过期,以确认我在计算机上观察到了断开连接的症状(是的)。
- 在路由器上进行tcpdump捕获,观察其他设备如何成功重置其超时:通过在超时之前发送ARP请求。
- 按照上述说明安装arping,并向路由器发送了一个测试ARP请求:它将我的超时重置为1200秒,胜利!\o/
最后,我不知道为什么在使用Windows时从来没有遇到这个问题。
当检查ARP表时,我看到条目过期了,但立即被重置为20分钟,并且我看不到网络断开。
你可能还想知道如何检查ARP表。
如果你正在使用pfSense路由器,可以在子菜单“诊断> ARP表”中找到(要用英语翻译,我的菜单是法语)。
对于其他设备,你需要查看其文档。
但最后,即使你无法检查ARP表,你仍然可以尝试将该行插入到
/etc/crontab中,并运行数小时/天。如果问题不再出现,那就是这个问题了 :-)
希望对你有帮助!