本节课我们介绍 TCP 超时重传时间的选择,超时重传时间的选择是 TCP 最复杂的问题之一。
我们来举例说明,假设主机 A 和 B 是因特网上的两台主机,他们之间已经建立了 TCP 连接,纵坐标为时间,现在主机 A 给主机 B 发送 TCP 数据报文段 0,并记录下当前的时间。
主机 B 收到后给主机 A 发送相应的确认报文段。主机 A 收到确认报文段后,记录下当前的时间。
那么主机 A 记录下的这两个时间,它们的差值,就是报文段的往返时间 RTT 由于这是第 0 个报文段的 RTT,我们就用 RTT0 来表示。试想一下,如果我们将超时重穿时间,RTO 的值设置的比 RTT0 的值小,会出现怎样的情况?很显然这会引起报文段不必要的重传,使网络负荷增大。
那么如果将超时重传时间,RTO 的值设置的远大于 RTT0 的值,又会出现怎样的情况?很显然这会使重传推迟的时间太长,使网络的空闲时间增大,降低了传输效率。
综合上述两种情况,我们可以得出这样的结论,超时重传时间 RTO 的值应该设置为略大于报文段往返时间 RTT 的值。至此同学们可能会觉得超时重传时间的选择也并不是很复杂,然而 TCP 下层是复杂的互联网环境,主机 A 所发送的报文段可能只经过一个高速率的局域网,也有可能经过多个低速率的网络,并且每个 IP 数据报的转发路由还可能不同。
例如现在主机 A 给主机 B 发送 TCP 数据报文段 1,主机 B 收到后,给主机 A 发送相应的确认报文段,主机 A 这次测得的报文段往返时间 RTT 一如图所示,显然 RTT1 远大于 RTT0,如果超时重装时间 RTO 还是我们之前所确定的略大于 RTT0 的话,这对于数据报文段 1 是不合适的,会造成该报文段不必要的重传。
这样看来超时重传时间的选择确实不那么简单了,我们不能直接使用某次测量得到的 RTT 样本来计算超时重装时间 RTO,但是我们可以利用每次测量得到的 RTT 样本,计算加权平均往返时间 RTTS,这样可以得到比较平滑的往返时间。当测量到第一个 RTT 样本时,RTTS 的值直接取为第一个 RTT 样本的值,以后每测量到一个 RTT 样本时,都按该公式来计算新的 RTT S 值。
在上式中阿尔法的取值大于等于 0,且小于一,若阿尔法很接近于零,则新 RTT 样本对 RTTS 的影响不大,若阿尔法很接近于一则新 RTT 样本,对 RTTS 的影响较大,已成为建议标准的 RFC6298,推荐的阿尔法值为 1/8,即 0.125,用这种方法得出的加权平均往返时间 RTTS 的值就要比测量出的 RTT 的值更加平滑。
显然超时重传时间,RTO 的值应略大于加权平均往返时间 RTTS 的值。
下面我们给出 RFC6298 建议使用的超时重传时间 RTO 的计算公式,该公式中的 RTTS 是加权平均往返时间,我们刚刚介绍过它的计算方法,RTTD 是 RTT 偏差的加权平均,计算方法如下,当测量到第一个 RTT 样本时,RTTD 的值取为该样本值的一半,以后每测量到一个 RTT 样本时,都按该公式来计算新的 RTTD 的值。
在上式中贝塔的取值大于等于 0 且小于 1,已成为建议标准的 RFC6298 推荐的贝塔值为 1/4,即 0.25。我们可以发现不管是 RTTS 还是 RTTD 都是基于所测量到的 RTT 样本进行计算的。如果所测量到的 RTT 样本不正确,那么所计算出的 RTTS 和 RTTD 自然就要不正确,进而所计算出的超时重穿时间 RTO 也就不正确。
然而往返时间 RTT 的测量确实是比较复杂的。我们来举例说明,主机 A 给主机 B 发送 TCP 数据报文段,但该报文段在传输过程中丢失了,当超时重传计时器超时后,主机 A 就重传该报文段,主机 B 收到后给主机 A 发送确认报文段。现在问题来了,主机 A 收到该确认报文段后,无法判断该报文段是对原报文段的确认,还是对重传报文段的确认。
该报文段实际上是对重传报文段的确认,也就是说正确的 RTT 应该是这一段时间。但是如果主机 A 误将该确认当做是对原报文段的确认,也就是误认为这段时间是 RTT 则所计算出的 RTTS 和 RTO 就会偏大,降低了传输效率。
再来看另一种情况,主机 A 给主机 B 发送 TCP 数据报文段,主机 B 收到后给主机 A 发送确认报文段,由于某种原因,该确认报文段没有在正常时间内到达主机 A 这必然会导致主机 A 对之前所发送的数据报文段的超时重传。现在问题又来了,主机 A 收到迟到的确认报文段后,无法判断该报文段是对原报文段的确认,还是对重传报文段的确认。
该报文段实际上是对原报文段的确认,也就是说正确的 RTT 应该是这一段时间。但是如果主机 A 误将该确认当做是对重传报文段的确认,也就是误认为这段时间是 RTT,则所计算出的 RTTS 和 RTO 就会偏小,这会导致报文段没有必要的重传,增大网络负荷。
通过这两个例子可以看出,当发送方出现超时重传后,收到确认报文段时,是无法判断出该确认到底是对原报文段的确认,还是对重传报文段的确认,也就是无法准确测量出 RTT,进而无法正确计算超时重传时间 RTO。
因此针对出现超时重传时,无法测准往返时间 RTT 的问题,Karn 提出了一个算法,在计算加权平均往返时间 RTTS 时,只要报文段重传了,就要不采用其往返时间 RTT 样本,也就是出现重传时,不重新计算 RTTS,进而超时重传时间 RTO 也不会重新计算。然而这要引起了新的问题,设想出现这样的情况,报文段的时延突然增大了很多,并且之后很长一段时间内都会保持这种时延,因此在原来得出的重传时间内,不会收到确认报文段,于是就重传报文段。
根据 Karn 算法,不考虑重传的报文段的往返时间样本,这样超时重传时间就要无法更新,这会导致报文段反复被重传。因此要对 Karn 算法进行修正,方法是报文段每重传一次,就把超时重传时间 RTO 增大一些,典型的做法是将新 RTO 的值取为旧 RTO 值的两倍。
接下来我们举例说明,TCP 超时重传时间的计算,这是测量得到的第一个 RTT 样本 RTT1。根据 RTTS1 的计算公式可知 RTTS1 的值.根据 RTTDE 的计算公式,可知 RTTD1 的值在根据 IPO 的计算公式可计算出 RTO1 的值,这是测量得到的第二个 RTT2,根据 RTTS2 的计算公式和阿尔法的值和写出计算 RTTS2 的表达式,将之前计算出的 RTTS1 的值和本次测量得到的 RTT2 的值代入干涉,可计算出 RTTS2 的值。根据 RTTD 的计算公式和贝塔的值,可写出计算 RTTD2 的表达式,将之前计算出的 RTTD1,RTTS,1 以及本次测量得到的 RTT2 的值,代入该式,可计算出 RTTD2 的值。再根据 RTO 的计算公式,可计算出 RTO2 的值。
假设这是测量得到的第 3 个和第 4 个 RTT 样本。计算一下 RTO3 和 RTO4 的值分别是多少?答案如图所示,相信大家都能正确解答。假设这是测量得到的第 5 个 RTT 样本,但是根据 RTO4 的值可知,在收到确认之前就会产生超时重传。我们之前介绍过,若出现超时重传,则不采用上述公式计算 RTO,而是将新 RTO 的值取为旧 RTO 值的两倍。因此 RTO5 的值取为两倍的 RTO4 的值。
本节课的内容小结如下:
标签:重传,主机,报文,TCP,RTT,超时,RTO From: https://www.cnblogs.com/PeterJXL/p/18214985