什么是 RTO、RTT
底层的网络是不可靠的, 超时、丢包各种问题, 但 TCP 协议的设计初衷是作为一个可靠的数据传输协议, 超时重传机制是实现可靠性很重要的一个设计.
每次 TCP 握手过程都会启动一个定时器, 如果在定时器时间内没有收到, 则进行重传.
而重传的超时时间 则成为 RTO (Retransmission TimeOut)
我们知道网络是一直在波动的, 所以超时重传也是随着网络一直变化的, 那我们基于什么来计算 RTO 呢?
答案是 基于 TCP 单次握手的往返时间. 连接的往返时间成为 RTT (Round Trip Time)
正常网络情况示意
异常情况 RTT 值
通过上图我们发现其实还有几种特殊场景的计算, 但实际计算是以发送数据包时间算起, 基于协议实现里面的 timestamp 值计算差值就可以了.
简单概念理解:
- RTT(Round Trip Time):一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值;
- RTO(Retransmission Time Out):重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传, RTO协议实现值最小1s
RTT 和 RTO 的关系是:由于网络波动的不确定性,每个RTT都是动态变化的,所以 RTO 也应随着 RTT 动态变化。
当 RTO < RTT 时, 将会触发大量的重传, 当 RTO > RTT 时候, 如果频繁出现丢包, 重传不及时, 又会造成网络的反应慢, 最好的结果是 RTO 略大于 RTT.
上面说到了 网络是一直波动的, RTT 是一直变化的, RTO 的值基于上次 RTT 往返时间动态计算出来的.
这里基于一套公式(主要Jacobson / Karels 算法), 内容过于炸裂, 这里我要偷懒,
详情查看RFC6298 tools.ietf.org/html/rfc629…
原文: https://juejin.im/post/5dbd893ee51d452a07570339