TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到
但还没有收到确认,就要重传这一报文段。
由于TCP 的下层是一个互连网环境,IP 数据报所选择的路由变化很大。因而传输层的往返
时延的方差也很大。
往返时延的自适应算法
记录每一个报文段发出的时间,以及收到相应的确认报文段的时间。这两个时间之差就是报
文段的往返时延。
将各个报文段的往返时延样本加权平均,就得出报文段的平均往返时延RTT。
每测量到一个新的往返时延样本,就按下式重新计算一次平均往返时延RTT:
平均往返时延RTT =a*(旧的RTT)+(1-a)*(新的往返时延样本)
在上式中,0=<a<1。
时延样本的影响不大(RTT 值更新较慢)。
若选择a 接近于零,则表示加权计算的平均往返时延RTT 受新的往返时延样本的影响较大
(RTT 值更新较快)。
典型的a 值为7/8。
文段的往返时延。
将各个报文段的往返时延样本加权平均,就得出报文段的平均往返时延RTT。
每测量到一个新的往返时延样本,就按下式重新计算一次平均往返时延RTT:
平均往返时延RTT =a*(旧的RTT)+(1-a)*(新的往返时延样本)
在上式中,0=<a<1。
参数a 的选择
若a 很接近于1,表示新算出的平均往返时延RTT 和原来的值相比变化不大,而新的往返时延样本的影响不大(RTT 值更新较慢)。
若选择a 接近于零,则表示加权计算的平均往返时延RTT 受新的往返时延样本的影响较大
(RTT 值更新较快)。
典型的a 值为7/8。
超时重传时间RTO(Retransmission Time-Out)
计时器的RTO 应略大于上面得出的RTT,
即: RTO = b * RTT
这里b 是个大于1 的系数。
若取b 很接近于1,发送端可及时地重传丢失的报文段,因此效率得到提高。
但若报文段并未丢失而仅仅是增加了一点时延,那么过早地重传反而会加重网络的负担。
因此TCP 原先的标准推荐将b 值取为2。
如何判定此确认报文段是对原来的报文段1 的确认,还是对重传的报文段2 的确认?
即: RTO = b * RTT
这里b 是个大于1 的系数。
若取b 很接近于1,发送端可及时地重传丢失的报文段,因此效率得到提高。
但若报文段并未丢失而仅仅是增加了一点时延,那么过早地重传反而会加重网络的负担。
因此TCP 原先的标准推荐将b 值取为2。
往返时间测量的复杂性
TCP 报文段1 没有收到确认。重传(即报文段2)后,收到了确认报文段ACK。如何判定此确认报文段是对原来的报文段1 的确认,还是对重传的报文段2 的确认?
Karn算法
在计算平均往返时延RTT 时,TCP 不采用重传报文段的往返时延样本。由于避免了二义性的存在,这样得出的平均往返时延RTT 和重传时间就较准确。
当网络时延增大时,TCP 忽略了重传对往返时延的影响,会造成反复重传。
修正的Karn算法
报文段每重传一次,就将重传时间增大一些:新的重传时间=r*(旧的重传时间)
系数r 的典型值是2 。
当不再发生报文段的重传时,才根据报文段的往返时延更新平均往返时延RTT 和重传时间
的数值。
实践证明,这种策略较为合理。