TCP RTT与TCP RTO关系详解

article/2025/8/27 0:59:54

本文目录

  • 1,TCP的RTT和TCP的RTO的定义
    • 1.1,什么是TCP的RTT
    • 1.2,什么是TCP的RTO
  • 2,TCP的当前RTT和RTO的计算
    • 2.1,开始讲RTT计算算法前,我们先理解一下TCP里对RTT进行采样的流程
    • 2.2,最初始的TCP RTT和RTO计算方法及存在的问题
    • 2.3,TCP RTT和RTO的计算方法的改进
    • 2.4,TCP RTT和RTO的计算方法的进一步改进(Linux的当前实现)

1,TCP的RTT和TCP的RTO的定义

1.1,什么是TCP的RTT

RTT是Round Trip Time的缩写,TCP的RTT意思是指TCP报文发送完成的时刻到接收到该报文对应的ACK报文的时刻的差值。我们知道二个主机之间的路由路径是可以动态变化的,所以二个主机之间的网络延时不仅会因为网络状态的不一样而动态变化经,还会随着路由路径的变化而变化。所以二个主机之间的RTT也不是一成不变的,是一个动态变化的值。
TCP为每一条TCP连接保持一个独立的当前RTT的值。

BTW:往返时延RTT只对传输层的TCP协议才重要,因为TCP要根据平均往返时延RTT的值来设置超时计时器的超时时间以及合适的接收窗口rwnd。UDP没有确认和重传机制,RTT对于UDP来说没有什么意义。

1.2,什么是TCP的RTO

我们都知道TCP使用超时重传的机制来保证网络丢包发生,导致没能收到确认ACK时,能重传报文,来提供端到端的可靠传输的机制。那么多长时间后执行重传呢?这就引入了RTO。RTO是Retransmission Time Out的缩写,定义了TCP重传超时时间,即定义了TCP超时重传定时器的超时时长,指从数据发送时刻算起,超过这个时间便对本报文执行重传。

  • RTO太大了
    重发就慢,丢了还要过很久才重发,导致TCP连接没有充分利用网络,网络的利用率低,进而导致TCP端到端传输的延时长,性能差。
  • RTO太小了
    重发得太快,会导致没有丢的包就重发。于是网络上存在大量的无意义的重发报文,一来占用大量带宽会,二来会增加网络拥塞,会导致更多的超时,然后更多的超时双导致更多的重发。

所以定义一个合适的RTO非常重要,在理想网络中,RTO略微大于RTT是一个能充分利用网络能力的最理想的定义,但实际网络中,就比这个复杂得多了。

2,TCP的当前RTT和RTO的计算

在稳定的网络中,RTT几乎保持不变,那么很简单,只要测定一次RTT后面就一直用这个值就好了。但在实际的网络中,RTT通常是动态变化的,一会大一会小,所以如何计算出一个合适的最能反应当前网络的RTT就成了RTT计算的关键。

2.1,开始讲RTT计算算法前,我们先理解一下TCP里对RTT进行采样的流程

在TCP网络中,并不是对每一个TCP报文都进行RTT计算采样的。只对部分TCP报文进行RTT计算采样。这个采样方法的定义稍微有点抽象:在任何时候,对每一个TCP连接测量且仅测量一次RTT值,则在发送一个报文时,如果给定连接正在测量RTT值(测量RTT的定时器已经被使用),则不对该报文测量RTT
如下图:

  • RTT #1:
    发送报文1到收到对应的ACK(报文2)的时间差,这个很好理解。
  • RTT #2:
    发送报文3到收到对应的ACK(报文5)的时间差,这个很好理解。但这里我们可以注意到报文4并没有被用于计算RTT,对应为:在报文3发送出去之后收到对应的ACK(报文5)之间由左侧主机发起的所有TCP报文(报文4)都不会做RTT采样计算
  • RTT #3:
    送报文6到收到对应的ACK(报文10)的时间差,这个很好理解。但这里我们可以注意到报文4并没有被用于计算RTT,对应为:在报文6发送出去之后收到对应的ACK(报文10)之间由左侧主机发起的所有TCP报文(报文7和报文9)都不会做RTT采样计算

在这里插入图片描述

2.2,最初始的TCP RTT和RTO计算方法及存在的问题

  • 计算方法
    RTT = 收到ACK的时间 - 发送报文的时间
    然后我们会在得到每次RTT采样结果时以用以公式计算出当前RTT,称为SRTT( Smoothed RTT),按网络RTT变化的快慢不同,其中 alpha 可以取不同的值,以适应不同的网络。alpha值取得小,则当前RTT的权重大,可以快速适应 RTT 的微小变化,但受到RTT的暂时波动的影响比较大,alpha值取得小,则历史的SRTT的权重大,当前RTT的权重小,SRTT的变化曲线更稳定,比较平滑,不易受RTT的暂时波动的影响,但响应不够快,在RTT变化比较快的网络中无法快速适应RTT的真正的变化。所以alpha的取值是一个经验值,在不同的网络中最好可以使用不同的值。通常alpha可以取0.8到0.9之间的一个数字。
  SRTT = ( alpha * SRTT ) + ((1 - alpha) * RTT)

(第一次迭代的时候SRTT的初始值为最近的一次RTT)
这样用SRTT和RTT做加权运算,就可以平滑的处理这个SRTT,不会让当前RTT(即SRTT)总是在跳变,但又可以根据当前的RTT做适时的调整。

根据Linux的实现, TCP_RTO_MAX为120秒,TCP_RTO_MIN为200毫秒,RTO的初始值为1秒, beta一般取值为1.3到2.0之间

 RTO = min [ TCP_RTO_MAX,  max [ TCP_RTO_MIN,   (beta * SRTT) ]  ]

在SRTT开始计算后,可以用以上公式算出RTO。

  • 存在的问题
    在重传发生时,会发生如下图的问题,
    如果你用新传的包做为起点,则可能会导致采样出来的RTT会远大于实际RTT; 如果你用重传的包做为起点,则可能会导致采样出来的RTT会或者远小于实际RTT。
    在这里插入图片描述

2.3,TCP RTT和RTO的计算方法的改进

因为初始算法存在的种种问题,提出了以下改进:

  • 改进一:不对重传报文做RTT采样
    不对重传报文做RTT采样,只对新传的报文做RTT采样。这样就规避了上面说到的重传发生时,到底是使用重传那个报文还是使用新传的报文做为RTT地采样开始点的问题。但这样子做引入一个问题,就是当RTT在某一时刻突然变大时,即网络产生了一个比较大的延时,这个延时会导致所有的包(因为之前的RTO很小,所以在TCP重传定时器超时时,所有的报文都没有收到对应的ACK)都发生超时重传,但是因为重转的包不算RTT,所以,RTO就不会被更新,进而引发TCP重传定时器还是一个很上的值,那么会进一步发生重传,网络就会一下子进入拥塞状态,导致网络的吞吐量性能急剧下降。所以引入了以下的改进二。
  • 改进二:一旦发生重传,就对现有的RTO值翻倍
    一旦发生重传,就对现有的RTO值翻倍,以避免大量的重传引发的网络拥塞。

这种算法存在的问题:
1) 参数alpha值不好取舍,如上面所述:alpha值取得小,则当前RTT的权重大,可以快速适应 RTT 的微小变化,但受到RTT的暂时波动的影响比较大,alpha值取得小,则历史的SRTT的权重大,当前RTT的权重小,SRTT的变化曲线更稳定,比较平滑,不易受RTT的暂时波动的影响,但响应不够快,在RTT变化比较快的网络中无法快速适应RTT的真正的变化。
2)网络较差情况,RTO持续翻倍,重发的速率急剧减缓,导致TCP传输的效率和性能劣化得非常快,网络利用率非常低下。

2.4,TCP RTT和RTO的计算方法的进一步改进(Linux的当前实现)

为了解决上述的问题,又引入了deviation RTT的概念(RFC6289),则这个算法引入了最新的RTT的采样值和平滑过的SRTT的值之间的差距做因子来计算,如果差距大,则DevRTT主导了计算结果,如果差距小,则SRTT主导了计算结果。

SRTT = SRTT + alpha*(RTT – SRTT)DevRTT = (1-beta)*DevRTT + beta*(|RTT-SRTT|)RTO= micro * SRTT + delta *DevRTT

在Linux实现里,alpha = 0.125,beta = 0.25, micro = 1,delta = 4

这样就解决了alpha不好取值的问题,达到了既平滑又能快速感知RTT变化的目标。


http://chatgpt.dhexx.cn/article/sa1ivkF7.shtml

相关文章

通过pylink给jlink-RTT添加时间戳

参考链接 目前还有一些bug,比如时间戳有时候会加在一行log的中间,有时候又会少一些时间戳,但是log目前没发现出现问题 在使用pylink时,需要用到Jlink的dll库,需要将D:\SEGGER\JLink_V766d文件夹下的JLink_x64.dll和JLi…

J-Link RTT 支持浮点数

RTT的使用 略 添加浮点数功能 注: 如下代码暂时不支持数据左补零,正浮点数前面显示等功能;不指定位宽时按实际位宽显示,不指定小数位数时按2位小数显示。 在SEGGER_RTT_printf.c文件的SEGGER_RTT_vprintf()函数中,添…

RTT Studio和Cubemx联合开发

1. RTT studio创建工程 创建工程 ## 创建完成以后的目录结构 2. 配置CubuMx 双击cubumx的图标打开CubeMx 配置时钟 生成代码 构建后的代码结构 编译代码满屏错误:不要慌 3. 新增脚本 新建scons脚本文件 SConscript 脚本内容如下,每次修改外…

STM32 RTT

1、安装包 如果安装过jlink,可以用evething来搜索“SEGGER_RTT”,选择“压缩文件”。 压缩文件中的RTT文件夹加入到项目当中 2、项目修改 3、使用 3.1 普通使用 SEGGER_RTT_printf(0, "Terminal 0 print:%d\r\n", i); 3.2 多端口…

[STM32]jlink RTT使用详解

1.什么是Jlink RTT。 全称为SEGGER’s Real Time Transfer(RTT),一种基于SEGGER公司的基于JLink调试器的交互式用户I/O的技术。故名思义,就是一种基于jlink的和用户进行交互的技术,可以直观的显示调试芯片的信息&#…

Redis-RTT

1. 什么是redis的RTT RTT是网络往返时间的简称 每一次执行redis都会向redis-server发送执行的命令(send),比如set a 1, redis-server接收到请求并执行后,会返回一个数据或结果(recv) , send时间和recv中间的时间就是RTT, 也就是说假如发送了三次redis命令,就会产生三个RTT redi…

TCP RTT 采集方法

TCP RTT 采集方法值得一提: 正常状态采集的 RTT 因加入了接收端 Delayed ACK,积累 ACK 等原因而偏大。Disorder,Recovery 状态采集的 RTT 相对准确,通过 Timestamps,SACK 采集。 平时抓包,Wireshark 如何…

keil工程,程序写多后,RTT不能打印

一、Options for Target,Code Generation 一般默认是Use default compiler version 5 ,选择V6.14,重新编译烧录程序,可以继续RTT打印。 修改为: 二、这样编译后,编译速度快很多,但是&#xff…

RTT 内核启动流程

1.启动流程: RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一启动入口。一般执行顺序是:系统先从启动文件开始运行,然后进入 RT-Thread 的启动 rtthread_startup() ,最后进入…

segger_rtt使用帮助

一、KEIL中添加[RTT_Syscalls_KEIL.c][SEGGER_RTT.c][SEGGER_RTT_printf.c], 并将文件夹[segger_rtt]添加到引用目录中。 二、在[SEGGER_RTT_printf.c]中顶部添加 #define NRF_LOG_USES_RTT 1 三、main()中初始化如下: SEGGER_RTT_Init(); //初始化 SEGGER_RTT_pr…

H7-TooL高速 DAPLINK仿真器,含全功能版 RTT Viewer

摘要:前几天分享了一篇使用JLink的RTT代替串口文章,没想到这两天安富莱家更新了H7-TOOL,并且包含了全功能版 RTT Viewer功能,试了一下感觉很不错。 有关于安富莱家的H7-TooL工具在前面我已经介绍过了,电子工程师必备的…

使用Jlink RTT工具打印日志

使用Jlink RTT工具打印日志 背景 平常调试代码中使用串口打印log,往往需要接出串口引脚,比较麻烦,并且串口打印速度较慢,串口的中断可能会影响代码的执行效率。 SEGGER RTT支持使用J-link调试器输出来自目标微控制器的信息&…

RTT打印log

目录 一、移植 RTT驱动 二、环境搭建 一、移植 RTT驱动 1、找到RTT驱动文件 (1) 在 J-Flash安装目录找到 RTT驱动文件并解压得到如下文件: (2) 找到 RTT配置文件: 2、在工程中添加 RTT 驱动: (1) 将以上文件复制到工程目录 (2) 将对应的头…

webrtc rtt 计算

Definitions RTT(Round-Trip Time): 往返时延。在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。 一般认为单向时延…

《嵌入式 - 嵌入式大杂烩》详解J-Link RTT打印

开发环境: J-Link版本:V9.4 J-Link驱动版本:V760h_x86_64 Keil:V5.30 在嵌入式开发过程中,经常需要进行打印调试,通常使用串口进行打印输出,但通常串口资源有限,这时就可以通过J-Link工具里面自带的RTT实现打印,从而节约一个串口资源。 1 RTT简介 RTT全称是Real Ti…

RTT学习笔记8-RTT内核移植

RTT 内核移植接口 CortexM系列的内核移植 1.关闭中断 ;/* ; * rt_base_t rt_hw_interrupt_disable(void); ; */ rt_hw_interrupt_disable PROC ;PROC 伪指令定义函数EXPORT rt_hw_interrupt_disable ;EXPORT 输出定义的函数,类似于 C 语言 externMRS …

nordic 52832中添加RTT打印

JlinkRTT RTT是基于Jlink调试器的实时传输技术,可以代替串口打印一些调试信息,不需要额外接线。 nordic 52832官方例程中,会将RTT打印函数做进一步封装,下面就讲一下怎么开启52832中的RTT打印。 第一步 增加RTT代码 RTT源代码可以在segger官方网站下载,也可以在nordic 5…

计算机网络传输层——学习笔记

目录 传输层概述 多路复用和多路分解 协议 UDP协议 可靠数据传输协议(reliable data transfer protocol RDT) 经完全可靠信道的可靠数据传输:rdt 1.0 经具有比特差错信道的可靠数据传输:rdt 2.0 经具有比特差错的丢包信道的…

RTT简介及其简单应用

一、 裸机系统和多任务系统 裸机系统通常分为轮询系统和前后台系统。 轮询系统不难理解就是按照顺序从上往下反复来执行,伪代码如下: int main() {Init();while(1){/*事件1*/event1();/*事件2*/event2();/*事件3*/event3();} }前后台系统就是在轮询系统…

TCP中RTT时延的理解

最近服务器环境部署了tcprtt网络时延监控,发现不同服务器不同节点之间的RTT时延表象非常奇怪,无法准确的判断服务器的网络情况。因此需要弄清楚什么是RTT,以及能否作为服务器网络性能的检测指标。 1、RTT是什么? TCP中的RTT指的是…