TCP-IP详解: RTT和RTO的计算方法

℡╲_俬逩灬. 提交于 2020-01-10 10:01:28

基本概念
RTT: 发送一个数据包到收到对应的ACK,所花费的时间

RTO: 发送数据包,启动重传定时器,重传定时器到期所花费的时间,称为RTO

对于segment的重传,重传的时间RTO设定是非常重要的,如果设置太短,可能会导致并没有丢包而重传,如果设置太长了,可能因为等待ACK而浪费掉很多时间,牺牲传输的效率。从思想上来讲,其实我们还是希望重传的时间需要稍稍的大于RTT就可以了。但是这个RTT没有什么可以使用的定值,他是不断变化的。

我们只能动态的进行设置,所以RTO只能是更加RTT来进行动态的设置,看下前辈们研究的RTT的计算方法

经典的算法 RFC793

  1. 首先计算一个平滑的RTT称置为SRTT, alpha是一个平滑因子,取值为0.8或者0.9

SRTT = ( ALPHA * SRTT ) + ((1-ALPHA) * RTT)

  1. 基于SRTT,计算出对应的RTO

    RTO = min[UBOUND,max[LBOUND,(BETA*SRTT)]

其中UBOUND是最大值,一般情况下为120s,LBOUND是最小重传值,一般情况下为1s,Beta取值为1.3~2.0. [RFC793]

其实这个算法,在目前Linux系统协议栈的实现中并没有使用了,原因是存在着一些不足之处,具体弊端没有认真研究,有文章指出不明确是使用第一次发送ACK的时间,还是使用重传ACK的时间采样RTT, 也有文章指出在RTT变化比较大的网络,性能表现非常不好… 总之有缺点

Jacobaon/Karels 算法
1988年,Van Jacobson和Karels在Congestion Avoidance and Control这篇论文中提出一种新的算法[RFC6298],

第一次RTO计算方法, 假设RTT = R

  1. SRTT = R

  2. RTTVAR = R/2

  3. RTO = SRTT + max(G, K*RTTVAR) , K = 4

后续的RTO计算,假设当前的RTT为R’

     RTTVAR = (1 - beta)*RTTVAR + beta*|SRTT - R'|    *计算平滑RTT和真实RTT的差距,切记这个地方的SRTT是上一次的SRTT*

SRTT = (1 - alpha)SRTT + alphaR’ * 计算平滑RTT*

RTO = SRTT + max(G, K*RTTVAR)

alpha = 1/8 beta = 1/4, 值得指出的是这个算法在目前的Linux协议栈中应用,多么伟大的一件事情。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!