使用tcp_tw_recycle删除连接

use*_*755 26 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有什么区别?

jpe*_*zzo 51

默认情况下,当两个tcp_tw_reusetcp_tw_recycle被禁用,内核将确保在插座TIME_WAIT状态将保持在该状态足够长的时间-足够长的时间,以确保属于未来的连接的数据包不会对旧连接的后期包是错误的.

启用时tcp_tw_reuse,TIME_WAIT状态中的套接字可以在它们到期之前使用,并且内核将尝试确保没有关于TCP序列号的冲突.如果启用tcp_timestamps(也称为PAWS,用于保护包装序列号),它将确保不会发生这些冲突.然而,你需要TCP时间戳上启用两个端(至少,这是我的理解).有关详细信息,请参阅tcp_twsk_unique定义.

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

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

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

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

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

  • 底部链接坏了 (6认同)
  • 自Linux 4.12起,tcp_tw_recycle已被删除.这是因为Linux现在随机化每个连接的时间戳,并且它们不会单调增加.如果您将Linux 4.12与使用tcp_tw_recycle的计算机一起使用并且TCP时间戳已打开,您将看到已断开的连接.您当然可以像`echo 0>/proc/sys/net/ipv4/tcp_timestamps`那样禁用它(暂时,使用sysctl.conf进行永久性更改).有关4.12删除tcp_tw_recycle的详细信息:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id = 4396e46187ca5070219b81773c4e65088dac50cc (5认同)