TCP中的RTT和RTO
一、RTT和RTO的概念
TCP作为一个面向连接的、可靠的传输协议,内部实现了一个重传计时器来保证数据能传输到对方。每发送一个数据包,就给这个数据设置一个重传计时器。如果在计时器超时之前收到了针对这个数据包的ack,就取消这个计时器。如果没有收到,则开始发起重传。计时器超时的时间被称为RTO,这个时间的确定取决于RTT。
关于两者详细的解释:
RTT(Round Trip Time)
:一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值;RTO(Retransmission Time Out)
:重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传。
关于RTT和RTO值的确定一直以来都是值得讨论的地方,如何让RTO能适应网络变化。
二、RTT的测量
每发送一个分组,TCP都会进行RTT采样,这个采样并不会每一个数据包都采样,同一时刻发送的数据包中,只会针对一个数据包采样,这个采样数据被记为sampleRTT,用它来代表所有的RTT。
采样的方法一般有两种:
- TCP Timestamp选项:在TCP选项中添加时间戳选项,发送数据包的时候记录下时间,收到数据包的时候计算当前时间和时间戳的差值就能得到RTT。这个方法简单并且准确,但是需要发送段和接收端都支持这个选项。
- 重传队列中数据包的TCP控制块:每个数据包第一次发送出去后都会放到重传队列中,数据包中的TCP控制块包含着一个变量,tcp_skb_cb->when,记录了该数据包的第一次发送时间。如果没有时间戳选项,那么RTT就等于当前时间和when的差值。
linux内核中,更新rtt的函数为tcp_ack_update_rtt
:
三、RTO的计算
3.1 经典方法
为了避免单次RTT波动,计算RTO时新引入了变量SRTT,表示更加平滑的RTT数值,它的计算方法:
1 |
SRTT = x(SRTT) + (1 - x)RTT; |
x
被称为平滑因子,一般建议设置在[0.8, 0.9],意思是SRTT值百分之八十来自于之前的值,百分之二十来自于当前值。然后计算RTO的方法为:
1 |
RTO = min(ubound, max(lbound, y(SRTT))); |
y
是时延离散因子,推荐值为[1.3, 2.0],ubound是RTO的上边界,lbound是RTO的下边界。
算法的缺点
在RTT波动较大时,RTO不能明显适应网络变化。
3.2 标准方法
标准方法引入了平均偏差的概念,它类似于统计学里面的方差,但是因为方差的计算过程代价较大,对于快速TCP来说不太适合。假设rtt的值为M,RTO的计算方式为:
1 2 3 |
srtt = (1 - g)srtt + g(M); rttval = (1 - h)rttval + h(|M - rttval|); RTO = srtt + 4(rttval); |
其中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相关推荐
- TCP中RTT时延的理解
最近服务器环境部署了tcprtt网络时延监控,发现不同服务器不同节点之间的RTT时延表象非常奇怪,无法准确的判断服务器的网络情况.因此需要弄清楚什么是RTT,以及能否作为服务器网络性能的检测指标. 1 ...
- RTT and RTO
RTT and RTO RTT RTT(Round-Trip Time)往返时延,往返时延由三个部分决定:链路的传播时间,末端系统的处理时间,路由器的缓存中排队和处理时间,前面两个值相对不变,路由器的 ...
- TCP拥塞控制图解(不包括RTO,因为它太简单了)
最新的勘误已经发表,请先对照最新的勘误,如有疑问,随时联络,谢谢. 勘误链接: < TCP拥塞控制图解(不包括RTO,因为它太简单了) [勘误1]> 五一假期放假,我感到莫名地轻松,因为这 ...
- /proc/net/tcp中各项参数说明
/proc/net/tcp中的内容由tcp4_seq_show()函数打印,该函数中有三种打印形式,我们这里这只列出状态是TCP_SEQ_STATE_LISTENING或TCP_SEQ_STATE_E ...
- TCP中recv解阻塞的两种方式
TCP中recv解阻塞的两种方式 1.收到客户端发送的数据 2.客户端关闭了套接字,可以通过判断收到数据的长度来判断客户端是否下线,长度为0代表已下线. send操作 1.在阻塞模式下send操作将会 ...
- nordic 52832中添加RTT打印
JlinkRTT RTT是基于Jlink调试器的实时传输技术,可以代替串口打印一些调试信息,不需要额外接线. nordic 52832官方例程中,会将RTT打印函数做进一步封装,下面就讲一下怎么开启5 ...
- 灾备中经常提到的RTO和RPO是什么意思
灾备中经常提到的RTO和RPO是什么意思 https://zhidao.baidu.com/question/1706463534212352700.html RTO(Recovery Time Ob ...
- 如何解决TCP BBR的RTT不公平性问题
首先看下BBR的RTT不公平是什么. 设λ(t)\lambda(t)λ(t)为时间ttt时刻一条BBR流的测量速率,根据范雅各布森管道Bottleneck通量原理,它的值等于BDPRTT\dfrac{ ...
- wireshark提取RTSP over TCP中的视频流
wireshark提取RTSP over TCP中的视频流 文章目录 wireshark提取RTSP over TCP中的视频流 1 背景 2 提取前准备 3 H264提取步骤 4 后记 1 背景 前 ...
最新文章
- 2017年2月18日 K-means
- Java程序猿笔记——基于redis分布式锁实现“秒杀”
- sudo 密码超时时间
- [编程题] 迷路的牛牛
- android sdl,Android下SDL2实现五子棋游戏
- java 二维数组作为参数传递_java JNI 二维数组作为方法参数传递给本地
- springBoot中自定义的yml文件引用的方式
- CDH 6 安装服务哈希验证失败 解决方法
- (筆記) 如何使用ModelSim作前仿真與後仿真? (SOC) (Quartus II) (ModelSim)
- 光伏组件市场价格战下谁获益?
- 逻辑斯谛(Logistic)回归、参数估计教程
- java毕业设计明德学院网站源码+lw文档+mybatis+系统+mysql数据库+调试
- cad转pdf格式简易步骤
- 17-什么是资源服务器
- php的入门是html5,h5自学教程:6个适合初学者的零基础html5入门自学教程推荐
- 计算机基础及photoshop的应用,计算机基础及Photoshop应用
- PHP绘制正方形印章,ps绘制一款正方形的个人印章的方法
- mt6577驱动开发 笔记版
- linux拷贝文件前几行,Linux显示文件前几行、拷贝文件前几行、删除文件前几列...
- 遇到了一个date控件显示的问题
热门文章
- WampServer的研究日记二
- TOJ 2815 Connect them (kruskal+并查集)
- strcat strcpy 源代码,用指针去实现
- UESTC 1851 Kings on a Chessboard
- HDU 2512 一卡通大冒险
- WebKit 与 V8 的关系
- 《DB 查询分析器》中断SQL语句的执行
- iOS逆向之深入解析如何Hook所有+load方法及Category的处理
- Git之常用的高效处理技巧
- 2018年第九届蓝桥杯 - 国赛 - C/C++大学B组 - B. 激光样式