讨厌的 Socket TIME_WAIT 问题

(转)
TIME_WAIT状态
根据TCP协议定义的4次握手断开连接规定,发起socket主动关闭的一方socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket,甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证.
可以用如下代码尝试关闭TIME_WAIT,但这样作是很危险的,违背TCP协议的,也不一定有效果.
linger InternalLinger = { 1, 0 };
::setsockopt(socket, SOL_SOCKET, SO_LINGER, (const char*)&InternalLinger, sizeof(linger));

中庸的做法是,可在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名为TcpTimedWaitDelay的
DWORD键,设置为30-240,以缩短TIME_WAIT的等待时间,这也是对IIS服务器的优化手段之一.编程上,除非必要,应尽量让客户端发起断开操作.

posted on 2007-01-16 11:58 修一居士 阅读(9054) 评论(2)  编辑 收藏 引用

评论

# re: 讨厌的 Socket TIME_WAIT 问题 2007-03-29 17:52 HappyDay

在设置中强制修改TIME_WAIT的时间对于延迟比较严重的末端节点非常有害,最好在设计中保证由客户端开始,由客户端结束。当然如果需要服务器发起大规模并发,可以考虑在中层建立session server。这种方法实践证明非常可靠,并且实现简单。  回复  更多评论   

# re: 讨厌的 Socket TIME_WAIT 问题 2007-08-23 11:33 请教

中层建立session server。是怎么实现的,谢谢?  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

常用链接

留言簿(3)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜