我试图通过设置tcp_fin_timeout详细here来减少连接处于TIME_WAIT状态的时间:
root:~# sysctl -w net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_fin_timeout = 30
但是,此设置似乎不会影响任何内容。当我查看机器的netstat时,连接仍然等待默认的60秒:
root:~# watch netstat -nato
tcp 0 0 127.0.0.1:34185 127.0.0.1:11209 TIME_WAIT timewait (59.14/0/0)
tcp 0 0 127.0.0.1:34190 127.0.0.1:11209 TIME_WAIT timewait (59.14/0/0)
有什么我想念的吗?该机器正在运行Ubuntu 14.04.1。
答案 0 :(得分:2)
您的链接是都市神话。 net.ipv4.tcp_fin_timeout
的实际功能是as follows:
指定在强制关闭套接字之前等待最终FIN数据包的秒数。这严格违反了TCP规范,但需要防止拒绝服务攻击。在Linux 2.2中,默认值为180。
这与TIME_WAIT没有任何关系。它为FIN_WAIT_1中的套接字建立超时,之后重置连接(完全绕过TIME_WAIT)。如上所述,这是DOS测量,并且永远不应出现在正确编写的客户端 - 服务器应用程序中。您不希望将其设置得太低以至于重置普通连接:您将丢失数据。实际上,你根本不想弄乱它。
减少TIME_WAIT状态的正确方法是here。