速读原著-TCP/IP(往返时间测量)

2020-03-13 11:41:50 浏览数 (1)

第21章 TCP的超时与重传

21.3 往返时间测量

T C P超时与重传中最重要的部分就是对一个给定连接的往返时间( RT T)的测量。由于路由器和网络流量均会变化,因此我们认为这个时间可能经常会发生变化, T C P应该跟踪这些变化并相应地改变其超时时间。

首先T C P必须测量在发送一个带有特别序号的字节和接收到包含该字节的确认之间的RT T。在上一章中,我们曾提到在数据报文段和 A C K之间通常并没有一一对应的关系。在图2 0 . 1中,这意味着发送方可以测量到的一个 RT T,是在发送报文段4(第1 ~ 1 0 2 4字节)和接收报文段7(对1 ~ 1 0 2 4字节的A C K)之间的时间,用M表示所测量到的RT T。最初的T C P规范使T C P使用低通过滤器来更新一个被平滑的 RT T估计器(记为O)。 R← R ( 1- )M这里的是一个推荐值为 0 . 9的平滑因子。每次进行新测量的时候,这个被平滑的 RT T将得到更新。每个新估计的9 0%来自前一个估计,而1 0 %则取自新的测量。

该算法在给定这个随RT T的变化而变化的平滑因子的条件下, RFC 793推荐的重传超时时间RTO(Retransmission Ti m e O u t)的值应该设置为

代码语言:javascript复制
RTO = R

这里的 是一个推荐值为2的时延离散因子。[Jacobson 1988] 详细分析了在 RT T变化范围很大时,使用这个方法无法跟上这种变化,从而引起不必要的重传。正如 J a c o b s o n记述的那样,当网络已经处于饱和状态时,不必要的重传会增加网络的负载,对网络而言这就像在火上浇油一样。

除了被平滑的RT T估计器,所需要做的还有跟踪RT T的方差。在往返时间变化起伏很大时,基于均值和方差来计算 RTO,将比作为均值的常数倍数来计算 RTO能提供更好的响应。在[Jacobson 1988]中的图5和图6中显示了根据RFC 793计算的某些实际往返时间的 RTO和下面考虑了往返时间的方差所计算的 RTO的比较结果。

正如J a c o b s o n所描述的,均值偏差是对标准偏差的一种好的逼近,但却更容易进行计算(计算标准偏差需要一个平方根)。这就引出了下面用于每个 RT T测量M的公式。

代码语言:javascript复制
E rr = M-A A←A   g E rr D←D   h( | E rr |-D)
RTO = A   4D

这里的A是被平滑的RT T(均值的估计器)而D则是被平滑的均值偏差。 E rr是刚得到的测量结果与当前的RT T估计器之差。A和D均被用于计算下一个重传时间( RTO)。增量g起平均作用,取为1 / 8(0 . 1 2 5)。偏差的增益是h,取值为0 . 2 5。当RT T变化时,较大的偏差增益将使 RTO快速上升。

[Jacobson 1988]指明在计算 RTO时使用 2 D,但经过后来更深入的研究,[Jacobson1990c]将该值改为4D,也就是在BSD Net/1的实现中使用的那样。

J a c o b s o n指明了一种使用整数运算来计算这些公式的方法,并被许多实现所采用(这也就是g, h和倍数4均是2的乘方的一个原因,这样一来计算均可只通过移位操作而不需要乘、除运算来完成)。 将J a c o b s o n与最初的方法比较,我们发现被平滑的均值计算公式是类似的( 是1减去增益g),而增益可使用不同的值。而且 J a c o b s o n计算RTO的公式依赖于被平滑的 RT T和被平滑的均值偏差,而最初的方法则使用了被平滑的 RT T的一个倍数。在看完下一节中的例子时,我们将看到这些估计器是如何被初始化的。

Karn算法 在一个分组重传时会产生这样一个问题:假定一个分组被发送。当超时发生时, RTO正如2 1 . 2节中显示的那样进行退避,分组以更长的 RTO进行重传,然后收到一个确认。那么这个A C K是针对第一个分组的还是针对第二个分组呢?这就是所谓的重传多义性问题。

[Karn and Partridge 1987]规定,当一个超时和重传发生时,在重传数据的确认最后到达之前,不能更新 RT T估计器,因为我们并不知道 A C K对应哪次传输(也许第一次传输被延迟而并没有被丢弃,也有可能第一次传输的 A C K被延迟)。

并且,由于数据被重传, RTO已经得到了一个指数退避,我们在下一次传输时使用这个退避后的 RTO。对一个没有被重传的报文段而言,除非收到了一个确认,否则不要计算新的RTO。

ip

0 人点赞