Web服务器如何避免TIME_WAIT状态?

10
我正在编写一个简单的HTTP服务器并学习TIME_WAIT。在高负载环境下,真正的Web服务器如何处理来自数千用户的请求,而不会在处理请求后所有套接字都陷入TIME_WAIT状态?(不是问keep-alive - 这对于单个客户端有帮助,但对于成千上万个不同的客户端进入不适用)。
我已经阅读了一些资料,尝试让客户端先关闭,这样所有的TIME_WAIT就可以分散在所有客户端之间,而不是集中在服务器上。
这是如何实现的?服务器必须在某个时候调用close/closesocket。
1个回答

13

发起主动关闭的对等方将进入TIME_WAIT状态。只要客户端关闭连接,客户端就会进入TIME_WAIT状态,而不是服务器。我在这篇博客文章中更详细地解释了这一点。如果无法访问该链接,则可以使用wayback机器查看


那么服务器只是一直挂着等客户端关闭吗?我认为在某个时候它会想要超时并自己关闭连接。 - DougN
这让我想到另一个问题 :) 你认为真正的Web服务器(IIS / Apache?)是否只需在套接字上调用select,并设置5(?)秒超时 - 认为这应该足够时间让客户端断开连接(并让select返回错误套接字)? - DougN
3
如果你重置连接而不是关闭它,那么你也不会进入TIME_WAIT状态。因此,如果你想为空闲连接添加超时时间,你应该先关闭linger,然后再发出关闭连接的指令。这将发送一个RST信号,从而避免了进入TIME_WAIT状态。 - Len Holgate
1
默认情况下,不会延迟关闭。这只是意味着在close()中没有阻塞。仍然会发送FIN。启用延迟关闭并设置正值超时时间会导致在关闭期间阻塞多达超时时间长度。仍然会发送FIN。第三种情况是发送RST的情况。 - user207421
EJP - 你说得对,我应该更加精确。通过“关闭延迟”我是指将延迟超时设置为0以强制中止关闭。(http://msdn.microsoft.com/en-us/library/windows/desktop/ms737582(v=vs.85).aspx) - Len Holgate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接