为什么小的 TCP 连接可以成功,而大的 TCP 连接却会失败?

为什么小的 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>

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”之前,/proc/net/ip_conntrack 就已经存在了。

但是当我进行大连接时:

root@localhost:~# nc 86.57.151.3 80
GET /

它停滞了。在我输入“GET /”之前,它像往常一样显示 ESTABLISHED ASSURED,但在我按回车键后,它转到了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 80GET /它可以工作。

出了什么问题该如何调试?

答案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

相关内容