超时重传是TCP协议保证数据可靠性的另一个重要机制,原理是TCP每发送一个报文段,就对这个报文段设置一次计时器。如果当定时器溢出时还没有收到确认,它就重传该数据。对任何实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传的频率。
1、超时
超时时间的计算是超时的核心部分,TCP要求这个算法能大致估计出当前的网络状况,虽然这确实很困难。要求精确的原因有两个:(1)定时太久会造成网络利用率不高。(2)定时太短会造成多次重传,使得网络阻塞。
报文段的往返时延是指收到确认报文的时间与每一个报文段发出的时间之差。
报文段的平均往返时延RTT是由各个报文段的往返时延样本加权平均得出来的。
计算公式为:平均往返时延RTT=α×(旧的RTT)+(1-α)×(新的往返时延样本),1 ≤ α < 1 (典型的值α为7/8)
即使有一个好的RTT,要选择一个合适的超时重传时间RTO(Restransmission Time out)仍然不是一个容易的事情。显然RTO要大于RTT。其计算公式为 RTO = β × RTT, β > 1, 推荐是2。
Karn算法说的就是更新RTO和估计器的值的时机选择问题。
计时器的使用:
(1)一个连接中,有且仅有一个测量定时器被使用。也就是说,如果TCP连续发出3组数据,只有一组数据会被测量。
(2)ACK数据报不会被测量,原因很简单,没有