分类: LINUX
2007-08-27 15:50:54
TCP连接建立以后,不管出现什么情况,中继路由器崩溃或者重启,网线断开又再连通,但只要两端主机不发送任何数据,并且两端主机没有被重启,那么这条连接依然可以保留,即使过了几个月的时间。
因此,如果客户机或者服务器两者都希望尽快知道对端是否崩溃又重新启动,必须要实现应用级的定时器来检测非活动状态。
许多TCP的实现提供了保活定时器来实现TCP级别的定时探测功能,但是需要注意的是,保活定时器本身并不是TCP规范的一部分。
保活功能是指试图在服务器端检测到半开放的连接,通常的情况下,都是服务器端使用保活定时器选项。但是并没有什么规定客户端不能使用这个选项。如果双方都特别需要了解对方是否已经消失,则双方都可以使用这个选项。
如果一个给定的连接在两个小时内没有任何动作,则其中一方可以发送一个保活的探察报文段给对方,而且对方肯定是以下四种状态之一 :
1. 对方依然正常运行。此时对端相应此报文段,说明对方正常工作,于是发送探察报文的一方在两个小时后将此定时器复位。如果在发送探察报文前双方有数据发送,则一方在接收到数据两个小时后将自己的保活定时器复位。
2. 如果对方已经崩溃,已经关闭或者正在启动但是还没有启动成功,则发送的探察报文不会有任何回应,发送探察报文的一方在75秒后超时,然后重发,在重发10次之后,还没有收到任何响应,则其认为对端已经关闭并终止连接。
3. 如果对端崩溃并重启成功,则发送方会收到一个响应,但是这个响应肯定是一个复位,是服务器终止这个连接。
4. 如果对端正常运行,但是服务不可达,则通2的情况相同。
在第一种情况下,应用程序通常感觉不到保活定时器的存在,因为一切看来都是正常的,在后三种情况下,应用程序将收到来自TCP的差错报告。第二种情况是连接超时,第三种情况是连接被对方复位,的四种情况类似于连接超时,但是可能要根据ICMP的报文来判断。
通常情况下,这个保活定时器的时间是可以改变的,不过这个时间是一个系统级别的变量,改变后会影响到所有使用这个系统的用户程序。