大多数TCP至少实现使用4个计时器:重传计时器,持续计时器,保活计时器,TIME_WAIT计时器
1.重传计时器:
为了重传丢失的报文,TCP应用了一个重传计时器来处理重传超时(RTO),也就是对报文段的确认的等待时间。
RTO主要是通过往返时间(RTT)得出的,从发送出去一个报文段到收到对它的确认需要多少时间,这就是测量RTT。
我们使用RTTM表示测量RTT。
平滑RTT:
测量RTT很可能每次往返都有变化,所以单次测量值无法被用于超时重传的目的。绝大多数实现使用的是一种平滑的RTT,记为RTTS,它是对RTTM和RTTS的加权平均:
image.png
α一般为1/8,即新的RTTS是由7/8的就RTTS和1/8的当前RTTM相加而成。
RTT的偏差:
大多数的实现不仅使用了RTTS,还要计算RTT的偏差,称为RTTD。他是根据RTTS和RTTM并使用下面的公式计算得到的:
image.png
β一般为1/4。
重传超时(RTO)
RTO的数值基于平滑的往返时间和它的偏差值,绝大多数实现使用下面的公式计算RTO(图中的RTT是RTTD):
image.png
2.持续计时器:
为了处理零窗口的情况,TCP需要另一个计时器。如果接受TCP宣布窗口值为0,那么发送TCP会停止发送报文,直到收到接收TCP发送来一个宣布窗口大小非零的确认。但是这个ACK可能会丢失。在TCP中,对于仅仅含有确认信息的报文段既不需要确认,也不需要重传。
如果ACK报文丢失了,但是接收TCP认为自己已经完成了任务,等待发送TCP继续发送报文。发送TCP也没有收到确认,就等待接收TCP发送确认来通知窗口的大小。这2个TCO都会永远地等待对方(死锁)。
因此,为了解决这个情况,TCP为每个链接使用一个持续计时器。当发送TCP接收到窗口值为0的确认时,就启动一个持续计时器,当时持续计时器超时后,发送TCP会发送一个特殊报文段,称为探测报文段,促使接收TCP重传一个确认。
持续计时器的时间长度被设置为重传时间的值,但是若没有收到确认方的相应,则需要发送另一个探测报文段,并且将其持续计时器的值加倍,并且计时器复位。发送方继续发送探测报文段,不断地将计时器的值加倍和复位,直到这个值达到一个门限(通常是60秒)。在这之后,发送方每个60秒就发送一个探测报文,直到窗口重新打开。
3.保活计时器:
为了解决客户因故障无法重连,以防止服务端无限等待的情况。绝大多数的实现是给服务器设置了一个保活计时器。每当服务器收到客户的信息,就把该计时器复位。超时通常设置为2个小时,若服务器超过了2个小时还没有收到客户的信息,那么就发送一个探测报文段。若连续发送了10个探测报文段(每隔75秒一个)还没有收到响应,他就假定客户出了故障,并终止这个连接。
4.TIMIE-WAIT计时器:
在关闭TCP连接,保证被动关闭防的FIN数据报文能够被收到所启动的计时器,时间为2MSL的大小。
网友评论