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

基本概念
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协议栈中应用,多么伟大的一件事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值