问题摘要
我们有一个设置,其中有很多(每秒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)如果不能,tcp_tw_reuse代码的哪一部分会阻止tcp_tw_reuse用于这种场景? 3)一般来说,tcp_tw_recycle和tcp_tw_reuse之间有什么区别?
发布于 2012-10-04 02:00:23
默认情况下,当禁用tcp_tw_reuse和tcp_tw_recycle时,内核将确保处于TIME_WAIT状态的套接字保持足够长的时间,以确保属于未来连接的数据包不会被误认为旧连接的晚期数据包。
当您启用tcp_tw_reuse时,可以在TIME_WAIT状态的套接字过期之前使用它们,并且内核将尝试确保对TCP序列号没有冲突。如果启用tcp_timestamps (a.k.a )。爪子,为了防止被包装的序列号),它将确保这些冲突不会发生。但是,您需要在两端启用TCP时间戳(至少,这是我的理解)。有关血淋淋的细节,请参阅独一无二。
当您启用tcp_tw_recycle时,内核变得更加咄咄逼人,并将对远程主机使用的时间戳进行假设。它将跟踪每个具有TIME_WAIT状态连接的远程主机使用的最后一个时间戳),并允许在时间戳正确增加的情况下重用套接字。但是,如果主机使用的时间戳更改(即返回时间),SYN数据包将被静默丢弃,并且连接不会建立(您将看到类似于“连接超时”的错误)。如果您想深入研究内核代码,流程可能是一个很好的起点。
现在,时间戳不应该回到过去;除非:
TIME_WAIT套接字可能已经过期,因此不会出现问题);TIME_WAIT连接会停留一点,但其他连接可能会被TCP RST击中,这会腾出一些空间);在后一种情况下,您可以在同一个IP地址后面有多个主机,因此,不同的时间戳序列(或者,所述时间戳由防火墙在每个连接上随机处理)。在这种情况下,一些主机将随机无法连接,因为它们被映射到服务器的TIME_WAIT桶具有较新的时间戳的端口。这就是为什么文档告诉您"NAT设备或负载平衡器可能会因为设置而开始丢弃帧“。
有些人建议不要使用tcp_tw_recycle,但要启用tcp_tw_reuse和较低的tcp_fin_timeout。我同意:-)
https://stackoverflow.com/questions/8893888
复制相似问题