TCP/IP之RTO、RTT

9,632 阅读2分钟

什么是 RTO、RTT

底层的网络是不可靠的, 超时、丢包各种问题, 但 TCP 协议的设计初衷是作为一个可靠的数据传输协议, 超时重传机制是实现可靠性很重要的一个设计.

每次 TCP 握手过程都会启动一个定时器, 如果在定时器时间内没有收到, 则进行重传.

而重传的超时时间 则成为 RTO (Retransmission TimeOut)

我们知道网络是一直在波动的, 所以超时重传也是随着网络一直变化的, 那我们基于什么来计算 RTO 呢?

答案是 基于 TCP 单次握手的往返时间. 连接的往返时间成为 RTT (Round Trip Time)

正常网络情况示意

异常情况 RTT 值

通过上图我们发现其实还有几种特殊场景的计算, 但实际计算是以发送数据包时间算起, 基于协议实现里面的 timestamp 值计算差值就可以了.

简单概念理解:

  1. RTT(Round Trip Time):一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值;
  2. 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…

参考文档

sgros.blogspot.com/2012/02/cal…

更多精彩内容关注公众号 (呆呆熊的技术路):