TCP管理的4个不同的定时器:

1.重传定时器:用于当希望收到另一端的确认。

2.坚持定时器:使窗口大小信息保持不断流动。

3.保活定时器:检测TCP空闲连接的另一端何时崩溃或重启。

4.2MSL定时器:测量一个连接处于TIME_WAIT状态的时间。MSL(报文段最大生存时间)

重传定时器

规定:第一次发送后所设置的超时时间为1.5秒,之后为3、6、12、24、48、多个64秒,     第一次到最后一次的时间差约为9分                  钟,定义该值的变量名为tcp_ip_abort_interval。

若收到特定报文段的确认之前计时器已经超时,则重传该报文,并把计时器复位。

慢启动并不完全正确,慢启动期间进入网络的分组数增加的速率仍然是在增加的,只有在达到ssthresh拥塞避免算法起作用时,这种增加的速率才会慢下来。

坚持定时器

根本目的是防止接收端回复的ACK报文丢失,导致发送端不能及时发送下一个报文的死锁情况。其作用是使窗口大小信息保持不断流动。

当接收端回复的通告窗口为0,从而使客户端停止发送任何数据时,发送方的坚持定时器开始计时,第一次触发坚持定时器重新发送报文的时间间隔约为5秒,之后的时间间隔约为5、6、12、24、48、多个60秒,这与重传定时器触发的时间间隔类似,值得注意的时,坚持定时器与重传定时器不同的是:坚持定时器的TCP从不放弃发送窗口探查,之后的探查每隔60秒发送一次,一直持续到窗口被打开或者TCP连接被终止。此外,坚持定时器重发的窗口探查为字节数为1的报文,这降低了对网络上带宽的占用。

TCP的保活定时器:(通常用于服务器)

我们之前提到过TCP的半打开(half-open)连接,即一端已经关闭或者异常终止而没有通知另一端所引起。保活功能就是试图在服务器端检测到这种半打开的连接。

但也有人提出异议,如果TCP的两端都没有异常,而是中间路由器因为某种原因down掉而又重新启动,保活功能将会认为TCP的一端出现问题而将一个很好的连接断掉,他们认为保活功能不应该在TCP中提供,而应该由应用程序完成,例如,BGP协议每30秒向对端发送一个应用的探查;osfp协议默认hello消息10秒,dead 40秒,即如果40s没有收到hello消息,就认为邻居down掉了。

规定:如果一个给定的连接在默认的两个小时(tcp_keepidle = 14400 每个代表500ms)之内没有任何动作,则服务器就向客户发送一个探查报文段,客户机一定处于以下四种状态之一:

(1).客户机正常运行,并从服务器可达。这时,服务器将keepalive timer复位。

(2).客户机已经崩溃或者关闭或者重新启动。客户机的TCP没有响应,服务器将在75秒超时后在此向客户机发送探查报文段,总共发送10个,每个间隔75秒(tcp_keepintvl = 150),如果服务器都没有收到响应,则终止TCP连接。

(3).客户机崩溃并已经重新启动。此时如之前提到的半打开连接,客户端不再承认与服务器的tcp连接,它会向服务器发送RST响应,终止该连接。

(4).客户机正常运行,但是服务器不可达。这时,服务器的探查报文超时,接下来的操作与情况(2)相同。

2MSL定时器:

TIME_WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间(MSL)。它是任何报文段被丢弃前在网络内的最长时间(默认为2分钟,实现中常设置为30秒,1分钟或2分钟)。正如前文所提2MSL状态,2MSL定时器在TCP终止的四次握手中的第四次握手开始启动,此时发送FIN方处于LAST_ACK状态,而发送ACK方处于TIME_WAIT状态,为了确保它发送的最后一个ACK可以顺利的到达服务器,2MSL定时器启动,直至到达预定的时间才复位结束,双方进入CLOSED状态。如果主动关闭方在被动关闭方的TIME_WAIT状态不等待一段时间就直接释放连接并进入 CLOSED 状态,那么主动关闭方无法收到来自被动关闭方重发的 FIN+ACK 报文段,也就不会再发送一次确认ACK 报文段,因此被动关闭方就无法正常进入CLOSED状态。

此外,还有一点要说明,即使主动关闭方顺利收到ACK并且进入CLOSED状态,被动关闭方仍然要等待2MSL时间,并且,这段时间内,被动关闭方的端口不可以被其他应用程序使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

05-11 21:43