Web 服务器如何避免 TIME_WAIT?

Posted

技术标签:

【中文标题】Web 服务器如何避免 TIME_WAIT?【英文标题】:How do web servers avoid TIME_WAIT? 【发布时间】:2010-09-17 20:02:41 【问题描述】:

我正在编写一个简单的 HTTP 服务器并学习 TIME_WAIT。在繁重的环境中,真正的 Web 服务器如何处理来自数千个用户的请求,而不会在处理请求后所有套接字都卡在 TIME_WAIT 中? (不问保持活动状态——这对单个客户有帮助,但对数千个不同的客户没有帮助)。

我读到您尝试让客户端先关闭,以便所有 TIME_WAIT 分散在所有客户端之间,而不是集中在服务器上。

这是怎么做到的?在某些时候,服务器必须调用 close/closesocket。

【问题讨论】:

【参考方案1】:

启动主动关闭的对等方是进入 TIME_WAIT 的对等方。因此,只要客户端关闭连接,客户端就会获得 TIME_WAIT 而不是服务器。我会更详细地介绍这一切in this blog posting。

【讨论】:

那么服务器是否只是闲逛并等待客户端关闭?我认为在某些时候它会想要超时并关闭连接本身。 这让我想到另一个问题 :) 你是否认为真正的 Web 服务器(IIS/Apache?)只是在 5(?)秒超时的情况下调用套接字上的 select —— 认为应该是客户端有足够的时间断开连接(并让选择返回错误套接字)? 如果您重置连接而不是关闭它,那么您也不会进入 TIME_WAIT。因此,如果您想为空闲连接添加超时,您可以通过首先关闭 linger 然后发出关闭来关闭它们。这会发送一个 RST,你不会在 TIME_WAIT 结束。 没有。延迟关闭是默认设置。它只是意味着在 close() 中没有阻塞。仍会发送 FIN。以正超时逗留会导致在 close() 中阻塞直到超时。 FIN 仍然被发送。第三种情况是发送RST的情况。 EJP - 你是对的,我应该更准确。通过“关闭逗留”,我指的是将逗留超时设置为 0 以强制和中止关闭。 (msdn.microsoft.com/en-us/library/windows/desktop/…)

以上是关于Web 服务器如何避免 TIME_WAIT?的主要内容,如果未能解决你的问题,请参考以下文章

如何让server服务器避免2MSL

避免 TIME_WAIT

如何让server避免2MSL

TIME_WAIT 优化注意事项

服务器TIME_WAIT和CLOSE_WAIT详解和解决办法

centos中,内核优化。适合用于优化WEB服务器等TCP/IP连接多的服务器