我听说我们可以借助IP_TRANSPARENT
TCP/IP 连接来避免“太多 TIME_WAIT”的问题。这样看来,RST
断开连接用的是a,而不是FIN
and 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