TCP的重传机制

时间:2022-12-28 10:17:22
重传机制是TCP 中最重要和最复杂的问题之一。
TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到
但还没有收到确认,就要重传这一报文段。
由于TCP 的下层是一个互连网环境,IP 数据报所选择的路由变化很大。因而传输层的往返

时延的方差也很大。

TCP的重传机制

往返时延的自适应算法

记录每一个报文段发出的时间,以及收到相应的确认报文段的时间。这两个时间之差就是报
文段的往返时延。
将各个报文段的往返时延样本加权平均,就得出报文段的平均往返时延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。

往返时间测量的复杂性

TCP 报文段1 没有收到确认。重传(即报文段2)后,收到了确认报文段ACK。
如何判定此确认报文段是对原来的报文段1 的确认,还是对重传的报文段2 的确认?
TCP的重传机制

Karn算法

在计算平均往返时延RTT 时,TCP 不采用重传报文段的往返时延样本。
由于避免了二义性的存在,这样得出的平均往返时延RTT 和重传时间就较准确。
当网络时延增大时,TCP 忽略了重传对往返时延的影响,会造成反复重传。

修正的Karn算法

报文段每重传一次,就将重传时间增大一些:
新的重传时间=r*(旧的重传时间)
系数r 的典型值是2 。
当不再发生报文段的重传时,才根据报文段的往返时延更新平均往返时延RTT 和重传时间
的数值。
实践证明,这种策略较为合理。