一、超时重传时间的选择是TCP最复杂的问题之一
1、若超时重传时间远小于往返时间RTT,会造成不必要的重传,使网络负荷增大
2、若超时重传时间RTO远大于往返时间RTT,会使网络的空闲时间增大,降低了传输效率
3、不能直接使用某次测量得到的RTT样本来计算超时重传时间RTO
二、加权平均往返时间RTTs
1、利用每次测量得到的RTT样本,计算加权平均往返时间RTTs(又称为平滑的往返时间)
(1)RTTs1=RTT1
(2)新的RTTs=(1-a)旧的RTTs+a新的RTT样本
(3)上式中,0<=a<1:
1)若a很接近于0,则新的RTT样本对RTTs影响不大;
2)若a很接近于1,则新的RTT样本对RTTs的影响较大;
(4)已成为建议标准的RFC6298推荐的a的值为1/8,即0.125
2、用这种方法得出的加权平均往返时间RTTs就比测量出的RTT值更加平滑
3、显然,超时重传时间RTO应略大于加权平均往返时间RTTs
三、RFC6298建议使用的超时重传时间RTO计算方法
1、RTO = RTTs + 4 RTTd
(1)RTTd1 = RTT1 / 2
(2)新的RTTd = (1 - B) 旧的RTTd + B * |RTTs - 新的RTT样本|
(3)0 < B < 1
(4)已成为建议标准的RFC6298推荐的B值为1/4即0.25
2、往返时间RTT的测量比较复杂
四、Karn算法
1、针对出现超时重传时无法测准往返时间RTT的问题,Karn提出了一个算法,在计算加权平均往返时间RTTs时,只要报文段重传了,就不采用其往返时间RTT样本。也就是出现重传时,不重新计算RTTs,进而超时重传时间RTO也不会重新计算
2、但又引起了新的问题。当报文段的时延突然增大了很多,并且之后很长一段时间都会保持这种时延。因此在原来得出的重传时间内,不会收到确认报文段。于是重传报文段。但根据Karn算法,不考虑重传的报文段的往返时间样本。这样,超时重传时间就无法更新。这会导致报文段反复被重传。
3、因此,要对Karn算法进行修正。方法是:报文段每重传一次,就把超时重传的时间RTO增大一些。典型的做法是将新RTO的值取为旧RTO值的2倍。