MTU、DSL 路由器和停滞的 TCP

MTU、DSL 路由器和停滞的 TCP

我发现 TCP 连接停滞问题。当我尝试从家庭网络的远程系统 scp 内容时,就会出现问题。我的家庭网络通过 PPPoE(ADSL+)连接到互联网,一旦从家庭网络工作,一切都会正常进行。ADSL 路由器的 MTU 设置为 1492,但使用该设置,远程系统的 scp 不起作用 - 停滞!当我将路由器上的 MTU 更改为 1500 时,scp 工作正常,但从家庭网络访问大多数 www 网站(甚至是本地网站)的速度非常慢。只是想知道问题出在哪里 - 我的 ISP 阻止了 ICMP 等?谢谢!

答案1

PPPoE 需要 8 个字节的封装/报头数据,这就是为什么您只能在以太网上使用 1492 字节 MTU 的原因。但通常情况下,这类事情是通过路径 MTU 协商来解决的。

如果有人阻止 ICMP,则路径 MTU 协商将不起作用。

您的选择是放弃 PPPoE 或更改远程系统上的 MTU 来处理半断连接。是的,我意识到这两种方法都不是理想的。

答案2

一些网络服务器,尤其是一些常见的 CDN,如 Akamai、Amazon 等,似乎默认阻止 ICMP 流量(这显然是一个非常糟糕的主意)。

我首先怀疑是我的提供商配置错误,但我已经检查过了(我从互联网主机向我的 DSL 路由器发送了一些大数据包,并且在 DSL 链路之前从路由器收到了“需要 ICMP 碎片”数据包。

显然,我的 DSL 提供商曾经在其接入路由器上为所有客户进行 MSS 限制,但现在似乎已经停止了。

我通过在 DSL 路由器上实施 MSS 限制解决了这个问题,这样它现在会以限制下行链路最大段大小的方式重写传出的 SYN 数据包。启用它的命令是:

iptables -A FORWARD -o ppp0 -p tcp \
    --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

如果您的家庭路由器不支持 iptables,您可能可以通过将 FORWARD 更改为 OUTPUT 来修改它以处理本地主机上的传出数据包,但我从未尝试过这样做。

相关内容