使用tcp_tw_recycle删除连接

时间:2012-01-17 11:31:42

标签: linux tcp-ip

问题摘要

我们有一个设置,其中很多(每秒800到2400(到linux盒的传入连接,我们在客户端和服务器之间有NAT设备)。 所以系统中还有很多TIME_WAIT套接字。 为了克服这个问题,我们将tcp_tw_recycle设置为1,但这导致了连接中断。 浏览完网后,我们确实找到了使用tcp_tw_recycle和NAT设备丢帧的原因。

决议尝试了

然后我们尝试将tcp_tw_reuse设置为1,它运行正常,没有任何相同的设置和配置问题。

但是文档说当通过TCP状态感知节点的连接(例如防火墙,NAT设备或负载平衡器)可能会看到丢帧时,不应使用tcp_tw_recycle和tcp_tw_reuse。连接越多,您就越有可能看到此问题。

查询

1)tcp_tw_reuse可以在这种情况下使用吗? 2)如果没有,linux代码的哪一部分阻止tcp_tw_reuse用于这种情况? 3)通常tcp_tw_recycle和tcp_tw_reuse之间有什么区别?

1 个答案:

答案 0 :(得分:50)

默认情况下,当tcp_tw_reusetcp_tw_recycle都被禁用时,内核将确保TIME_WAIT状态的套接字保持足够长的时间 - 足够长以确保属于未来连接的数据包不会被误认为是旧连接的延迟数据包。

当您启用tcp_tw_reuse时,TIME_WAIT状态的套接字可以在它们到期之前使用,并且内核将尝试确保没有关于TCP序列号的冲突。如果启用tcp_timestamps(a.k.a. PAWS,用于防止包装序列号),它将确保不会发生这些冲突。但是,您需要在两个结束时启用TCP时间戳(至少,这是我的理解)。有关详细信息,请参阅definition of tcp_twsk_unique

启用tcp_tw_recycle时,内核会变得更加激进,并会对远程主机使用的时间戳进行假设。它将跟踪具有TIME_WAIT状态连接的每个远程主机使用的最后时间戳,并允许在时间戳正确增加时重新使用套接字。但是,如果主机使用的时间戳发生更改(即,时间扭曲),SYN数据包将被静默删除,连接将无法建立(您将看到类似于“连接超时”的错误) 。如果你想深入研究内核代码,definition of tcp_timewait_state_process可能是一个很好的起点。

现在,时间戳永远不会回溯;除非:

  • 主机重新启动(但是,当它重新启动时,TIME_WAIT套接字可能已经过期,因此这将是一个非问题);
  • IP地址很快被其他东西重用(TIME_WAIT连接会保持一点,但其他连接可能会被TCP RST击中,这会释放一些空间);
  • 网络地址转换(或智能防火墙)涉及到连接的中间。

在后一种情况下,您可以在同一IP地址后面拥有多个主机,因此,不同的时间戳序列(或者,防火墙在每个连接处随机化所述时间戳)。在这种情况下,某些主机将随机无法连接,因为它们映射到服务器的TIME_WAIT存储桶具有较新时间戳的端口。这就是为什么文档告诉你“NAT设备或负载平衡器可能因为设置而开始丢帧”。

有些人建议单独离开tcp_tw_recycle,但请启用tcp_tw_reuse并降低tcp_fin_timeout。我同意: - )

相关问题