将tcp_max_tw_buckets设置为非常小的值的副作用是什么?



我知道这是非常正常的设置tcp_max_tw_buckets到一个相对较小的数字(例如30000或50000),以避免主机具有大量时间等状态连接和应用程序的情况打开新的。这是很多东西。例如这样的问题:如何减少time_wait中的插座数?

和以前一样,我知道时间等是避免TCP数据包过失的状态,并且使用其他方法来应对它可能更好。如果您将其设置为少量,可能会出错。

我觉得我被困在某个地方,我必须将tcp_max_tw_buckets设置为少数数字,并且不知道我将避免的特定情况。

所以我的问题是将TCP_MAX_TW_BUCKETS设置为非常小的值的副作用是什么,我可以使用实验室环境设置特定的方案,少数TCP_MAX_TW_BUCKET会导致麻烦?

正如您在此内核源中看到的那样,该选项可防止套接字的优雅终止。就插座状态而言,您将此连接的时间等待时间缩短为零。

那么接下来会发生什么?首先,您将在服务器上看到错误消息。然后,其余的是赛车条件,可以使您的客户随后连接。然后,RFC 1337的第2节涵盖了您可能看到的内容。简而言之,某些连接 May 显示以下症状。

  1. 数据流的损坏(因为插座接受旧的变速箱)。
  2. 无限的ACK循环(由于被拾取了旧的重复ACK)。
  3. 删除连接(由于旧数据以综合状态出现)。

但是,证明这可能很难。如在同一RFC中所述:

在模拟环境中运行的库存Sun OS 4.1.1 TCP上已证明了三种危害H1,H2和H3,该环境大规模复制了细分市场。这种环境比大多数真正的TCP必须应对的危险要差得多,并且经过精心调整的条件以为失败创造必要的条件。

您问题的真正答案是,避免time_wait状态的正确方法是接收第一个关闭的结局。

在服务器的情况下,这意味着在发送响应后,应循环在同一插座上等待另一个请求,当然是读取的超时,以便通常是客户端结束第一的。这样,Time_wait状态就会发生在客户相当无害的客户端,因为客户没有太多出站连接。

相关内容

最新更新