RFC2988 计算TCP的重发定时器传输控制协议(TCP)使用一个重发定时器,在缺乏任何远端的数据接收方反馈的情况下来保障数据的传递。该定时器的时间间隔被称为RTO(重发超时)
RFC2988定义了一种标准算法,TCP的发送方需要使用该算法来计算和维护它们的重发定时器。
在某些情况下,对于一个TCP发送方而言,采用比RFC2988所详述的算法更加保守一点的方法(即使用更大的RTO值)可能更有利一些。然而,一个TCP不可以采用更为激进的方法(即RTO不可以小于1秒)。
基本算法
要计算当前的RTO,TCP发送方需要维护两个状态变量,SRTT (平滑环回时间)和RTTVAR(环回时间变量)。另外,我们假设一个时钟间隔G秒。
计算SRTT、RTTVAR和RTO的法则如下:
(1) 在对一个收发双方之间所发出的一个段完成回环时间(RTT)测量之前,发送方应该将RTO设置为3秒。
注意到有一些设施可能采用一种“心跳式”定时器,它能够产生一个介于2.5秒和3秒之间的值。因此,在该定时器绝不会在短于2.5秒的时间内超时的情况下,作为一个较低的2.5秒的步进也是可以接受的,使用间隔为G的心跳式定时器的设施,定时器的值不低于2.5 + G秒。
(2) 当完成第一个RTT测量R时,宿主机必须设置
SRTT <— R
RTTVAR <—R/2
RTO <—SRTT + max (G, K*RTTVAR)
其中K = 4。
(3) 当完成一个并发的RTT测量R'时,宿主机必须设置
RTTVAR <—(1 - beta) * RTTVAR + beta * |SRTT - R'|
SRTT <— (1 - alpha) * SRTT + alpha * R'
用来更新RTTVAR的SRTT的值,就是那个使用第二次分配来更新SRTT之前的SRTT值本身。就是说,更新RTTVAR和SRTT必须按照上述的顺序进行计算。
上述计算应该使用alpha=1/8和beta=1/4进行计算。
在计算之后,宿主机必须更新RTO <— SRTT + max (G, K*RTTVAR)。
SRTT <— R
RTTVAR <—R/2
RTO <—SRTT + max (G, K*RTTVAR)
其中K = 4。
(3) 当完成一个并发的RTT测量R'时,宿主机必须设置
RTTVAR <—(1 - beta) * RTTVAR + beta * |SRTT - R'|
SRTT <— (1 - alpha) * SRTT + alpha * R'
用来更新RTTVAR的SRTT的值,就是那个使用第二次分配来更新SRTT之前的SRTT值本身。就是说,更新RTTVAR和SRTT必须按照上述的顺序进行计算。
上述计算应该使用alpha=1/8和beta=1/4进行计算。
在计算之后,宿主机必须更新RTO <— SRTT + max (G, K*RTTVAR)。
(4) 一旦RTO计算好,如果它小于1秒钟,则RTO应该补充到1秒。
传统地,TCP设施使用粗间隔时钟来测量RTT并触发RTO,这使得应用于RTO上的最小值很大。研究表明,需要一个很大的最小RTO值来保持TCP的保守,以避免虚假重发。因此,RFC2988要求有一个很大的最小RTO值作为保守之需,而同时承认,在未来的某个时刻,研究可能表明一个小一些的最小RTO值是可接受的,或者,是优越的。
(5) 可以给RTO使用最大值,如果该值至少有60秒。
转载于:https://blog.51cto.com/3layer/1119523