回顾
我们上部分讲了跟RTO相关的RFC,主要是一个RTO的计算公式(RFC2988引入)和握手阶段3秒到1秒的初始化RTO的改变(RFC6298引入)。现在可以接着看linux代码的相关实现了,本文尽量将内容收敛到RTO主题。至于重传和拥塞算法等话题,我们(计算机学习微信公众号:jsj_xx)以后再谈。
RTO计算的代码之实现公式
具体实现和我们之前描述的公式是一致的:均值权重是1/8,偏差权重是1/4。另外,为代码的方便需要做些调整。我们先看之前的公式:
err = m-A/8
A += err
if err<0 err=-err
err -= D/4
D += err
rto = A/8+D
实现中完全可以消除掉err这个变量,所以结果调整为:(记作实现公式)
m = m-A/8
A += m
if m<0 m =- m
m -= D/4
D += m
rto = A/8+D
这个公式就是代码中真正的实现,后文都是直接引用这个实现公式!再重复阐述一次:为了避免浮点运算做的两个调整,一是rttvar放大了4倍,即调整为实现公式中的D,二是srtt放大了8倍,即调整为实现公式中的A。
实现中的RTO_MIN设置为200毫秒,但是可以通过ip
route
change命令修改。很多人觉得这个值设置太大了,以为这条命令就是为了将这个