首页 > 其他分享 >重传机制

重传机制

时间:2022-12-06 22:22:37浏览次数:45  
标签:重传 RTO TCP RTT 重发 机制 超时

TCP 实现可靠传输的方式之一,是通过序列号与确认应答。

在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息。

 

但在错综复杂的网络,并不一定能如上图那么顺利能正常的数据传输,万一数据在传输过程中丢失了呢?

所以 TCP 针对数据包丢失的情况,会用重传机制解决。

接下来说说常见的重传机制:

  • 超时重传
  • 快速重传
  • SACK
  • D-SACK

一、超时重传

重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就会重发该数据,也就是我们常说的超时重传

TCP 会在以下两种情况发生超时重传:

  • 数据包丢失
  • 确认应答丢失

 

 (一)超时时间应该设置为多少呢?

我们先来了解一下什么是 RTT(Round-Trip Time 往返时延),从下图我们就可以知道:

 

RTT 指的是数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间。

超时重传时间是以 RTO (Retransmission Timeout 超时重传时间)表示。

假设在重传的情况下,超时时间 RTO 「较长或较短」时,会发生什么事情呢?

 

上图中有两种超时时间不同的情况:

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

精确的测量超时时间 RTO 的值是非常重要的,这可让我们的重传机制更高效。

根据上述的两种情况,我们可以得知,超时重传时间 RTO 的值应该略大于报文往返 RTT 的值

 

至此,可能大家觉得超时重传时间 RTO 的值计算,也不是很复杂嘛。

好像就是在发送端发包时记下 t0 ,然后接收端再把这个 ack 回来时再记一个 t1,于是 RTT = t1 – t0。没那么简单,这只是一个采样,不能代表普遍情况

实际上「报文往返 RTT 的值」是经常变化的,因为我们的网络也是时常变化的。也就因为「报文往返 RTT 的值」 是经常波动变化的,所以「超时重传时间 RTO 的值」应该是一个动态变化的值

我们来看看 Linux 是如何计算 RTO 的呢?

估计往返时间,通常需要采样以下两个:

  • 需要 TCP 通过采样 RTT 的时间,然后进行加权平均,算出一个平滑 RTT 的值,而且这个值还是要不断变化的,因为网络状况不断地变化。
  • 除了采样 RTT,还要采样 RTT 的波动范围,这样就避免如果 RTT 有一个大的波动的话,很难被发现的情况。

RFC6289 建议使用以下的公式计算 RTO:

 

其中 SRTT 是计算平滑的RTT ,DevRTR 是计算平滑的RTT 与 最新 RTT 的差距。

在 Linux 下,α = 0.125,β = 0.25, μ = 1,∂ = 4。别问怎么来的,问就是大量实验中调出来的。

如果超时重发的数据,再次超时的时候,又需要重传的时候,TCP 的策略是超时间隔加倍

也就是每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送

超时触发重传存在的问题是,超时周期可能相对较长。那是不是可以有更快的方式呢?

于是就可以用「快速重传」机制来解决超时重发的时间等待。

二、快速重传

 

标签:重传,RTO,TCP,RTT,重发,机制,超时
From: https://www.cnblogs.com/imreW/p/16960944.html

相关文章

  • 流水线机制
    流水的思想在计算机的世界里多处可见: 计算机指令流水机制,提高CPU工作速度。计算机网络数据交换中的分组交换工作方式:也是有分成小份,流水的思想计算机网络传输层:滑动......
  • Java中的反射机制及反射的优缺点
    1.反射的概念反射机制指的是,程序在运行时能够获取自身的信息。在java中只要给定类的名字,就能够获取类的所有属性和方法。反射是Java中很多高级特性的基础,比如注......
  • Add-In运行机制解析(下)
    打开VS,开始第二回合的观察。由于选择了在VS启动时加载,所以此时触发了OnConnection,connectMode为ext_cm_Startup,也就是说是在VS启动时加载的;之后连续触发了OnAddinsUpdate和O......
  • python中五种异常机制的简介
    默认的异常处理器 代码如下:s='Hellogirl!'prints[100]print'continue' 如果我们没有对异常进行任何预防,那么在程序执行的过程中发生异常,就会中断程序,调用py......
  • SwiftUI 基础 —— 状态管理机制
    @State被@State包装的值发生改变时,UI将被同时改变structContentView:View{@Statevartitle="HelloWorld"varbody:someView{VStack{......
  • Binder 机制
    1、IPCinter-processcommunity  进程间通信2、主要机制是内核空间存在共享区域,基于内存映射mmap来实现ipc通信 3、wms、ams、pms系统主要服务都是通过binder机制......
  • linux信号机制(初识版)
    转载 https://www.zhihu.com/question/24913599/answer/2584544572  信号是操作系统内核为我们提供用于在进程间通信的机制,内核可以利用信号来通知进程,当前系统所发......
  • 包机制
    包机制为了更好的组织,Java提供了包机制,用于区别类名的命名空间。(如,一个文件夹中不能同时存在两个名字相同的文件,但两个名字相同的文件可以存在于两个不同的文件夹中)包......
  • 播放器重连机制
    在实际业务中,偶尔会碰到网络波动导致播放链接断开的情况,这时候播放器就需要加入一个重连机制,让播放器自动重连,在网络恢复之后,可以及时的重连回去。1.首先监听播放器播放停......
  • 两道面试题,带你解析Java类加载机制
    在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题:classGrandpa{static{System.out.println("爷爷在静态代码块");}}classFatherextendsGra......