tcp/quic 的滑动窗口

一、滑动窗口
rwnd:
接收端窗口,接收方在每次发送ACK确认报文时,会包含一个 rwnd (Receive Window Size) 字段,指明自己当前剩余的接收缓冲区大小(即可用窗口),这里是否是socket的接收缓冲区,如果未被即时会被覆盖,那么何来缓冲区大小剩余一说。还是说它是系统的缓冲区,还没提交给socket缓冲区的那个缓冲区。

cwnd:
发送方的拥塞控制窗口,它根据reno,cubic,bbr等算法来确认cwnd的窗口大小。
慢启动
拥塞避免

其中快重传:它是对超时重传的优化,等到超时已经很晚了。它是收到三次重复ACK,则启动RTO,即拥塞窗口减半。当发送端发送了5个tcp段时,1,2,3,4,5。接收端收到了1后,发送了对2的期望ACK-2,依次收到3 4 5后,分别依次发送ACK-2。这样就有了四个ACK-2,后面三个称为对第一个的重复ACK。
MTU(Maximum Transmission Unit):网络层传输的最大单元,通常以太网为1500字节。
MSS=MTU - IP头部(20字节) - TCP头部(20字节)。 //MSS 通常为 1460 字节
tcp段与序列号:tcp把要传输的数据当成字节流,从第一个字节开始,给一个一开始商量号的序号number,往后每个字节的序号都累加1。一个MSS为1460字节。那么一个tcp段序号范围可以为1~1460。

例如,发送端发送 5000 字节数据,MSS 为 1000 字节,数据可能被分割成 5 个 TCP 段:
段 1:序列号 1-1000(1000 字节)
段 2:序列号 1001-2000
段 3:序列号 2001-3000
段 4:序列号 3001-4000
段 5:序列号 4001-5000

超时重传:也称为RTO,超时重传说明网络已经很严重了,它是最后一到保险,因为快重传阶段,服务器返回的三次重复ACK也可能丢失。

1.发送端发送一个 TCP 段后,启动一个重传定时器。
2.如果在 RTO 时间内未收到该段的 ACK,发送端重传该段。
3.重传后,TCP 通常将拥塞窗口(cwnd)重置为最小值(例如,1 MSS),进入慢启动阶段。

SRTT = (1 - α) * SRTT + α * 样本 RTT  //通常 α = 0.125(1/8)。
RTTVAR = (1 - β) * RTTVAR + β * |SRTT - 样本 RTT|   //RTT 方差(RTTVAR)
RTO = SRTT + max(G, K * RTTVAR)
G:时钟粒度(通常为 100ms 或更小)。
K:常数,通常为 4。
tcp中,RTO 至少为 1 秒(RFC 6298 建议),某些实现可能设置最小值(如 200ms)。
如果超时重传失败,RTO 会翻倍(例如,1s → 2s → 4s),直到达到最大值(通常 60 秒)
QUIC(RFC 9002)建议 RTO 最小值 100ms。
kGranularity = 1ms(符合 RFC 9002

二、吞吐量的计算
吞吐量又称单位时间内有效传输数据量,是被ACK确认已经到达对方的数据量。带宽是指实际的物理/硬件条件能提供的最高上限的吞吐量。因此吞吐量<=带宽。

吞吐量 ≤ MSS / RTT * C / sqrt(p)
其中:MSS:最大段大小(Maximum Segment Size)RTT:往返时延p:丢包率C:常数(通常接近 1

在无丢包(p≈0)的情况下,简化为:

吞吐量 ≈ 窗口大小 / RTT

这里这个窗口就是min(rwnd, cwnd)。
比如现在rtt为20ms,吞吐量为20M;如果现在突然执行以下命令

tc qdisc add dev eth0 root netem delay 200ms limit 10000

由于窗口大小不变,必定导致吞吐量减少为2M。这就像船载人过河,如果河变宽2倍,那么运输效率就会减少为1/2。这个时后需要提升的是船每批运送的人的数量。
那么由于这个命令只是把时间增加了,并没有减少带宽,这个时候由于tcp的拥塞避免,会缓慢增加窗口大小,直到丢包或超时。恢复到之前的吞吐量大小。

附录:

picoquic的picoquic_internal.h中,有如下定义:

PICOQUIC_INITIAL_RTT: 初始 RTT 设置为 250ms(250000 微秒)。
PICOQUIC_INITIAL_RETRANSMIT_TIMER: 初始 RTO 设置为 250ms(250000 微秒)。
PICOQUIC_INITIAL_MAX_RETRANSMIT_TIMER: 最大初始 RTO 为 1 秒(1000000 微秒)。
PICOQUIC_MIN_RETRANSMIT_TIMER: 最小 RTO 为 50ms(50000 微秒)。
PICOQUIC_LARGE_RETRANSMIT_TIMER: 大型重传定时器为 2 秒(2000000 微秒)。
PICOQUIC_ACK_DELAY_MAX_DEFAULT: 默认最大 ACK 延迟为 25ms(25000 微秒,符合 RFC 9002)。
PICOQUIC_ACK_DELAY_MIN: 最小 ACK 延迟为 1ms(1000 微秒)。
PICOQUIC_ACK_DELAY_MAX: 最大 ACK 延迟为 10ms(10000 微秒,具体值可由对端协商)。

如果rtt为20ms,且有以下条件:
RTTVAR ≈ 0ms(网络稳定,抖动极小,假设初始 RTTVAR 为 1ms)。
max_ack_delay = 25ms(使用 PICOQUIC_ACK_DELAY_MAX_DEFAULT)。
kGranularity = 1ms(符合 RFC 9002)。
计算quic的RTO为49ms。

RTO = SRTT + max(4 * RTTVAR, kGranularity) + max_ack_delay= 20ms + max(4 * 1ms, 1ms) + 25ms= 20ms + 4ms + 25ms= 49ms

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

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

相关文章

JVM监控及诊断工具-命令行篇

18.1. 概述 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题&#xff0c;在用户体验至上的今天&#xff0c;解决好应用的性能问题能带来非常大的收益。 Java 作为最流行的编程语言之一&#xff0c;其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能…

Jenkins 版本升级与插件问题深度复盘:从 2.443 到 2.504.3 及功能恢复全解析

前言&#xff1a;问题溯源与升级必要性 在 Jenkins 持续集成体系中&#xff0c;插件生态是其强大功能的核心驱动力。然而&#xff0c;某次例行维护中&#xff0c;团队对 Jenkins 2.443 环境的插件进行批量升级后&#xff0c;意外触发连锁反应 &#xff1a; SSH Server 插件功能…

Ribbon实战

一、前置知识 1.1 负载均衡定义 负载均衡指的是将网络请求通过不同的算法分配到不同的服务器上的技术&#xff0c;从而提升系统的性能。 1.2 负载均衡工具 负载均衡工具可以分分为客户端负载均衡工具和服务端负载均衡工具&#xff0c;它们的区别如下。 表1-1 负载均衡工具…

cs285学习笔记(一):课程总览

根据 Fall 2023 学期的官方课程日程&#xff0c;这里是 CS 285 全课程的 Lecture 大纲及内容摘要&#xff0c;详细对应周次和主题&#xff0c;方便你快速定位每节课要点、相关作业与视频资源 &#x1f3af; 官方课程地址 YouTobe 视频地址 blibli视频(带中文字幕) &#x…

OkHttp SSE 完整总结(最终版)

1. SSE 基础概念 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09;是一种 Web 标准&#xff0c;允许服务器向客户端推送实时数据。 核心特点 单向通信&#xff1a;服务器 → 客户端 基于 HTTP 协议&#xff1a;使用 GET 请求 长连接&#xff1a;连…

聚宽sql数据库传递

自建数据库从聚宽到Q-MT自动化交易实战 从接触聚宽以来一直都是手动跟单&#xff0c;在网上看到许多大佬的自动交易文章&#xff0c;心里也不禁十分痒痒。百说不如一练&#xff0c;千讲不如实干。经过一番努力&#xff0c;终于成功实盘了&#xff0c;效果还可以&#xff0c;几…

es里为什么node和shard不是一对一的关系

提问&#xff1a; 既然多个shard会被分配到同一个node上&#xff0c;那么为什么不把多个shard合并成一个然后存在当前node上呢&#xff0c;简而言之也就是让node和shard形成一对一的关系呢 &#xff1f;非常好的问题&#xff0c;这正是理解Elasticsearch分片&#xff08;shard…

浅谈npm,cnpm,pnpm,npx,nvm,yarn之间的区别

首先做一个基本的分类 名称描述npm,cnpm,yarn,pnpm都是Javascript包管理器nvm是Node.js版本控制器npx命令行工具 I.npm,cnpm,yarn,pnpm npm (Node Package Manager) npm是Node.js默认的包管理器&#xff0c;随Node.js的安装会一起安装。使用npm可以安装&#xff0c;发布&…

滑动窗口-76.最小覆盖子串-力扣(LeetCode)

一、题目解析1.不符合要求则返回空串("")2.子串中重复字符的数量要不少于t中该字符的数量二、算法原理解法1&#xff1a;暴力枚举哈希表这里的暴力枚举也可以优化&#xff0c;即在包含t中元素处枚举&#xff0c;如在A、B和C处开始枚举&#xff0c;减少不必要的枚举 解…

从零构建搜索引擎 build demo search engine from scratch

从零构建搜索引擎 build demo search engine from scratch 我们每天都会使用搜索引擎&#xff1a;打开google等搜索引擎&#xff0c;输入关键词&#xff0c;检索出结果&#xff0c;这是一次搜索&#xff1b;当打开历史记录旁边的&#x1f50d;按钮&#xff0c;输入关键词&#…

pytorch小记(二十九):深入解析 PyTorch 中的 `torch.clip`(及其别名 `torch.clamp`)

pytorch小记&#xff08;二十九&#xff09;&#xff1a;深入解析 PyTorch 中的 torch.clip&#xff08;及其别名 torch.clamp&#xff09;深入解析 PyTorch 中的 torch.clip&#xff08;及其别名 torch.clamp&#xff09;一、函数签名二、简单示例三、广播支持四、与 Autograd…

快速分页wpf

/*没有在xaml设置上下文window.context是因为 命名空间一直对应不上 所以在xaml.cs 里面绑定*/ <Window x:Class"DataGrid.views.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft…

如何彻底禁用 Chrome 自动更新

如何彻底禁用 Chrome 自动更新 随着谷歌将 Chrome 浏览器版本升级至 138&#xff0c;它即将彻底抛弃对 Manifest V2 扩展的支持。许多用户希望将浏览器版本锁定在 138&#xff0c;以继续使用 uBlock Origin、Tampermonkey 等常用扩展。 本文总结了四种有效方法&#xff0c;帮助…

流批一体的“奥卡姆剃刀”:Apache Cloudberry 增量物化视图应用解析

引言&#xff1a;流批一体&#xff0c;理想与现实的鸿沟 在数据驱动的今天&#xff0c;“实时”二字仿佛拥有魔力&#xff0c;驱使着无数企业投身于流批一体架构的建设浪潮中。我们渴望实时洞察业务变化&#xff0c;实时响应用户需求。以 Apache Flink 为代表的流处理引擎&…

C# 入门教程(三):详解字段、属性、索引器及各类参数与扩展方法

文章目录一、字段、属性、索引器、常量1.字段2.属性2.1 什么是属性2.2 属性的声明2.3 属性与字段的关系3 索引器4. 常量二、传值 输出 引用 数组 具名 可选参数&#xff0c;扩展方法2.1 传值参数2.1.1 值类型 传参2.1.2 引用类型 传参2.2 引用参数2.2.1 引用参数-值类型 传参2.…

《美术教育研究》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答&#xff1a;问&#xff1a;《美术教育研究》是不是核心期刊&#xff1f;答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。问&#xff1a;《美术教育研究》级别&#xff1f;答&#xff1a;省级。主管单位&#xff1a; 安徽出版集团有限责任公司 主办…

每日算法刷题Day47:7.13:leetcode 复习完滑动窗口一章,用时2h30min

思考: 遇到子数组/子字符串可以考虑能不能用滑动窗口&#xff0c; 定长:逆向思维,答案不定 最大长度/最小长度:一般求长度 越长越合法/越短越合法/恰好:一般求数量 主要思考窗口条件成立&#xff0c; 判断条件是符合窗口条件(最小长度/越长越合法还是不符合(最大长度/越短越合法…

电流驱动和电压驱动的区别

理解电流驱动和电压驱动的区别对电路设计至关重要&#xff0c;尤其在高速、高抗噪要求的场景&#xff08;如LVDS&#xff09;。以下是两者的核心对比&#xff1a;一、电压驱动 (Voltage Drive) 核心原理&#xff1a; 驱动器输出一个受控的电压&#xff08;与负载阻抗无关&#…

宿舍电费查询——以ZUA为例

宿舍电费查询——以ZUA为例0. 安装抓包环境手机端桌面端1. 登录1.1 开启抓包后进入缴费页面&#xff1a;1.2 分析请求1.3 编写登录代码2. 获取楼栋及房间ID2.1 获取楼栋ID2.2 编写获取楼栋ID代码2.3 获取房间ID2.4 编写获取房间ID代码3. 获取剩余电费&#xff1a;3.1 选择房间号…

vue中计算属性的介绍

Vue.js 中的计算属性是基于它的响应式系统来实现的&#xff0c;它可以根据 Vue 实例的数据状态来动态计算出新的属性值。在 Vue 组件中&#xff0c;计算属性常用于对数据进行处理和转换&#xff0c;以及动态生成一些需要的数据。一、使用方式1.定义计算属性&#xff1a; 在Vue组…