基于UDP的可靠传输协议QUIC协议

  • 基于 UDP 协议实现的可靠传输协议的成熟方案了,那就是 QUIC 协议,已经应用在了 HTTP/3。

  • QUIC是如何实现可靠传输的

    • 基于 UDP 协议实现的可靠传输协议的成熟方案了,那就是 QUIC 协议,已经应用在了 HTTP/3。

    • Packet header

      • Packet Header 首次建立连接时和日常传输数据时使用的 Header 是不同的

      • QUIC 也是需要三次握手来建立连接的,主要目的是为了协商连接 ID。协商出连接 ID 后,后续传输时,双方只需要固定住连接 ID,从而实现连接迁移功能。

      • Short Packet Header 中的 Packet Number 是每个报文独一无二的编号,它是严格递增的,也就是说就算 Packet N 丢失了,重传的 Packet N 的 Packet Number 已经不是 N,而是一个比 N 大的值。

      • 为什么要这么设计呢?

        • QUIC 报文中的 Pakcet Number 是严格递增的, 即使是重传报文,它的 Pakcet Number 也是递增的,这样就能更加精确计算出报文的 RTT。

        • 还有一个好处,QUIC 使用的 Packet Number 单调递增的设计,可以让数据包不再像 TCP 那样必须有序确认,QUIC 支持乱序确认,当数据包Packet N 丢失后,只要有新的已接收数据包确认,当前窗口就会继续向右滑动

    • QUIC Frame Header

      • 一个 Packet 报文中可以存放多个 QUIC Frame。

      • 每一个 Frame 都有明确的类型,针对类型的不同,功能也不同,自然格式也不同。

      • 引入 Frame Header 这一层,通过 Stream ID + Offset 字段信息实现数据的有序性,通过比较两个数据包的 Stream ID 与 Stream Offset ,如果都是一致,就说明这两个数据包的内容一致。

      • QUIC 通过单向递增的 Packet Number,配合 Stream ID 与 Offset 字段信息,可以支持乱序确认而不影响数据包的正确组装

  • QUIC是如何解决TCP的队头阻塞问题的

    • 没有队头阻塞的QUIC

      • 在一条 QUIC 连接上可以并发发送多个 HTTP 请求 (Stream)。

      • QUIC 给每一个 Stream 都分配了一个独立的滑动窗口,这样使得一个连接上的多个 Stream 之间没有依赖关系,都是相互独立的,各自控制的滑动窗口。

      • 假如 Stream2 丢了一个 UDP 包,也只会影响 Stream2 的处理,不会影响其他 Stream,与 HTTP/2 不同,HTTP/2 只要某个流中的数据包丢失了,其他流也会因此受影响。

  • QUIC是如何做流量控制的

    • QUIC 实现流量控制的方式:

      • 通过 window_update 帧告诉对端自己可以接收的字节数,这样发送方就不会发送超过这个数量的数据。

      • 通过 BlockFrame 告诉对端由于流量控制被阻塞了,无法发送数据。

      • QUIC 是基于 UDP 传输的,而 UDP 没有流量控制,因此 QUIC 实现了自己的流量控制机制,QUIC 的滑动窗口滑动的条件跟 TCP 有一点差别,但是同一个 Stream 的数据也是要保证顺序的,不然无法实现可靠传输,因此同一个 Stream 的数据包丢失了,也会造成窗口无法滑动。

      • QUIC 的 每个 Stream 都有各自的滑动窗口,不同 Stream 互相独立,队头的 Stream A 被阻塞后,不妨碍 StreamB、C的读取。

      • QUIC 实现了两种级别的流量控制,分别为 Stream 和 Connection 两种级别:

        • Stream 级别的流量控制:Stream 可以认为就是一条 HTTP 请求,每个 Stream 都有独立的滑动窗口,所以每个 Stream 都可以做流量控制,防止单个 Stream 消耗连接(Connection)的全部接收缓冲。

        • Connection 流量控制:限制连接中所有 Stream 相加起来的总字节数,防止发送方超过连接的缓冲容量。

      • Stream 级别的流量控制

        • 接收窗口的左边界取决于接收到的最大偏移字节数,此时的接收窗口 = 最大窗口数 - 接收到的最大偏移数

        • 看出 QUIC 的流量控制和 TCP 有点区别了:

          • TCP 的接收窗口只有在前面所有的 Segment 都接收的情况下才会移动左边界,当在前面还有字节未接收但收到后面字节的情况下,窗口也不会移动。

          • QUIC 的接收窗口的左边界滑动条件取决于接收到的最大偏移字节数。

      • Connection 流量控制

        • Connection 级别的流量窗口,其接收窗口大小就是各个 Stream 接收窗口大小之和

        • 上图所示的例子,所有 Streams 的最大窗口数为 120,其中

          • Stream 1 的最大接收偏移为 100,可用窗口 = 120 - 100 = 20

          • Stream 2 的最大接收偏移为 90,可用窗口 = 120 - 90 = 30

          • Stream 3 的最大接收偏移为 110,可用窗口 = 120 - 110 = 10

        • 那么整个 Connection 的可用窗口 = 20 + 30 + 10 = 60

          可用窗口 = Stream 1 可用窗口 + Stream 2 可用窗口 + Stream 3 可用窗口

  • QUIC对拥塞控制改进

    • QUIC 是处于应用层的,应用程序层面就能实现不同的拥塞控制算法,不需要操作系统,不需要内核支持

    • QUIC 可以随浏览器更新,QUIC 的拥塞控制算法就可以有较快的迭代速度。

    • QUIC 处于应用层,所以就可以针对不同的应用设置不同的拥塞控制算法

  • QUIC更快的连接建立

    • QUIC 内部包含了 TLS,它在自己的帧会携带 TLS 里的“记录”,再加上 QUIC 使用的是 TLS1.3,因此仅需 1 个 RTT 就可以「同时」完成建立连接与密钥协商,甚至在第二次连接的时候,应用数据包可以和 QUIC 握手信息(连接信息 + TLS 信息)一起发送,达到 0-RTT 的效果。

  • QUIC是如何迁移连接的

    • 基于 TCP 传输协议的 HTTP 协议,由于是通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接。

    • 当移动设备的网络从 4G 切换到 WIFI 时,意味着 IP 地址变化了,那么就必须要断开连接,然后重新建立 TCP 连接。

    • QUIC 协议没有用四元组的方式来“绑定”连接,而是通过连接 ID来标记通信的两个端点,客户端和服务器可以各自选择一组 ID 来标记自己,因此即使移动设备的网络变化后,导致 IP 地址变化了,只要仍保有上下文信息(比如连接 ID、TLS 密钥等),就可以“无缝”地复用原连接,消除重连的成本,没有丝毫卡顿感,达到了连接迁移的功能。

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

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

相关文章

采用大语言模型进行查询重写——Query Rewriting via Large Language Models

文章:Query Rewriting via Large Language Models,https://arxiv.org/abs/2403.09060 摘要 查询重写是在将查询传递给查询优化器之前处理编写不良的查询的最有效技术之一。 手动重写不可扩展,因为它容易出错并且需要深厚的专业知识。 类似地…

常识四堆外内存

常识四堆外内存-腾讯云开发者社区-腾讯云

跳跳!

题源 贪心~ 题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去。 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 i 块的石头高度为hi​,地面的高度是 h0​0。你估计着,从第…

Monaco Editor系列(二)Hello World 初体验

前言:上一篇文章我主要分享了从 Monaco Editor 入口文件以及官方提供的示例项目入手,对一部分源码进行剖析,以及分享了初始化阶段代码的大致执行步骤,这一篇了来讲一下我们要用 Monaco Editor 的时候该怎么用。其中会涉及到一些 A…

ubuntu20.04 运行 lio-sam 流程记录

ubuntu20.04 运行 lio-sam 一、安装和编译1.1、安装 ROS11.2、安装 gtsam1.3、安装依赖1.4、下载源码1.5、修改文件1.6、编译和运行 二、官方数据集的运行2.1、casual_walk_2.bag2.2、outdoor.bag、west.bag2.3、park.bag 三、一些比较好的参考链接 记录流程,方便自…

选数(dfs,isprime)

题目&#xff1a;P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com​​​​​​.cn) #include<bits/stdc.h> using namespace std; int n,k; int a[22]; long long ans; bool isprime(int n){for(int i2;i<sqrt(n);i){if(n%i0) return false;…

dm8 开启归档模式

dm8 开启归档模式 1 命令行 [dmdbatest1 dm8]$ disql sysdba/Dameng123localhost:5237服务器[localhost:5237]:处于普通打开状态 登录使用时间 : 3.198(ms) disql V8 SQL> select name,status$,arch_mode from v$database;行号 NAME STATUS$ ARCH_MODE ----------…

【嵌入式开发 Linux 常用命令系列 7.4 -- awk 处理文件名,去除后缀只保留文件名】

请阅读【嵌入式开发学习必备专栏 】 文章目录 awk 处理文件名&#xff0c;去除后缀只保留文件名 awk 处理文件名&#xff0c;去除后缀只保留文件名 在 shell 中&#xff0c; 可以使用 awk 来处理文件名&#xff0c;去除其后缀。下面是一个示例命令&#xff0c;它会将带有后缀的…

qtcreator配置msvc编译器 visual studio配置qt开发 以及使用对比

qtcreator配置msvc编译器开发 qtcreator在线安装&#xff08;qt5.12之后&#xff09;时候&#xff0c;默认选择的是mingw&#xff08;gcc编译器的windows版本&#xff09;的qt库以及migw编译器&#xff0c;我们可以额外勾选msvc&#xff08;visual studio的编译器&#xff0c;…

IPv4子网判断

有时候&#xff0c;服务后端需要对客户端的所属组进行判断&#xff0c;以决定何种访问策略权限。而客户端IP所在子网是一种很简单易实现的分组方法。 虽然现在早已经进入IPv6时代&#xff0c;不过IPv4在局域网仍广泛使用&#xff0c;它的定义规则相对简单&#xff0c;本文介绍的…

Python中输出显示台的设置

效果: 前言 这种文字显示的方式很适合新手来学习,毕竟新手还学不到pygame做游戏的, Python入门我们一般都学的是输入输出的游戏,但是如果加上一些文字和背景的改善可能会更好. 如何改变字体颜色 字体颜色(跟他的变量名是一样的): #改变字体颜色 RED \033[91m GREEN \033…

前端开发语言概览

前端开发语言概览 在当今数字化时代&#xff0c;前端开发已成为构建网站和应用程序不可或缺的一部分。前端开发主要关注用户界面的设计和交互效果&#xff0c;为用户提供良好的用户体验。而要实现这一目标&#xff0c;前端开发者需要掌握多种编程语言和技术。本文将详细介绍一些…

EasyExcel 模板导出excel、合并单元格及单元格样式设置。 Freemarker导出word 合并单元格

xls文件&#xff1a; 后端代码&#xff1a; InputStream filePath this.getClass().getClassLoader().getResourceAsStream(templateFile);// 根据模板文件生成目标文件ExcelWriter excelWriter EasyExcel.write(orgInfo.getFilename()).excelType(ExcelTypeEnum.XLS).withTe…

c#仿ppt案例

画曲线 namespace ppt2024 {public partial class Form1 : Form{public Form1(){InitializeComponent();}//存放所有点的位置信息List<Point> lstPosition new List<Point>();//控制开始画的时机bool isDrawing false;//鼠标点击开始画private void Form1_MouseD…

【C语言基础】:自定义类型(一)--> 结构体

文章目录 一、内置类型与自定义类型1.1 内置类型&#xff08;基本数据类型&#xff09;1.2 自定义类型 二、结构体2.1 结构体的声明2.2 结构体变量的创建和初始化2.3 结构体的特殊声明2.4 结构体的自引用 三、结构体内存对齐3.1 对齐规则3.2 为什么存在内存对齐3.3 修改默认对齐…

C++心决之内联函数+auto关键字+指针空值

目录 7.内联函数 7.1 概念 7.2 特性 8. auto关键字(C11) 8.1 类型别名思考 8.2 auto简介 8.3 auto的使用细则 8.4 auto不能推导的场景 9. 基于范围的for循环(C11) 9.1 范围for的语法 9.2 范围for的使用条件 10. 指针空值nullptr(C11) 10.1 C98中的指针空值 7.内联…

如何优化TCP?TCP的可靠传输机制是什么?

在网络世界中&#xff0c;传输层协议扮演着至关重要的角色&#xff0c;特别是TCP协议&#xff0c;以其可靠的数据传输特性而广受青睐。然而&#xff0c;随着网络的发展和数据量的激增&#xff0c;传统的TCP协议在效率方面遭遇了挑战。小编将深入分析TCP的可靠性传输机制&#x…

基于springboot+vue+Mysql的实习管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

达梦数据库同步工具DMHS快速安装

1.DM端DMHS安装 1.1.上传安装文件 DMHS的安装需要以下文件 dm8_20230629_x86_rh6_64_ent_8.1.3.26_dmdci.zip dmhs_V4.3.08_dm8_rev127399_rh6_64_veri_20230407_sp8.bin 1.2.执行DMHS安装 [rootdameng ~]# mkdir /dmhs [rootdameng ~]# chown -R dmdba:dinstall /dmhs/ […

【C++】编程规范之函数规则

对所有函数入参进行合法性检查 在编写函数时&#xff0c;应该始终对所有传入的参数进行合法性检查&#xff0c;以防止出现意外的错误或异常情况。这包括但不限于检查指针是否为空、整数是否在有效范围内、数组是否越界等等。通过对参数进行严格的合法性检查&#xff0c;可以避免…