TCP使用的定时器(Timer,计时器)
重传计时器(Retransmission Timer)
坚持计时器(Persistent Timer)
保活计时器(Keeplive Timer)
时间等待计时器(Time_Wait Timer)
重传定时器(Retransmission Timer)
为了控制丢失的报文段或丢弃的报文段,也就是对报文段确认的等待时间。每发送一个报文段都会启动重传定时器,如果在定时器时间到后还没有收到对该报文段的确认,就重传该报文段,并将重传定时器复位,重新计算。如果在规定时间内收到了对该报文段的确认,则撤销该报文段的重传定时器。
坚持定时器(Persistent Timer)
主要是为了应付零窗口大小通知可能导致的死锁问题。如果接收端在向发送端发送了零窗口报文段后不久,接受端的接受缓存又有了一些存储空间,于是接收端向发送了一个非零窗口大小的报文,然而这个报文段在传送过程中丢失了,发送端没有收到该报文段,就一直等待接收端发送非零窗口的报文通知,而接收端并不知道该报文段丢失了,而是觉着自己已经告诉发送端了,就会一直等待发送端发送数据,如果没有任何行为的话,这种死锁的局面会一直僵持下去。
而为打破这种局面,解决这个问题,TCP为每一个连接都设有一个坚持定时器。只要TCP连接的一方收到对方的零窗口通知,就启动坚持定时器。若坚持定时器设置的时间到期,就发送一个零窗口探测报文段(该报文段只有一个字节的数据,只有一个序号,该序号不需要确认,因此该序号可以持续重传),就回出现三种情况:
- 对方收到探测报文段后,在对该报文段的确认中给出现在的窗口值,如果窗口值仍为零,则收到这个报文段的一方将坚持定时器的值加倍并重启。坚持定时器最大只能增加到越60s,之后,每次收到零窗口通知,坚持定时器的值就定位60s。
- 对方在收到探测报文段后,窗口值不为零,那么死锁的僵局就被打破了。
- 该探测报文段发出后,会同时启动重传定时器,如果重传定时器的时间到期,还没有收到接受到来的响应,就会超时重传探测文。
保活定时器(Persistent Timer)
保活定时器是为了应对出现长时间没有数据传输的情况。如果客户与服务器建立了TCP连接,但后来客户端主机发生故障,服务器就不能立即在收到客户端发来的数据,长时间没有数据发送服务器也不能这样等下去,保活定时器就是解决这个问题。服务器每收到一次客户端的数据,就重新设置保活定时器,通常为2个小时,如果2个小时没有收到客户端的数据,服务端就会发送一个探测报文,以后每隔75s发送一次,如果持续发送10次探测报文段后仍没有收到客户端的响应,服务器就认为客户端可能出现了故障,就可以终止这个连接。
时间等待定时器(Persistent Timer)
在连接释放期间使用,当TCP关闭连接时,并不认为这个连接真正关闭了,在时间等待期间,连接还处于一种中间过渡状态,这样可以使重复的FIN报文段在到达终点后被丢弃,确保发送最后一个ACK报文段能够到达对方。定时的值一般设置为报文段寿命期望值的2倍。