TCP四种定时器
重传计时器、坚持计时器、保活计时器、时间等待计时器
重传计时器:
在TCP发送报文时创建,用来确认报文是否成功发送,超过预定时间,则重新发送,设置重传计时器之后,通常有两种情况:
1、在计时器截止时间到达之前收到了对以发送报文的确认信号,则撤销此计数器;
2、计时器时间到达仍未收到确认信号,则重新发送该报文,并将计时器复位。
坚持计时器:
这种计时器通常是和窗口大小有关的。
先考虑这样一种场景:发送端由于发送速度太快,接收端的窗口大小为零,这是接收段就会发送信号告诉发送端,我现在窗口大小为零,先不要发送数据了,接收端接收到之后,暂停发送数据;一段时间之后,接收端有了新的窗口大小,这时会再向发送段发送确认信号,我现在缓冲区有空间了,并告诉了自己的窗口大小【在前面三次握手和四次挥手中可以看到,我们是不需要对确认信号再次进行确认的】。但是这里可能会出现问题的是,接收端发送的这个确认数据包可能会丢失,一旦丢失,接收端在等待着发送端发送数据,发送端在等待着接收段发来确认信号,以继续发送数据,这就造成了死锁。
很明显,这种情况是由于接收端窗口大小为零之后可能导致的问题。为了避免这种情况,就有了坚持计数器的产生。当发送端收到窗口大小为0的确认信号时,就启动了坚持计数器,如果坚持计数器的时间到达之后,还没有收到接收端发来的确认信号,就会主动发送一个特殊的报文端,叫做探测报文。探测报文只有一个字节的数据,它有一个序号,和普通报文不同,它的序号不需要被确认。探测报文是为了提醒接收端,刚刚给我发送的窗口大小已经丢了,要重新想我发送ACK确认信号,如果接收端没有回应,则需要重新发送一个探测报文,并将坚持计数器的时间加倍,直到增大到60s。在这之后,每隔60s就发送一个探测报文,直到窗口重新打开。
TCP规定,即使窗口大小为0,也必须接收的三种报文: 零窗口探测报文段、确认报文段和携带紧急数据的报文段。
保活计时器:
用来防止两个TCP之间的连接出现长时期的空闲。
当client打开了server的连接,传送了很短时间的数据之后,就保持静默,可能会因为各种原因导致,但现在它确实处于了空闲状态。如果由于client出现故障,那么这个连接就一直处于打开状态。
为了避免这种情况,引入了保活计时器。每当server收到了client发来的信息,就将计时器清零。如果server超过了保活计时器的时间仍没有收到任何消息,就会向client发送探测报文段,若发送了10个探测报文段之后仍没有反应,则认为client故障,server主动断开连接。
时间等待计时器:
连接终止期间使用【TIME_WAIT】。
首先认识一个概念,MSL,报文最大生存时间。任何报文在网络上超过MSL之后,将被直接丢弃。
在TCP第三次挥手期间,客户端收到了服务器发来的FIN报文,之后客户端启动了TIME_WAIT计时器,时间设置为2MSL,并发送最后一个ACK。保证了2MSL时间内server可以收到最后一个ACK确认信号,同时保证了在之前发送的报文不会在连接关闭之后再次骚扰server,因为网络中的数据包到达目的地的时间是不确定的。
重传计时器 通常设置为 60s
坚持计时器 门限值60s
保活计时器 通常设置为2小时
时间等待计时器 通常设置为2MSL
转载于:https://blog.51cto.com/muhuizz/1903689