荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: lvyou (≈北风迎头再遇≈), 信区: Security
标 题: 28. 如何避免一个套接字进入TIME_WAIT状态(修订)
发信站: 荔园晨风BBS站 (Tue May 29 22:40:46 2001), 站内信件
发信人: scz (小四), 信区: Security WWW-POST
标 题: 28. 如何避免一个套接字进入TIME_WAIT状态(修订)
发信站: 武汉白云黄鹤站 (Tue May 29 00:27:02 2001) , 转信
28. 如何避免一个套接字进入TIME_WAIT状态(修订)
Q: 我正在写一个unix server程序,不是daemon,经常需要在命令行上重启它,绝
大
多数时候工作正常,但是某些时候会报告"bind: address in use",于是重启
失
败。
A: Andrew Gierth <andrew@erlenstar.demon.co.uk>
server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。至于
TIME_WAIT状态,你无法避免,那是TCP协议的一部分。
Q: 如何避免等待60秒之后才能重启服务
A: Erik Max Francis <max@alcyone.com>
使用setsockopt,比如
------------------------------------------------------------------------
--
int option = 1;
if ( setsockopt ( masterSocket, SOL_SOCKET, SO_REUSEADDR, &option,
sizeof( option ) ) < 0 )
{
die( "setsockopt" );
}
------------------------------------------------------------------------
--
Q: 编写 TCP/SOCK_STREAM 服务程序时,SO_REUSEADDR到底什么意思?
A: 这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重
用
端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信
息,
指明"地址已经使用中"。如果你的服务程序停止后想立即重启,而新套接字依
旧
使用同一端口,此时 SO_REUSEADDR 选项非常有用。必须意识到,此时任何非
期
望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很
不
可能。
一个套接字由相关五元组构成,协议、本地地址、本地端口、远程地址、远程
端
口。SO_REUSEADDR 仅仅表示可以重用本地本地地址、本地端口,整个相关五元
组
还是唯一确定的。所以,重启后的服务程序有可能收到非期望数据。必须慎重
使
用 SO_REUSEADDR 选项。
Q: 在客户机/服务器编程中(TCP/SOCK_STREAM),如何理解TCP自动机 TIME_WAIT
状
态?
A: W. Richard Stevens <1999年逝世,享年49岁>
下面我来解释一下 TIME_WAIT 状态,这些在<<Unix Network Programming Vol
I>>
中2.6节解释很清楚了。
MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实
现
都必须选择一个确定的MSL值。RFC 1122建议是2分钟,但BSD传统实现采用了30秒
。
TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟。
IP头部有一个TTL,最大值255。尽管TTL的单位不是秒(根本和时间无关),我们仍
需
假设,TTL为255的TCP报文在Internet上生存时间不能超过MSL。
TCP报文在传送过程中可能因为路由故障被迫缓冲延迟、选择非最优路径等等,结
果
发送方TCP机制开始超时重传。前一个TCP报文可以称为"漫游TCP重复报文",后一
个
TCP报文可以称为"超时重传TCP重复报文",作为面向连接的可靠协议,TCP实现必
须
正确处理这种重复报文,因为二者可能最终都到达。
一个通常的TCP连接终止可以用图描述如下:
client server
FIN M
close -----------------> (被动关闭)
ACK M+1
<-----------------
FIN N
<----------------- close
ACK N+1
----------------->
为什么需要 TIME_WAIT 状态?
假设最终的ACK丢失,server将重发FIN,client必须维护TCP状态信息以便可以重
发
最终的ACK,否则会发送RST,结果server认为发生错误。TCP实现必须可靠地终止
连
接的两个方向(全双工关闭),client必须进入 TIME_WAIT 状态,因为client可能
面
临重发最终ACK的情形。
此外,考虑一种情况,TCP实现可能面临先后两个同样的相关五元组。如果前一个
连
接处在 TIME_WAIT 状态,而允许另一个拥有相同相关五元组的连接出现,可能处
理
TCP报文时,两个连接互相干扰。使用 SO_REUSEADDR 选项就需要考虑这种情况。
为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间?
如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止
了。
第二个拥有相同相关五元组的连接出现,而第一个连接的重复报文到达,干扰了第
二
个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让
TIME_WAIT
状态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么
被
丢弃。建立第二个连接的时候,不会混淆。
--
也许有一天,他再从海上蓬蓬的雨点中升起,
飞向西来,再形成一道江流,再冲倒两旁的石壁,
再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生......
※ 来源:.武汉白云黄鹤站WWW bbs.whnet.edu.cn. [FROM: 211.167.65.123]
--
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 是什么缘份,让我们相遇的一起?生命的转折就是这么奇妙。 ┃
┃ 惜 我们又解逅在不可预知的现在,悄然相遇是多么欢喜。 缘 ┃
┃ 请珍惜我们彼此拥有的此刻,让我好好倾听你的细语…… ┃?
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.29]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店