首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置TIME_WAIT TCP

设置TIME_WAIT TCP
EN

Stack Overflow用户
提问于 2008-12-03 13:35:07
回答 7查看 128.1K关注 0票数 77

我们正在尝试优化一个应用程序,该应用程序通过TCP接受消息,并将TCP用于其内部消息传递。在进行负载测试时,我们注意到,随着对系统提出更多的同时请求,响应时间显著缩短(然后完全停止)。在此期间,我们看到许多TCP连接处于TIME_WAIT状态,有人建议将TIME_WAIT环境变量从默认的60秒降至30秒。

我所理解的中,TIME_WAIT设置实质上设置了连接关闭后系统再次可用的TIME_WAIT资源的时间。

我不是“网络迷”,对这些事情知之甚少。我需要很多链接帖子里的东西,但是有点“哑口无言”。

  • 我想我理解为什么不能将TIME_WAIT值设置为0,但它能安全地设置为5吗?十块怎么样?是什么决定了这个值的“安全”设置?
  • 为什么这个值的默认值是60?我猜,比我聪明得多的人有充分的理由选择这是一个合理的默认。
  • 对于超越这个价值的潜在风险和好处,我还应该知道什么呢?
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-12-03 13:46:17

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

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

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

这可以保证,在允许您使用相同的元组创建连接之前,属于该元组先前化身的所有数据包都将死亡。

这通常指示您应该使用的最小值。最大分组年龄由网络属性决定,例如,卫星寿命高于LAN生命周期,因为数据包还有更长的路要走。

票数 107
EN

Stack Overflow用户

发布于 2008-12-03 15:40:34

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

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

票数 21
EN

Stack Overflow用户

发布于 2008-12-03 14:05:28

Pax对于TIME_WAIT的原因是正确的,以及为什么您应该谨慎地降低默认设置。

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

对于侦听套接字,您可以使用SO_REUSEADDR来允许侦听套接字绑定,尽管TIME_WAIT套接字位于附近。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/337115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档