TCP采用超时/重传机制来处理报文段的丢失问题。尽管这在概念上面很简单,可是在实际中还
是会产生不少微妙的问题。最明显仍是超时时间间隔的设置。很显然,这个时间间隔确定会大于RTT
时间,可是具体为多大呢?如何估计最开始的往返时间呢?下面将介绍这些问题的一些解决办法。网络
报文段的样本RTT(表示为SampleRTT)为某报文段发出到对该报文段的确认被收到之间的时间
量大多数TCP的实现仅在某个时刻作一次SampleRTT测量,而不是为每一个报文段测量一个SampleRTT。
也就是说,在任什么时候刻,仅为一个已发送可是目前还没有被确认的报文段估计SampleRTT,从而产生
一个接近每一个RTT的新SampleRTT值。
另外,TCP毫不为被重传的报文计算SampleRTT;它仅为传输一次的报文段测量SampleRTT。学习
因为路由器的拥塞和端系统负载的变化,这些报文段的SampleRTT是波动的,因此给定的任何
SampleRTT都是非典型的。所以要取得典型的RTT,就要对SampleRTT进行加权取值。计算机网络
EstimatedRTT = (1-α)*EstimatedRTT + α*SampleRTT
[RFC 6298]中给出α的参考值为0.125
对于最近的样本赋予较大的权值,是由于越近的样本越能反应网络当前的拥塞情况。
从统计学观点讲,这种平均被称为指数加权移动平均(EWMA)code
除估算RTT外,测量RTT变化也是颇有用的!
[RFC 6298]定义了RTT误差 DevRTT,用于估算SampleRTT偏离EstimatedRTT的程度:路由
DevRTT = (1-β)*DevRTT + β*|SampleRTT - EstimatedRTT|
DevRTT是SampleRTT和EstimatedRTT之差的指数加权移动平均
若是SampleRTT的波动小那么DevRTT的波动便会小,反之亦此。
第一次的DevRTT=1/2(SampleRTT),之后按公式来计算,推荐β为0.25路由器
超时时间间隔应该大于EstimatedRTT而且不能大于太多。超时时间间隔为EstimatedRTT加
上一些余量。而且在SampleRTT值波动大时,余量较大;当波动较小时,余量较小。所以就用
到了DevRTT。由此得出TCP重传时间间隔计算公式:学习笔记
TimeoutInterval = EstimatedRTT + 4*DevRTT
推荐的初始TimeoutInterval为1秒。
出现超时后,TimeoutInterval直接加倍。
由于这次重传多是报文确认ACK由于网络拥塞而延迟到达从而致使报文重传,重传报文
后,不久,ACK到达,会致使SampleRTT变小,进而使TimeoutInterval变小,使后面的报文出
现过早超时!
一旦报文段收到并更新EstimatedRTT后,TimeoutInterval又使用上述公式。方法
此文为《计算机网络 自顶向下方法》的学习笔记4im