我知道将tcp_max_tw_buckets设置为相对较小的数字(例如30000或50000)是很正常的,以避免主机有大量时间等待状态连接且应用程序无法打开新连接的情况。这是很多提到的东西。比如这样的问题:How to reduce number of sockets in TIME_WAIT?
和以前一样,我知道time-wait是一种避免TCP数据包out of order的状态,使用some other approach处理它可能会更好。如果你把它设置成一个小的东西可能会出错。
我觉得我在某个地方,我必须将tcp_max_tw_buckets设置为一个小数字,并且不知道我将避免它的特定情况。
所以我的问题是将tcp_max_tw_buckets设置为一个非常小的值的副作用是什么,我可以使用实验室环境设置一个特定的场景,少量的tcp_max_tw_buckets会导致麻烦吗?
答案 0 :(得分:1)
你的问题的真正答案是避免TIME_WAIT状态的正确方法是接收第一次关闭的结束。
对于服务器,这意味着在您发送响应之后,您应该在同一个套接字上循环等待另一个请求,当然还有读取超时,因此通常是客户端将关闭第一。这样,TIME_WAIT状态发生在客户端,在那里它是相当无害的,因为客户端没有很多出站连接。
答案 1 :(得分:1)
正如您在this Kernel source中看到的那样,该选项阻止了套接字的正常终止。就套接字状态而言,您已将此连接的等待持续时间减少为零。
接下来会发生什么?首先,您将在服务器上看到错误消息。其余的是后续客户连接的竞争条件。然后rfc 1337的第2节涵盖了您可能会看到的内容。简而言之,某些连接可能显示以下症状。
然而,证明这可能很难。如同一RFC中所述:
已经在模拟环境中运行的Sun OS 4.1.1 TCP上演示了H1,H2和H3三种危险,这些环境大量复制了段。这种环境远比大多数真正的TCP必须应对的环境危险得多,并且条件经过仔细调整,以便为故障创造必要的条件。