TCP中的RTT和RTO

马谦马谦马谦
马谦马谦马谦
马谦马谦马谦
606
文章
12
评论
2019年7月13日22:47:47 评论

一、RTT和RTO的概念

TCP作为一个面向连接的、可靠的传输协议,内部实现了一个重传计时器来保证数据能传输到对方。每发送一个数据包,就给这个数据设置一个重传计时器。如果在计时器超时之前收到了针对这个数据包的ack,就取消这个计时器。如果没有收到,则开始发起重传。计时器超时的时间被称为RTO,这个时间的确定取决于RTT。

关于两者详细的解释:

  • RTT(Round Trip Time):一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值;
  • RTO(Retransmission Time Out):重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传。

关于RTT和RTO值的确定一直以来都是值得讨论的地方,如何让RTO能适应网络变化。

二、RTT的测量

每发送一个分组,TCP都会进行RTT采样,这个采样并不会每一个数据包都采样,同一时刻发送的数据包中,只会针对一个数据包采样,这个采样数据被记为sampleRTT,用它来代表所有的RTT。

采样的方法一般有两种:

  1. TCP Timestamp选项:在TCP选项中添加时间戳选项,发送数据包的时候记录下时间,收到数据包的时候计算当前时间和时间戳的差值就能得到RTT。这个方法简单并且准确,但是需要发送段和接收端都支持这个选项。
  2. 重传队列中数据包的TCP控制块:每个数据包第一次发送出去后都会放到重传队列中,数据包中的TCP控制块包含着一个变量,tcp_skb_cb->when,记录了该数据包的第一次发送时间。如果没有时间戳选项,那么RTT就等于当前时间和when的差值。

linux内核中,更新rtt的函数为tcp_ack_update_rtt

TCP中的RTT和RTO

三、RTO的计算

3.1 经典方法

为了避免单次RTT波动,计算RTO时新引入了变量SRTT,表示更加平滑的RTT数值,它的计算方法:

x被称为平滑因子,一般建议设置在[0.8, 0.9],意思是SRTT值百分之八十来自于之前的值,百分之二十来自于当前值。然后计算RTO的方法为:

y是时延离散因子,推荐值为[1.3, 2.0],ubound是RTO的上边界,lbound是RTO的下边界。

算法的缺点

在RTT波动较大时,RTO不能明显适应网络变化。

3.2 标准方法

标准方法引入了平均偏差的概念,它类似于统计学里面的方差,但是因为方差的计算过程代价较大,对于快速TCP来说不太适合。假设rtt的值为M,RTO的计算方式为:

其中g设置为1/8,h设置为1/4,对srtt而言,它有1/8取决于当前值,7/8取决于现有值。当RTT变化时,偏差增量越大,RTO的增量也越大。

关于计算RTT和RTO的算法,还有很多种,历史上针对这个的探讨从未停止过。

比较出名的拥塞算法还有谷歌的bbr算法,高版本的linux内核已经合入了bbr算法作为拥塞控制算法。

四、其他

4.1 TCP Timestamps选项

时间戳选项的作用是为了方便计算RTT,每发出一个数据包,就记录下发送时间,收到数据包时就能准确的获知到数据包往返时间了。

通过TCPDUMP抓包很容易就能看到Timestamps选项:

TCP中的RTT和RTO

马谦马谦马谦
  • 本文由 发表于 2019年7月13日22:47:47
  • 转载请务必保留本文链接:https://www.dyxmq.cn/network/tcpip/rtt-and-rto.html
一次孤儿socket过多导致负载高的问题排查过程 TCP/IP

一次孤儿socket过多导致负载高的问题排查过程

一、问题现象 客户报障,说使用了我们的网关设备后网络经常中断。具体的情形是用我们设备做代理上网后,流量图显示流量每隔两分钟就会直线下跌一次,同时就伴随着内网用户断网。 经过排查后发现问题原因是设备负载...
TCP的滑动窗口协议 TCP/IP

TCP的滑动窗口协议

一、关于滑动窗口协议 在TCP协议中,所有的SEQ包发送出去都必须要受到对方的ACK才认为是发送成功,如果长时间没有收到ACK回复确认,发送方需要重新发送该包。而如果发送方每次都是发送一个包,然后等到...
ARQ自动重传协议 TCP/IP

ARQ自动重传协议

ARQ全称是Automatic repeat request,是TCP中实现可靠传输的重传协议,它的核心思想是停止等待协议。 一、停止等待协议 停止等待协议是数据链路层中最基础的协议,在数据发送出去后...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: