为什么正在运行的 ping 进程在互联网中断期间继续工作,但重新启动 ping 却不能?

stu*_*net 4 networking linux router ping cable-modem

在过去的几个月里,我一直在与定期的互联网中断作斗争,这影响了我本地网络上的所有设备,迫使我重新启动电缆调制解调器。今天我注意到,通过安装暴雪 Battle.net 游戏,我可以重现此问题 - 或具有相同症状的类似问题。

这不仅仅是为了让我的带宽饱和,因为

  • 下载本身也会停止,
  • 限制下载速度时也会发生这种情况,
  • 暂停下载时它不会自动解决 - 只有重新启动调制解调器才有帮助。

为了准确地查看我的互联网连接何时失败,我ping 8.8.8.8在连接到同一网络的单独 Linux 笔记本(我使用的是 Arch btw)上运行一个简单的程序 - 但即使我的互联网失败,我仍然能够继续执行 ping 操作!仅当停止正在运行的ping并重新启动它时,我才不再收到任何响应。

我对这种行为有点困惑。我还尝试并排运行ping 8.8.8.8-watch -n1 ping -c 1 8.8.8.8虽然持续运行的ping进程继续工作,但一旦我的互联网出现故障,由watch定期重新启动的ping进程就会失败。

这怎么可能?显然,“活动 ping 会话”似乎不受我的中断影响。但是对于在第 3 层使用 ICMP 执行 ping 操作,我不明白为什么保持ping运行与重新启动之间存在差异。

在看到 Battle.net 下载也导致这个问题后,我立即怀疑与太多 P2P 连接堵塞我的路由器有关。但我既不确定 Battle.net 是否真的使用 P2P,也没有在我的路由器上看到任何关于活动连接(最多 15,360 个连接中的约 3,000 到 4,000 个连接)、内存使用等方面的可疑内容。

不幸的是,我无法真正查看电缆调制解调器的指标,因为我的 ISP 没有提供适当的接口 - 这也是我在桥接模式下运行它的原因。

这种行为有什么解释吗?

编辑:我使用 Wireshark 查看了 ICMP 消息:获得响应的 ICMP 回显请求与未获得响应的 ICMP 回显请求之间唯一明显的区别是:

  • ICMP 标识符与进程相关联;来自正在运行的ping 的请求具有相同的 id,来自重新启动的 ping 的请求将获得一个新的 id
  • 对于正在运行的ping发送的每个请求,序列号都会增加,但对于重新启动的请求,序列号设置为 1

这是非常预期的行为,并且并没有真正帮助我任何进一步 - 毕竟,为什么这会导致请求得到不同的对待?

use*_*686 6

\n

这怎么可能?显然,“活动 ping 会话”似乎不受我的中断影响。但是对于在第 3 层使用 ICMP 执行 ping 操作,我不明白为什么保持 ping 运行与重新启动之间存在差异。

\n
\n

即使对于没有显式状态的协议(例如 UDP 和 ICMP Echo),您的路由器仍然需要为其防火墙和 NAT 功能保留自己的状态。(例如,它跟踪 NAT 映射,以了解将 Echo Reply 数据包返回到哪个内部主机。)对于此类协议,您发送的任何第一个数据包都将建立状态;然后,您发送的任何第一个数据包都会建立状态。不活动后超时会导致其被删除。

\n

就像 TCP 一样,状态表会记住 UDP 数据包流的源-目标端口,或 ICMP Echo 流的单个“请求 ID”。尽管 ICMP 没有端口号,但 Echo 请求有一个 ID,其作用与区分彼此的流具有相同的目的。(如果您查看 Wireshark 中的数据包捕获,您会看到这一点。)这意味着,每个新的ping调用都会导致添加一个新的状态条目。

\n

(举个实际的例子:如果你这样做,conntrack -L你可以看到计算机的 iptables/nftables 防火墙跟踪的状态,这与大多数家庭路由器内部使用的基本相同。请注意idICMP Echo 状态字段。)

\n
\n

因此,从您的问题描述来看,确实听起来路由器的状态表因太多“连接”而填满,并且其固件被配置为停止接受新状态,而不是让它们推出旧状态。(公平地说,我认为这是 Linux conntrack 的默认行为?)

\n

也可能是有问题的路由器有一个错误,阻止它清除状态,并且它的内存只会填满,直到重新启动;特别是如果路由器将 NAT 卸载到硬件加速,并且如果所述卸载已损坏状态删除。(如果是这种情况,我完全不会感到惊讶,并且 ISP 只是将其编程为每周重新启动一次,这对于临时用户来说“足够好”。)

\n

如今Battle.net不再使用P2P,它只是来自CDN的HTTP(尽管它很早以前是基于BitTorrent的),但它确实建立了相对大量的并行HTTP下载,并且肯定会导致这个问题。

\n

最后,正如评论中提到的,您的路由器的防火墙可能丢失所有过滤器和/或 NAT 规则(尽管我不确定是否可能)。这对于基于 Linux 的设备 \xe2\x80\x93 来说是有意义的,实际上 iptables 会自动处理现有状态的 NAT,因此,如果传出 SNAT 或 MASQUERADE 规则由于某种原因被删除,它将阻止建立新连接,但现有连接那些将继续工作(它们将继续根据已存储在状态中的信息进行 NAT)。

\n
\n

如果您找不到解决问题的方法,VPN 可能是一种解决方法 \xe2\x80\x93 整个 VPN 隧道在您的路由器可以看到的范围内仅被视为一种状态。

\n