MTU、DSL 路由器和停止 TCP
我發現停滯的 TCP 連接問題。當我嘗試從我的家庭網路從遠端系統 scp 東西時,問題就出現了。我的家庭網路通過 PPPoE (ADSL+) 連接到網際網路,一旦通過我的家庭網路工作,一切都會完美執行。ADSL 路由器的 MTU 設置為 1492,但這樣設置遠端系統的 scp 不起作用 - 停止!當我將路由器上的 MTU 更改為 1500 時,該 scp 工作正常,但是對於大多數 www 站點(甚至本地站點)來說,從我的家庭網路訪問 Internet 的速度非常慢。只是想知道問題出在哪裡——我的 ISP 阻止了 ICMP 等?謝謝!
PPPoE 需要 8 字節的封裝/報頭數據,這就是為什麼您只能在乙太網上使用 1492 字節的 MTU 進行操作。但是通常情況下,這種事情是通過路徑 MTU 協商來解決的。
如果有人阻止了 ICMP,那麼路徑 MTU 協商將不起作用。
您的選擇是擺脫 PPPoE 或更改遠端系統上的 MTU 以處理您的半斷連接。是的,我意識到兩者都不理想。
一些網路伺服器,尤其是一些常見的 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 來修改它以處理本地主機上的傳出數據包,但我從未嘗試過。