CentOS Linux 上的 TCP 重传、重复等问题

CentOS Linux 上的 TCP 重传、重复等问题

我正在运行Vyatta网关,CentOS后面是 Linux,IPSec前面是隧道。

尝试显示我的设置:

PARTNER-NETWORK <--- IPSec (GRE, MTU 1420) ---> VYATTA (TUNNEL, MTU 1420 <> eth0, MTU 1500) <---> CentOS (eth0, MTU 1500) <---> internet (eth0, MTU 1500)

我看到很多 TCP 重传、重复等,我猜这是因为 MTU/MSS 不同 - 很难调试 :(

我尝试在我的 CentOS 上添加以下内容:

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

但这似乎并不能解决问题。

我该如何调试问题到底出在哪里,以及如何解决这些问题?

答案1

您确定允许 ICMP 类型 3 代码 4(即需要分片)消息从网关发送到两个端点吗?端点是否确实接收到了这些消息?

自 Windows 95 以来,几乎所有操作系统都使用路径 MTU 发现。实际上,这意味着它们将发送所有设置了“不分段”标志的 TCP 数据包。如果数据包大于数据包路由中某个跃点的 MTU,则遇到问题的路由器应该向发送方发送一条 ICMP 消息“需要分段”。从该消息中,发送方将知道该跃点的确切 MTU,并知道相应地调整数据包大小。因此,端点最终将调整其数据包的大小,这样路由器就根本不需要对它们进行分段。这提高了性能。

但是如果有人阻止了“需要分片”ICMP 消息,路径 MTU 发现机制将不起作用。由于接收方永远不会收到大于数据包路由上特定跳转的 MTU 的数据包,因此接收方永远不会确认。一旦发送方发现数据包未被确认,它将重新发送该数据包 - 并且由于它不知道应该为此特定连接减少 MTU,它将完全按原样重新发送数据包:使用对于一跳转来说太大的相同 MTU。因此在这种情况下重新发送不会有帮助。

相关内容