我的 ISP 有时会丢弃 IP 碎片。这在 SSH 中表现如下:我可以正常登录并运行输出短字符串的命令,但运行“ps fax”之类的命令会导致链接锁定。
PMTU 为 1500。因此,SSH 似乎试图传输大于此值的数据包,这些数据包随后被分割并因此丢失。我无法轻松降低远程 MTU,而且我不愿意这样做,因为 MTU 是正确的(1500)。
这是怎么回事?我以为 TCP 会将其 MSS 设置为正确的值以避免碎片。我怎么会得到碎片?
编辑:远程机器是 Centos 6.4。我说的“有时”是指 ISP 遇到网络中断的糟糕日子,确实会丢掉一些碎片。嗅探链路的两端,我看到来自大型 ping 的数据包和碎片离开了我的系统,但只有“主”数据包到达目标。
问题表现如上,并且登录 RDP 会话时屏幕变黑。问题现已修复,因此在再次发生之前我无法进行任何测试。
在另一个系统上进行的更多测试表明 SSH 设置了 DF 位。所以现在我真的不明白发生了什么。
我无法测试是否出现需要碎片化的 ICMP 消息(它们不应该出现),因为网络接受最大以太网大小(1500)的数据包,所以我自己的路由器会发出需要碎片化的消息。
我向 ISP 投诉,但他们试图说服我,这是设计使然,他们的网络永远不会允许“ping -s 5000”这样的 ping。当然不是这样的。尤其是考虑到他们已经修复了这个问题。
答案1
在这种情况下,我忽略了 SSH 和 RDP 会话正在通过 IPSEC VPN 的事实。PMTU 处或附近的大型 SSH 数据包导致 IPSEC 数据包大于 MTU,因此产生碎片。这些碎片丢失,会话挂起。
我推测会话最终会超时并恢复,但人类超时的速度更快。