rfc2988:Computing TCP's Retransmission Timer
作者:Changing Lin
- 2021 年 11 月 10 日
本文字数:2101 字
阅读完需:约 7 分钟
1.知识点
什么是 RTO?
The Transmission Control Protocol (TCP) uses a retransmission
timer to ensure data delivery in the absence of any feedback from the
remote data receiver. The duration of this timer is referred to as
RTO (retransmission timeout).
TCP依赖一个重传定时器来确保丢失的数据包能够被重发,这个定时时间就是 RTO。
复制代码
RTO 能解决什么问题?
自动根据当前包的 RTT 值、上一时刻的 RTO 值预测下一个时刻的 RTO 值,合理的 RTO 设置对重传性能、网络资源影响比较大。
RTO 是怎么实现的?
卡尔曼滤波
2.原理
要计算当前的RTO,TCP发送方需要维护两个状态变量,SRTT (平滑环回时间)和RTTVAR(环回时间变量)。
另外,我们假设一个时钟间隔G秒。
计算SRTT、RTTVAR和RTO的法则如下:
(1) 在对一个收发双方之间所发出的一个包完成回环时间(RTT)测量之前,发送方应该将RTO设置为3秒。
注意到有一些设施可能采用一种“心跳式”定时器,它能够产生一个介于2.5秒和3秒之间的值。因此,在该定时器绝不会在短于2.5秒的时间内超时的情况下,作为一个较低的2.5秒的步进也是可以接受的,使用间隔为G的心跳式定时器的设施,定时器的值不低于2.5 + G秒。
(2) 当完成第一个RTT测量R时,宿主机必须设置
SRTT = R
RTTVAR = R/2
RTO = SRTT + max (G, K*RTTVAR)
其中K = 4。
(3) 当完成一个并发的RTT测量R'时,宿主机必须设置
RTTVAR =(1 - beta) * RTTVAR + beta * |SRTT - R'|
SRTT = (1 - alpha) * SRTT + alpha * R'
用来更新RTTVAR的SRTT的值,就是那个使用第二次分配来更新SRTT之前的SRTT值本身。就是说,更新RTTVAR和SRTT必须按照上述的顺序进行计算。
上述计算应该使用alpha=1/8和beta=1/4进行计算。
在计算之后,宿主机必须更新RTO = SRTT + max (G, K*RTTVAR)。
(4) 一旦RTO计算好,如果它小于1秒钟,则RTO应该补充到1秒。
传统地,TCP设施使用粗间隔时钟来测量RTT并触发RTO,这使得应用于RTO上的最小值很大。研究表明,需要一个很大的最小RTO值来保持TCP的保守,以避免虚假重发。因此,RFC2988要求有一个很大的最小RTO值作为保守之需,而同时承认,在未来的某个时刻,研究可能表明一个小一些的最小RTO值是可接受的,或者,是优越的。
(5) 可以给RTO使用最大值,如果该值至少有60秒。
复制代码
3.DSS 中是如何实现 RTO 的计算
void RTPBandwidthTracker::AddToRTTEstimate( SInt32 rttSampleMSecs )
{
// qtss_printf("%d ", rttSampleMSecs);
// static int count = 0;
// if ((count++ % 10) == 0) qtss_printf("\n");
// this assert hits
Assert(fBytesInList < ((UInt32)fClientWindow + 2000)); //mainly just to catch fBytesInList wrapping below 0
if ( fRunningAverageMSecs == 0 )
fRunningAverageMSecs = rttSampleMSecs * 8; // init avg to cur sample, scaled by 2**3
SInt32 delta = rttSampleMSecs - fRunningAverageMSecs / 8; // scale average back to get cur delta from sample
// add 1/8 the delta back to the smooth running average
fRunningAverageMSecs = fRunningAverageMSecs + delta; // same as: rt avg = rt avg + delta / 8, but scaled
if ( delta < 0 )
delta = -1*delta; // absolute value
/*
fRunningMeanDevationMSecs is kept scaled by 4
so this is the same as
fRunningMeanDevationMSecs = fRunningMeanDevationMSecs + ( |delta| - fRunningMeanDevationMSecs ) /4;
*/
/*
rfc2988: The Basic Algorithm
SRTT = (1 - 1/8) * SRTT + 1/8 * R'
RTTVAR = (1 - 1/4) * RTTVAR + 1/4 * |SRTT - R'|
RTO = SRTT + 4 * RTTVAR
So,
SRTT = SRTT + 1/8 * (R' - SRTT)
RTTVAR = RTTVAR + 1/4 * (|SRTT - R'| - RTTVAR)
RTO = SRTT + 4 * RTTVAR
And,
SRTT8 = SRTT8 + (R' - SRTT8 / 8)
RTTVAR4 = RTTVAR4 + (|SRTT8 / 8 - R'| - RTTVAR4 / 4)
RTO = SRTT8 / 8 + RTTVAR4
(SRTT8: fRunningAverageMSecs, RTTVAR4: fRunningMeanDevationMSecs)
*/
fRunningMeanDevationMSecs += delta - fRunningMeanDevationMSecs / 4;
fUnadjustedRTO = fCurRetransmitTimeout = fRunningAverageMSecs / 8 + fRunningMeanDevationMSecs;
// rto should not be too low..
if ( fCurRetransmitTimeout < kMinRetransmitIntervalMSecs )
fCurRetransmitTimeout = kMinRetransmitIntervalMSecs;
// or too high...
if ( fCurRetransmitTimeout > kMaxRetransmitIntervalMSecs )
fCurRetransmitTimeout = kMaxRetransmitIntervalMSecs;
// qtss_printf("CurTimeout == %d\n", fCurRetransmitTimeout);
}
复制代码
参考链接:https://blog.csdn.net/weixin_33843947/article/details/92909219
划线
评论
复制
发布于: 1 小时前阅读数: 3
版权声明: 本文为 InfoQ 作者【Changing Lin】的原创文章。
原文链接:【http://xie.infoq.cn/article/2904c810b4c631effd01260e7】。文章转载请联系作者。
Changing Lin
关注
获得机遇的手段远超于固有常规之上~ 2020.04.29 加入
我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。
评论