如何使用 IP_TRANSPARENT 避免过多的 TIME_WAIT

如何使用 IP_TRANSPARENT 避免过多的 TIME_WAIT

我听说我们可以借助IP_TRANSPARENTTCP/IP 连接来避免“太多 TIME_WAIT”的问题。这样看来,RST断开连接用的是a,而不是FINand ACK

但我不太明白如何实现这一目标。

答案1

请注意,由于您没有提到您正在使用哪个操作系统,所以我假设它是 GNU/Linux(这可能是一个糟糕的假设,因为这是“UNIX & Linux”)。

调整内核行为

在 Linux 下,在运行时调整 TCP 堆栈通常是使用sysctl和/或 procfs 来实现的。

因此,您可能应该首先查看:

  • TCP(7) 联机帮助页
  • Documentation/sysctl/内核源代码下的文件。 (您也可以使用这个网站)。

查看是否有一些选项/参数允许这样做。

更进一步

快速查看内核源代码后(net/ipv4/tcp.c)看起来使用 FIN 标志来关闭是“硬编码的”并且无法更改......抱歉。

也许你可以尝试编写一个补丁来改变这种行为...但我不会在生产服务器中推送这样的补丁;-)

总结一下

看起来没有办法做你要求的事情。

尽管如此,也许您可​​以通过调整一些其他参数(例如 net.ipv4.tcp_fin_timeout (也可在 访问)来缓解“太多 TIME_WAIT”问题/proc/sys/net/ipv4/tcp_fin_timeout

请注意,如果您掌握了应用程序源代码,您还可以使用setsockopt()创建的套接字来调整其行为。

答案2

不是 IP_TRANSPARENT,但这里可能是解决您问题的不同方法。

(作为答案而不是作为评论发布,以便代码块可读)

如果您的 Linux 计算机是客户端,而不是服务器,那么您可以在 /etc/sysctl.conf 中一次或一起试验以下内容,然后sysctl -p.请查看每种方法的作用,看看每种方法是否适合您的使用。

net.ipv4.ip_local_port_range = 2000 65535
net.ipv4.tcp_tw_reuse = 1

很棒的文章解释了血淋淋的细节:https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux

相关内容