5.6、TCP超时重传时间的选择

news2024/10/7 10:24:02

超时重传时间的选择是 TCP 最复杂的问题之一


1、超时重传时间RTO的选取

假设主机 A 给主机 B 发送 TCP 数据报文段 0 0 0,并记录下当前的时间

主机 B 收到后,给主机 A 发送相应的确认报文段

主机 A 收到确认报文段后,记录下当前的时间

那么主机 A 记录的这两个时间,它们的差值就是报文段的往返时间 RTT

image-20230106002443175


若把超时重传时间 RTO 的时间设置为比 RTT0 的时间小会怎样呢

很显然,这会引起报文段比必要的重传,是网络负荷增大

image-20230106002644792


若把超时重传时间 RTO 的时间设置远大于i RTT0 的值呢?

很显然,这会使重传推迟的时间增长,使网络的空闲的时间增大,降低了传输效率

image-20230106002822632


综上以上两种情况,超时重传时间 RTO 的值应略大于往返时间 RTT


然而,TCP 下层是复杂的互联网环境

主机 A 所发送的报文段可能只经过一个高速率的局域网,也有可能经过多个低速率的网络

  • 并且,每个 IP 数据报的转发路由还可能不同

如下所示,

image-20230106003412910

显然,RTT1 远大于 RTT0,若超时重传时间 RTO 还是之前所确定的略大于 RTT0 的话

  • 这对数据报文段 1 1 1 是不合适的,会造成该报文段不必要的重传

image-20230106003543796


2、RTO的计算(加权平均往返时间RTTs & RTT 偏差的加权平均 RTTD)

不能直接使用某次测量得到的 RTT 样本来计算超时重传时间 RTO \color{red}不能直接使用某次测量得到的\texttt{RTT}样本来计算超时重传时间 \texttt{RTO} 不能直接使用某次测量得到的RTT样本来计算超时重传时间RTO

利用每次测量得到的 RTT 样本,计算 加权平均往返时间 RTTs \color{red}加权平均往返时间\texttt{RTTs} 加权平均往返时间RTTs(又称为平滑的往返时间)。

当测量到第一个 RTT 样本时,RTTs 的值直接取为第一个 RTT 的值

  • RTT S1 = RTT 1 \color{red}\texttt{RTT}_{\texttt{S1}} = \texttt{RTT}_{\texttt{1}} RTTS1=RTT1

以后每测量一个 RTT 样本时,都按该公式来计算新的 RTTs 的值

  • 新的 RTTs = ( 1 − α ) × 旧的 RTTs + α × 新的 RTT 样本 \color{red}新的 \texttt{RTTs} = (1-\alpha) \times 旧的 \texttt{RTTs} + \alpha \times 新的\texttt{RTT}样本 新的RTTs=(1α)×旧的RTTs+α×新的RTT样本

    在上式中。 0 ≤ α < 1 : 0 \le \alpha < 1: 0α<1:

    ​ 若 α \alpha α 很接近于 0 0 0,则新 RTT 样本对 RTTs 的影响不大

    ​ 若 α \alpha α 很接近于 1 1 1,则新 RTT 样本对 RTTs 的影响较大

    已成为建议标准的 RFC6298 推荐的 α \alpha α 值为 1 / 8 1/8 1/8 ,即 0.125 0.125 0.125

用这种方法得出的加权平均往返时间 RTTs 就比测量出的 RTT 值更加平滑。

显然,超时重传时间 RTO 应略大于加权平均往返时间 RTTs


RFC6298 建议使用下式计算超时重传时间 RTO

  • RTO = RTTs + 4 × RTT D \color{red}\texttt{RTO} = \texttt{RTTs} + 4 \times \texttt{RTT}_{\texttt{D}} RTO=RTTs+4×RTTD

其中 RTT D \texttt{RTT}_{\texttt{D}} RTTD RTT \texttt{RTT} RTT 偏差的加权平均 RTT D \texttt{RTT}_{\texttt{D}} RTTD

  • RTT D1 = RTT 1 / 2 \color{red}\texttt{RTT}_{\texttt{D1}} = \texttt{RTT}_{\texttt{1}} / 2 RTTD1=RTT1/2

新的 RTT D = ( 1 − β ) × 旧的 RTT D + β × ∣ RTTs − 新的 RTT 样本 ∣ \color{red}新的 \texttt{RTT}_{\texttt{D}} = (1-\beta) \times 旧的 \texttt{RTT}_{\texttt{D}} + \beta \times|\texttt{RTTs} -新的\texttt{RTT}样本| 新的RTTD=(1β)×旧的RTTD+β×RTTs新的RTT样本

在上式中。 0 ≤ β < 1 : 0 \le \beta< 1: 0β<1:

已成为建议标准的 RFC6298 推荐的 β \beta β 值为 1 / 4 1/4 1/4 ,即 0.25 0.25 0.25

image-20230106005549540


从上述发现,不管是 RTTs 还是 RTTD,都是基于所测量到的 RTT 样本测量到的

若所测量到的 RTT 样本不正确,那么所计算出的 RTTsRTTD 自然就不正确

进而所计算出的超时重传时间 RTO 也就不正确


3、往返时间 RTT 的测量

往返时间 RTT 的测量比较复杂

3.1、TCP数据报文段丢失

image-20230106005947310

对于上述所示,主机 A 收到该确认报文段后

  • 无法判断该报文段是对原报文段的确认还是对重传报文段的确认

该报文段实际上是对重传报文段的确认

  • 也就是说正确的 RTT 应该是这一段时间(绿色✔标记)

但是若主机 A 误将该确认当作是对原报文段的确认

  • 也就是误认这段时间 RTT(红色❌标记)

则所计算出的 RTTsRTO 就会偏大,降低了传输效率

image-20230106010350469


3.2、迟到的确认报文段

image-20230106010448158

如上所示:该确认报文段没有在正常时间内到达主机 A,这必然会导致主机 A 对之前所发送的数据报文段的超时重传

主机 A 收到迟到的确认报文段后

  • 无法判断该报文段是对原报文段的确认还是对重传报文段的确认

该报文段实际上是对原报文段的确认

  • 也就是说正确的 RTT 应该是这一段时间(绿色✔标记)

但是若主机 A 误将该确认当作是对重传报文段的确认

  • 也就是误认这段时间 RTT(红色❌标记)

则所计算出的 RTTsRTO 就会偏小,这会导致报文段没有必要的重传,增大网络负荷。

image-20230106010738979


从上述可以看出,当发送方出现超时重传后,收到确认报文段时,是无法判断该报文段是对原报文段的确认还是对重传报文段的确认

  • 也就是无法准确测量 RTT,进而无法正确计算超时重传时间 RTO

4、karn 算法及改进

针对 出现超时重传时无法测准往返时间 RTT \color{blue}出现超时重传时无法测准往返时间\texttt{RTT} 出现超时重传时无法测准往返时间RTT的问题, K a r n \color{red}Karn Karn 提出了一个 算法 \color{red}算法 算法

  • 在计算加权平均往返时间 RTTs 时,只要报文段重传了,就不采用其往返时间 RTT 样本。 \color{red}在计算加权平均往返时间\texttt{RTTs}时,只要报文段重传了,就不采用其往返时间\texttt{RTT}样本。 在计算加权平均往返时间RTTs时,只要报文段重传了,就不采用其往返时间RTT样本。

就是出现重传时,不重新计算 RTTs ,进而超时重传时间 RTO 也不会重新计算。

  • 这又引起了新的问题。设想出现这样的情况:报文段的时延突然增大了很多,并且之后很长一段时间都会保持这种时延。因此在原来得出的重传时间内,不会收到确认报文段。于是就重传报文段。

    但根据 Karn 算法,不考虑重传的报文段的往返时间样本。这样,超时重传时间就无法更新。这会导致报文段反复被重传。

因此,要对 K a r n 算法进行修正 \color{red}Karn算法进行修正 Karn算法进行修正。方法是:

  • 报文段每重传一次,就把超时重传时间 RTO 增大一些 \color{red}报文段每重传一次,就把超时重传时间\texttt{RTO}增大一些 报文段每重传一次,就把超时重传时间RTO增大一些
  • 典型的做法是将新 RTO 的值取为旧 RTO 值的 2 2 2 倍。

5、TCP超时重传时间的计算

image-20230106012322285


image-20230106012429619

6、小结

image-20230106012448661

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么BI仪表板的共享功能对企业如此重要?

随着大数据的发展&#xff0c;企业逐渐将数据作为其决策的重要组成部分&#xff0c;共享商业智能 (BI) 仪表板显得越来越重要。例如&#xff0c;在员工之间共享BI仪表板&#xff0c;不仅可以做出更好的数据驱动决策&#xff0c;还可以更好地提高工作透明度和问责制&#xff0c;…

Golang时间处理容易踩坑,小心损失百万

简介 在各个语言之中都有时间类型的处理&#xff0c;因为这个地球是圆的&#xff08;我仿佛在讲废话&#xff09;&#xff0c;有多个时区&#xff0c;每个时区的时间不一样&#xff0c;在程序中有必要存在一种方式&#xff0c;或者说一种类型存储时间&#xff0c;还可以通过一系…

手写RPC框架第8版-通过SpringBoot-Starter接入SpringBoot

源代码地址&#xff1a;https://github.com/lhj502819/IRpc/tree/v9 系列文章&#xff1a; 注册中心模块实现路由模块实现序列化模块实现过滤器模块实现自定义SPI机制增加框架的扩展性的设计与实现基于线程和队列提升框架并发处理能力框架容错性相关设计通过SpringBoot-Starte…

LayoutInflater学习(二)之创建布局View

这篇是在上篇的基础上继续学习LayoutInflater,上篇主要讲了LayoutInflater是怎么解析布局的,但是并没有去仔细地说明LayoutInflater创建View的过程,这篇就补上这部分。 LayoutInflater创建xml布局View是分开创建的: 1. 先创建xml布局最外层的View,也就是布局的根View 2. 递归…

package.json和package-lock.json的区别

前言 今天正在写代码&#xff0c;同学突然问我&#xff0c;package.json和package-lock.json有什么区别&#xff0c;这两个文件有什么用&#xff1f;我愣住了… 模块化开发 经过这么多年的发展&#xff0c;现在的前端开发基本上都是模块化开发了。而node和npm则可以很方便的…

电网调频及一次调频、二次调频

电网调频的基本概念电力系统运行的主要任务之一是对电网频率进行控制—控制电网频率在50Hz附近的一个允许范围内。电网频率偏离额定值50Hz的原因是能源侧&#xff08;水电、火电、核电……&#xff09;的供电功率与负荷侧的用电功率之间的平衡被破坏而引起的。负荷的用电功率是…

Sentinel热点参数限流

何为热点&#xff1f; 何为热点&#xff1f;热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K数据&#xff0c;并对其访问进行限制。比如&#xff1a; 1&#xff09;商品 ID 为参数&#xff0c;统计一段时间内最常购买的商品 ID 并进行限制&am…

正确的清理内存方式,才能让你的空间更加充裕

我们的手机用了一段时间后&#xff0c;有没有感觉卡变了&#xff0c;运行速度也很慢&#xff1f;估计是手机内存不足造成的&#xff0c;今天就来教教大家如何快速清理空间。方法一&#xff1a;清除微信缓存文件 我们每天都用微信。 其实它最占内存&#xff0c;我们还需要定时打…

原子化带来化学反应,视频号万粉创作者增加3倍,点赞10w+的爆款内容增长186%

1月10日&#xff0c;以“在场”为主题的2023微信公开课PRO正式开讲。本年度微信公开课重点从视频号内容生态发展、微信生态内各类产品助力实体转型以及数字生活服务升级三个方面&#xff0c;展示微信生态各产品的新能力、新计划。在2022年的微信公开课Pro上&#xff0c;“视频号…

广告业务系统 之 数据中转站 —— “日志中心-实时服务监控”

文章目录广告业务系统 之 数据中转站 —— “日志中心-实时服务监控”日志中心实时服务监控 —— 前链路日志分析日志收敛手段 —— “手术开口”基于 metrics 的日志分析 —— Prometheus & Graphite监控服务是怎么监控自身 & 比常规服务更坚强高扩展、高性能的架构设…

[L1 - 5分合集]心理阴影面积

L1-060 心理阴影面积 分数 5 作者 陈越 单位 浙江大学 题目&#xff1a; 这是一幅心理阴影面积图。我们都以为自己可以匀速前进&#xff08;图中蓝色直线&#xff09;&#xff0c;而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工&#xff08;图中的红色折线&#xff09;。由…

外贸邮件营销的优势

邮件营销相对于其他营销方式&#xff0c;历史更悠久。邮件营销具有成本低廉、快速、精准的特点。那么邮件营销有哪些优势&#xff0c;才能获得如此的关注。接下来&#xff0c;米贸搜和大家分享一下邮件营销的优势。1.节约成本的考虑:当前&#xff0c;世界经济复苏乏力&#xff…

Kafka消息队列使用及原理

消息队列作用&#xff1a;异步、削峰、解耦 1、kafka简介 ​ Apache Kafka 是一个分布式的流平台&#xff0c;有三个关键的功能&#xff1a; 能够发布&#xff08;写入&#xff09;和订阅&#xff08;读取&#xff09;事件流持续可靠的存储事件流在事件发生时回顾性的处理事件…

IB生物笔记:Structure and function of organelles

国际学校生物老师解读IB生物&#xff0c;感兴趣的同学记得收藏哦~IB生物分为SL(standard level)和HL(higher level)SL有6个topic∶细胞生物&#xff0c;分子生物&#xff0c;遗传学&#xff0c;生态学&#xff0c;物种进化以及多样性和人体生理。HL除了上述6个topic外还要加上∶…

C++模板类

目录 前言 类模板 模板类继承 前言 随着c发展&#xff0c;有一部分代码就会出现这样的情况&#xff1a;实现的内容相同&#xff0c;但是参数不同。模板类就是为解决这类情况来的&#xff0c;是一种泛型编码。即与数据类型无关的通用程序设计技术。 模板类本身不占空间&…

C语言模块化

&#x1f31e;欢迎来到C语言的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff0c;…

MySQL的行锁总结

文章目录前言一、行锁的介绍二、行锁的使用三、使用行锁所带来的问题四、死锁和死锁检测前言 上篇文章已经学习了MySQL的全局锁和表锁&#xff0c;今天这篇文章我们对行锁进行以下学习 一、行锁的介绍 行锁就是针对数据表中行记录的锁&#xff0c;比如事务A更新了一行&#x…

切面AOP

1.2 AOP体系与概念 简单地去理解&#xff0c;其实AOP要做三类事&#xff1a; 在哪里切入&#xff0c;也就是权限校验等非业务操作在哪些业务代码中执行。 在什么时候切入&#xff0c;是业务代码执行前还是执行后。 切入后做什么事&#xff0c;比如做权限校验、日志记录等。 因…

ES索引切分

提示&#xff1a;对于一些日志类的数据&#xff0c;我们常用到es作为存储&#xff0c;数据量过大时&#xff0c;可能会用到索引切分&#xff0c;这里可以参考 ES索引切分前言方案一&#xff1a;ES索引切分验证&#xff08;policy策略&#xff09;配置ilm策略 &#xff08;max_d…

照片如何修复清晰度?这些修复方法值得你收藏

我们都知道以前的拍照技术落后&#xff0c;拍摄出来的照片像素都比较低&#xff0c;从而导致照片有些模糊不清&#xff0c;再加上我们保存不当&#xff0c;很多旧照片都变得模糊破损&#xff0c;因此很多人为了不让这些旧照片消失&#xff0c;都会选择找人来修复这些旧照片&…