為什麼小 TCP 連線會成功,但大連線會失敗?

為什麼小 TCP 連線會成功,但大連線會失敗?

有時在 Linux 系統中我會看到以下奇怪的行為:

我能夠 ping 通並且有時可以使用一些服務,但網路非常糟糕。

例如,現在我透過我的筆記型電腦 ( -j MASQUERADE) 路由連接並觀察以下情況: 如果我進行很少的 TCP 連線(伺服器向我發送很少的資料),則會繼續:

# nc 86.57.151.3 80
GET /404
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

/proc/net/ip_conntrack 在tcp 6 431998 ESTABLISHED src=192.168.99.9 dst=86.57.151.3 sport=49104 dport=80 src=86.57.151.3 dst=93.125.21.218 sport= 80 dport=49104 [ASSURED] mark=0 use=2我輸入「GET /404」之前。

但是當我做大連接時:

root@localhost:~# nc 86.57.151.3 80
GET /

它停了下來。在我輸入“GET /”之前,它像往常一樣顯示 ESTABLISHED ASSURED,但在我按 Return 鍵後,它會轉到tcp 6 0 CLOSE_WAIT src=192.168.99.9 dst=86.57.151.3 sport=56991 dport=80 src=86.57.151.3 dst=93.125.21.218 sport=80 dpo rt=56991 [ASSURED] mark=0 use=2。沒有收到帶有 的資料包。當我最終按下 Ctrl+C 時,它會向伺服器發送 FIN,並且 Wireshard 抱怨伺服器的 FIN 是「無序的」。就像回覆打包掉在某個地方一樣。

當我從路由器執行相同的nc 86.57.151.3 80/操作時,它可以工作。GET /

怎麼調試出了什麼問題?

答案1

這是 MTU 和某處過濾的 ICMP 訊息的問題。

解決方法是在客戶端設備上設定 MTU 或在路由器上使用 TCP MSS 限制:

iptables -t mangle -A FORWARD -o ppp4 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

相關內容