代码之家  ›  专栏  ›  技术社区  ›  Vinnie

设置TIME_WAIT TCP

  •  78
  • Vinnie  · 技术社区  · 17 年前

    我们正试图调整一个通过TCP接受消息并将TCP用于其某些内部消息传递的应用程序。在负载测试中,我们注意到,随着向系统发出更多同时请求,响应时间会显著降低(然后完全停止)。在此期间,我们看到很多TCP连接 TIME_WAIT 状态,有人建议降低 时间等待 环境变量从默认的60秒变为30秒。

    来自 what I understand ,the 时间等待 设置基本上设置了TCP资源在连接关闭后再次对系统可用的时间。

    我不是一个“网络人”,对这些事情知之甚少。我需要很多链接帖子中的内容,但有点“愚蠢”。

    • 我想我明白为什么 时间等待 值不能设置为0,但可以安全地设置为5吗?10呢?是什么决定了此值的“安全”设置?
    • 为什么此值的默认值为60?我猜比我聪明得多的人有充分的理由选择这个作为合理的默认值。
    • 关于覆盖此值的潜在风险和收益,我还应该知道什么?
    7 回复  |  直到 11 年前
        1
  •  91
  •   paxdiablo    13 年前

    TCP连接由元组(源IP、源端口、目标IP、目标端口)指定。

    会话关闭后出现TIME_WAIT状态的原因是,网络中可能仍有实时数据包正在发送给您(或来自您,可能会请求某种响应)。如果您要重新创建相同的元组,并且其中一个数据包出现,则它将被视为您的连接的有效数据包(并可能因排序而导致错误)。

    因此,TIME_WAIT时间通常设置为数据包最大年龄的两倍。此值是网络丢弃数据包之前允许数据包到达的最大年龄。

    这保证了,在允许您创建具有相同元组的连接之前,属于该元组先前版本的所有数据包都将是死的。

    这通常决定了您应该使用的最小值。最大数据包年龄由网络属性决定,例如卫星寿命高于局域网寿命,因为数据包还有很长的路要走。

        2
  •  19
  •   Len Holgate    15 年前

    通常,只有发出“主动关闭”的端点才应进入TIME_WAIT状态。因此,如果可能的话,让你的客户端发出主动关闭,这将使TIME_WAIT留在客户端而不是服务器上。

    请看这里: http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html 和 http://www.isi.edu/touch/pubs/infocomm99/infocomm99-web/ 详细信息(后者还解释了为什么由于协议设计没有考虑TIME_WAIT,这并不总是可能的)。

        3
  •  9
  •   Darron    17 年前

    Pax关于TIME_WAIT的原因是正确的,以及为什么你应该小心降低默认设置。

    更好的解决方案是改变套接字发起端使用的端口号。一旦你这样做了,你就不会真正关心等待单个套接字的时间了。

    对于监听套接字,您可以使用SO_REUSEADDR来允许监听套接字绑定,而不管周围有TIME_WAIT套接字。

        4
  •  3
  •   Synetech    10 年前

    在Windows中,您 can change 它 through the registry :

    ; Set the TIME_WAIT delay to 30 seconds (0x1E)
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters]
    "TcpTimedWaitDelay"=dword:0000001E
    
        5
  •  2
  •   andrew glynn    10 年前

    设置tcp_reuse比更改time_wait更有用,只要你有参数(内核3.2及以上版本,不幸的是,这会取消所有版本的RHEL和XenServer的资格)。

    删除该值,特别是对于连接VPN的用户,可能会导致在出站连接上不断重新创建代理隧道。使用低于默认Linux配置的默认Netscaler(XenServer)配置,Chrome有时必须重新创建代理隧道多达十几次才能检索一个网页。不重试的应用程序,如Maven和Eclipse P2,只会失败。

    参数的原始动机(避免重复)被TCP RFC所冗余,该RFC指定在所有TCP请求中包含时间戳。

        6
  •  0
  •   Michael Taylor    10 年前

    我一直在使用一个有20个线程的测试程序对服务器应用程序(在linux上)进行负载测试。

    在959000个连接/关闭周期中,我有44000个连接失败,TIME_WAIT中有数千个套接字。

    在关闭调用之前,我将SO_LINGER设置为0,在测试程序的后续运行中,没有连接失败,TIME_WAIT中的套接字少于20个。

        7
  •  -1
  •   yogman    17 年前

    TIME_WAIT可能不是罪魁祸首。

    int listen(int sockfd, int backlog);
    

    根据Unix网络编程卷1,backlog被定义为已完成连接队列和未完成连接队列的总和。

    假设待办事项为5。如果您有3个已完成连接(ESTABLISHED状态)和2个未完成连接(SYN_RCVD状态),并且有另一个SYN连接请求。TCP栈只是忽略SYN数据包,知道它将在其他时间重新传输。这可能会导致性能下降。

    至少这是我一直在读的。 ;)

    推荐文章