首页 > 其他分享 >TCP灌包中RTT时延与RTO超时关系

TCP灌包中RTT时延与RTO超时关系

时间:2023-07-21 11:45:48浏览次数:54  
标签:灌包 重传 RTO TCP SRTT RTT 算法

TCP的RTT算法

从前面的TCP重传机制我们知道Timeout的设置对于重传非常重要。

  • 设长了,重发就慢,丢了老半天才重发,没有效率,性能差;
  • 设短了,会导致可能并没有丢就重发。于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。

而且,这个超时时间在不同的网络的情况下,根本没有办法设置一个死的值。只能动态地设置。 为了动态地设置,TCP引入了RTT——Round Trip Time(往返时延),也就是一个数据包从发出去到回来的时间。这样发送端就大约知道需要多少的时间,

从而可以方便地设置Timeout——RTO(Retransmission TimeOut)(超时重传(时长)),以让我们的重传机制更高效。 听起来似乎很简单,好像就是在发送端发包时记下t0,然后接收端再把这个ack回来时再记一个t1,于是RTT = t1 – t0。没那么简单,这只是一个采样,不能代表普遍情况。

经典算法

 

TCP中的四个定时器:2MSL定时器;重传定时器;坚持定时器;保活定时器;

首先是如何得到RTO值;(假设已经能测量到RTT值情况下)

  RTO值是依赖RTT值来确定的;而鉴于网络环境的不稳定性,RTT总是变化的,

  RTT = 0.1*M  + 0.9*R;  M:当前测试的RTT值,R:历史RTT的值;

  RTO=@RTT;        @:一般取2;

详解过程参见RFC793,但是该方法是有缺陷的;

新的方法:

  Err = M - A;  M:当前RTT值, A:历史RTT值;

  平均值:A = A+gErr;  A:历史RTT值, g:常量, 

  方差:D = D + h(|Err| - D); D:历史D的值,h:常量

 (重点):RTO = A + 4D;

RTO的初始化: A=0; D=3;(即没有测的RTT情况下)

RFC793 中定义的经典算法是这样的:

1)首先,先采样RTT,记下最近好几次的RTT值。

2)然后做平滑计算SRTT( Smoothed RTT)。公式为:(其中的 α 取值在0.8 到 0.9之间,这个算法英文叫Exponential weighted moving average,中文叫:加权移动平均)

SRTT = ( α * SRTT ) + ((1- α) * RTT)

3)开始计算RTO。公式如下:

RTO = min [ UBOUND,  max [ LBOUND,   (β * SRTT) ]  ]

其中:

  • UBOUND是最大的timeout时间,上限值
  • LBOUND是最小的timeout时间,下限值
  • β 值一般在1.3到2.0之间。
Karn / Partridge 算法

但是上面的这个算法在重传的时候会出有一个终极问题——你是用第一次发数据的时间和ack回来的时间做RTT样本值,还是用重传的时间和ACK回来的时间做RTT样本值?

这个问题无论你选那头都是按下葫芦起了瓢。 如下图所示:

  • 情况(a)是ack没回来,所以重传。如果你计算第一次发送和ACK的时间,那么,明显算大了。
  • 情况(b)是ack回来慢了,但是导致了重传,但刚重传不一会儿,之前ACK就回来了。如果你是算重传的时间和ACK回来的时间的差,就会算短了。

所以1987年的时候,搞了一个叫Karn / Partridge Algorithm,这个算法的最大特点是——忽略重传,不把重传的RTT做采样(你看,你不需要去解决不存在的问题)。

但是,这样一来,又会引发一个大BUG——如果在某一时间,网络闪动,突然变慢了,产生了比较大的延时,这个延时导致要重转所有的包(因为之前的RTO很小),于是,因为重转的不算,所以,RTO就不会被更新,这是一个灾难。 于是Karn算法用了一个取巧的方式——只要一发生重传,就对现有的RTO值翻倍(这就是所谓的 Exponential backoff),很明显,这种死规矩对于一个需要估计比较准确的RTT也不靠谱。

Jacobson / Karels 算法

前面两种算法用的都是“加权移动平均”,这种方法最大的毛病就是如果RTT有一个大的波动的话,很难被发现,因为被平滑掉了。所以,1988年,又有人推出来了一个新的算法,这个算法叫Jacobson / Karels Algorithm(参看RFC6289)。这个算法引入了最新的RTT的采样和平滑过的SRTT的差距做因子来计算。 公式如下:(其中的DevRTT是Deviation RTT的意思)

SRTT = SRTT + α (RTT – SRTT)  —— 计算平滑RTT

DevRTT = (1-β)*DevRTT + β*(|RTT-SRTT|) ——计算平滑RTT和真实的差距(加权移动平均)

RTO= µ * SRTT + ∂ *DevRTT —— 神一样的公式

(其中:在Linux下,α = 0.125,β = 0.25, μ = 1,∂ = 4 ——这就是算法中的“调得一手好参数”,nobody knows why, it just works…) 最后的这个算法在被用在今天的TCP协议中(Linux的源代码在:tcp_rtt_estimator)。

 

 

 

参考:https://blog.csdn.net/nb_zsy/article/details/127692944

http://runxinzhi.com/chris-cp-p-3893103.html

${EStime}

标签:灌包,重传,RTO,TCP,SRTT,RTT,算法
From: https://www.cnblogs.com/klb561/p/17570878.html

相关文章

  • Untiy 网络编程-深入了解TCP
    1.从TCP到物理层应用层:应用层是给应用程序提供功能的。在发送{hello}的例子里面,计算机会把hello转化为二进制然后发送到传输层。传输层:在收到二进制数据后,传输层协议会对它进行一系列的加工,并提供数据流传送、可靠性校验,流量控制。又由于网络层的IP包......
  • TCP就拆不动粘包/拆包问题
    粘包/拆包问题一直都存在,只是到TCP就拆不动了。OSIopen-system-InterconnectionTCP/IP5层协议栈应用层和操作系统的边界是系统调用,对应到网络编程是socketapiTCP/UDP概况TCP粘包问题TCP/IP报头深思 OSI开放系统互联 定义了网络框架,以层为单位实现协议,同时......
  • TCP和UDP协议的区别
    1、TCP是面向连接的,而UDP是无连接的协议。2、TCP对于传输有用的数据非常可靠,因为它需要确认发送的信息,并且能重新发送丢失的数据包;UDP是一种不可靠的协议,数据包丢失,它不会请求重新传输,目标计算机会收到损坏的数据3、TCP速度较慢,但更健壮,因为TCP在传输数据之前建立连接,并确保数据......
  • 使用图形化工具tortoiseGit上传代码至gitte仓库
    以前对gitte的操作也就是向上面的OpenHarmony仓库提一些轻量级pr。现在要经常向自己的gitte仓库上传代码,但是笔者不想记那些git命令。于是网上冲浪,找了一个windows平台tortoiseGit图形化工具管理gitte仓库的代码。(目录)1.使用环境搭建1.1安装TortoiseGit首先先在window......
  • Freertos学习09-软件定时器
    一、概述软件定时器是一种在单片机上实现定时功能的方法,可以用于周期性地执行任务或者延时执行任务。软件定时器由FreeRTOS内核实现,不需要硬件支持。软件定时器只有在软件定时器回调函数被调用时才需要占用CPU时间。本节主要设计以下内容:软件定时器的API介绍实例测试......
  • tcp/ip 面试问题总结
    tcp三次握手为什么三次典型场景:1客户端对服务器说:大哥你好这是我的窗口大小,以及初始序号2服务器对客户端说:好的老弟,这是我的窗口大小和初始序号3客户端对服务器说:好的大哥......
  • N58(4G模块)通过AT指令连接TCP数据传输调试记录(1)
    背景有方科技的N58-CA4G模块+以太网+TCP客户端+SSCOM串口助手+AT指令的方式调通TCP通信开发流程1.模块初始化2.非透传TCP客户端通信流程一.模块初始化1.模块初始化2.非透传TCP客户端通信流程小tips:代码主要是按照流程复现,初始化代码可以使用例程通用代码其中会用到一些调用函数,包......
  • 网络编程 p4 TCP编程
    TCP编程基本介绍基于客户端——服务端的网络通信;底层使用的是TCP/IP协议;应用场景举例:客户端发送数据,服务端接收并显示在控制台;基于Socket的TCP编程;示意图netstat指令netstat-an可以查看当前主机网络情况,包括端口监听情况和网络连接情况;netstat-an|more......
  • TCP三次握手及四次挥手
    TCP是一个面向连接的服务,面向连接的服务是电话系统服务模式的抽象,每一次完整的数据传输都必须经过建立连接,数据传输和终止连接三个过程,TCP建立连接的过程称为三次握手。TCP三次握手过程主机A通过向主机B发送一个含有同步序列号的标志位的数据段给主机B,向主机B请求建立连接,......
  • Nginx 代理 WebSocket 、TCP协议
    Nginx代理WebSocket什么是WebSocketWebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket中的握手和HTTP中的握手过程兼容,且可以使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。代理结构WebSocket可以工作在......