TCP定时器
TCP中使用了几个定时器来确保传输时不会发生过多的延时。
重传计时器(Retransmission Timer):
如果传输过程中发生了丢包就会用到重传定时器(RTO)
每次发一个数据段的时候都会开启重传计时器,收到确认包的时候计时器关闭;如果定时器到时间了,就会发生超时并且重新发送该段,这个重传超时时间RTO为1RTT(round trip time,往返时间),计算重传超时时间,首先要计算RTT:
下面介绍三种类型的RTT:
Mesured RTT(RTTm)——一个数据段从发送到收到确认的时间
Smoothed RTT(RTTs)——加权平均往返时间,RTTm可能会发生变化,波动会很大
Initially -> No value After the first measurement -> RTTs=RTTm //第一个数据段之后 After each measurement -> RTTs= (1-t)*RTTs + t*RTTm //每一个数据包之后计算RTT Note: t=1/8 (default if not given)
Deviated RTT(RTTd)——偏差RTT,大多数时候不单独使用RTTs,需要计算RTTd
Initially -> No value After the first measurement -> RTTd=RTTm/2 After each measurement -> RTTd= (1-k)*RTTd + k*(RTTm-RTTs) Note: k=1/4 (default if not given)
重传超时RTO的时间大多数都是基于RTTs和RTTd来计算的,使用如下公式进行计算
Initial value -> Original (given in question) After any measurement -> RTO=RTTs + 4*RTTd
NOTE:每次重传时,RTO的值都会翻倍。 (RTO(新)= RTO(重传之前) 2)这在Karn算法中有解释*
Persistent持续定时器
是在接收方设置滑动窗口为0的时候使用的(处理零窗口大小的死锁情况:接收方请求下面的数据的包丢了)
当发送TCP收到窗口大小为0的确认时,它会启动持续定时器;当持续定时器到时间后,发送方会发送一个探测报文段(该段只包含1个字节的新数据,有一个序列号,但是序列号不会被确认)这个探测报文段会让接收方重新发送丢失的确认包
(就算你不让我传数据了我也得定时去问问你可以传了没,万一我没收到可以传的消息呢----所以要一直保持联系哦)
Keep Alive计时器
防止两个TCP之间长时间的空闲连接。如果客户端打开了与服务器的连接,然后传了一些数据后就静默了(不处理数据也不发送确认),客户端会崩溃,并且连接会永远保持打开状态,为了防止这种现象,使用了keep alive保持活动计时器。
每次服务器从客户端收到信息时,就会重置keep alive计时器。超时通常是2个小时,如果服务器两个小时后还没有收到客户端的消息,就会发送一个探测段。如果10个探测(每个探测间隔75秒)之后都没有响应的话就终止连接。
(确认对面还活着么哈哈哈哈哈哈哈)
Time Wait等待计时器
在释放连接的时候使用
在发送完第二个FIN的最后一个确认包后开启这个计时器,因为万一我发的确认包中途丢了对面再发一个请求关闭过来,我都已经关闭连接了岂不是糟糕了,所以要等一段时间再关闭连接。