QUIC协议报文解析(三)

2023-09-18 20:17:17

        在前面的两篇文字里我们简单介绍了QUIC的发展历史,优点以及QUIC协议的连接原理。本篇文章将会以具体的QUIC报文为例,详细介绍QUIC报文的结构以及各个字段的含义。

        早期QUIC版本众多,主要有谷歌家的gQUIC,以及IETF致力于将QUIC标准化,即IETF QUIC(iQUIC),还有Facebook家的mvfst。早期各家的QUIC都有自己定制的字段,但总体是大同小异。

        与包头格式固定的 TCP 不同,QUIC 有两种类型的包头。 建立连接的QUIC数据包需要包含的信息多,它使用长头格式。 一旦建立连接,只需要某些报头字段,后续数据包使用短报头格式以提高效率。

一:gQUIC早期Q043以及以下版本包头

gQUIC的Q043及以下的版本与Q044版本之后的公共包头是不同的与现在最新的公共包头是不同的

前8位是公共标志位,其中部分意义如下:

0x01

Packet是否包含QUIC Version

0x02

Packet是否是Public Reset Packets

0x0C的两比特

Connection ID的长度(0/8/32/64位)

0x30的两比特

Packet number的长度(8/16/32/48位)

        Connection ID:客户端产生的一个64位无符号整型,标识唯一的连接,可以与服务端协商Connection ID的长度。当客户端漫游,IP 4元组无法标识一个连接时,可使用Connection ID标识一个连接。当IP 4元组可以标识连接时,该字段可省略。

        Version:32位的版本号。当客户端提议的版本不支持时,服务器端可以设置版本标记,并提供一个可接受版本列表。

        Packet Number:包号。每个普通包(与特别的公共复位和版本协商包相反)由发送者分配包号。由某一端发送的首包包号应该为1,后续每个包的包号应比前一个大1。

        gQUIC的Q043及以下的版本没有后来的长包头短包头的说法,其包头的格式是统一的。只是后面为了兼容主流QUIC在Q044版本之后公共包头采用了长包头和短包头的形式。

二:QUIC长包头

        随着2021年5月 QUIC RFC 9000发布,并由RFC 9001、RFC 9002和RFC 8999支持(其中,RFC8999定义了QUIC协议版本无关的规范,RFC9001定义了QUIC与TLS的协议映射、RFC9002定义了QUIC协议的丢失恢复与拥塞控制)。这意味着QUIC Version 1已经正式标准化,并且QUIC部署将从使用临时草案版本转向新创建的Version 1。与此同时,有最新消息指出QUIC Version 1以一种新的互联网传输技术作为标准发布,可提高Web应用程序的性能、安全性和隐私性。

        随着QUIC标准化版本的宣布,目前Facebook、Akamai、Microsoft、Cloudflare、Ericsson、F5、Fastly和Google都已部署了QUIC和HTTP/3。至此QUIC进入到统一的时代。

        为什么要介绍上面的背景,因为在RFC9000出来之前QUIC的长包头和短包头不说在各个大厂之间,即使是同一个厂家比如Google,不同版本的QUIC包头的格式也是有差别的。这就没发展开了,下面我们看一下RFC9000的长包头。

 最明显的标志就是第一个字节的高位设置为 1。该字节中的所有其他位都是特定于版本的。另外对于Packet Type占两位,其取值如下:

Version:四个字节,包括一个 32 位版本字段。 RFC9000的Version是1,其实也可以理解这是QUIC标准化后的第一个版本

Destination Connection ID Length:目标连接 ID 字段的字节长度。 此长度编码为 8 位无符号整数。

Destination Connection ID:目标连接 ID 字段,长度在 0 到 160个字节之间。

Source Connection ID Length:源连接 ID 字段的字节长度。 此长度编码为 8 位无符号整数。

Source Connection ID:源连接 ID 字段,长度在 0 到 160个字节之间。

数据包的其余部分包含特定于版本的内容。

三:QUIC短包头

短包头的格式如下:

带有短包头的 QUIC 数据包的第一个字节的高位设置为 0。

带有短包头的 QUIC 数据包包括紧跟在第一个字节之后的目标连接 ID。 短包头不包括目标连接 ID 长度、源连接 ID 长度、源连接 ID 或版本字段。 目标连接 ID 的长度没有编码在具有短包头的数据包中,并且不受本规范的限制。

数据包的其余部分具有特定于版本的语义

更多推荐

散列(哈希)查找的定义,常见的散列函数设计以及处理哈希冲突方法

1.散列表1.散列表的定义散列表(HashTable),又称哈希表。是一种数据结构,特点是:数据元素的关键字与其存储地址直接相关。特点:若不同的关键字通过散列函数映射到同一个值,则称它们为“同义词”。通过散列函数确定的位置已经存放了其他元素,则称这种情况为“冲突”。2.处理冲突的方法1:拉链法(链地址法)用拉链法(又称

LeetCode_拓扑排序_困难_2603.收集树中金币

目录1.题目2.思路3.代码实现(Java)1.题目给你一个n个节点的无向无根树,节点编号从0到n-1。给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其中coins[i]可能为0也可能为1,1表示节点i处

conan入门(二十八):解决conan 1.60.0下 arch64-linux-gnu交叉编译openssl/3.1.2报错问题

上一篇博客《conan入门(二十七):因profile[env]字段废弃导致的boost/1.81.0在aarch64-linux-gnu下交叉编译失败》解决了conan1.60.0交叉编译boost/1.80.1的问题后,我继续交叉编译openssl/3.1.2时又报错了conaninstallopenssl/3.1

片上网络(2)拓扑结构

前言片上网络的拓扑(topology)确定了网络中节点和通道之间的物理布局和连接。拓扑对网络的整体成本效率(cost-performance)有相当重要的影响。拓扑决定了一条消息的跳数或经过的路由器个数,以及每跳经过的互连线的物理距离,因此会对网络延迟产生显著的影响。因为信息经过路由器(router)和链路(link)

window.parent.postMessage-不用考虑跨域的父子页面通讯

本人使用情景A项目使用iframe内嵌了一个B项目的几个页面,A和B都是vue2项目,A和B是父子内嵌关系,A和B会有端口不同的情况,所有沟通起来会有跨域问题(前-后端,A前端页面-B前端页面),采用window.parent.postMessage方法主要解决的是A前端-B前端页面的问题,B页面token丢失时,要求

QT---day2---9.18

完善登录框点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容,继续进行登录;如果点击cancel按钮,则关闭界面。如果账号和密码匹配,则弹出信息对话框,给出提示信

华为高斯数据库配置环境变量(DWS,高斯数据库,libra) 报错:sh: gsql: command not found

在进行高斯数据库相关的迁移时提示错误(gsql:commandnotfound)1:根据日志分析缺少高斯数据库客户端,需要对安装客户端。2:需要和客户获取客户端安装包,我这里拿到的版本是这样的3:将安装包上传至服务器目录之后需要配置当前用户的环境变量4:编辑家目录下的配置文件~/.bash_profile5:增加一行配

微服务的艺术:构建可扩展和弹性的分布式应用

文章目录什么是微服务架构?微服务的设计原则1.基于业务边界划分服务2.松耦合和强内聚3.自动化测试和部署4.监控和日志5.弹性设计微服务的实施细节1.服务发现示例代码:使用Consul进行服务发现2.负载均衡示例代码:Nginx配置负载均衡3.数据管理示例代码:使用消息队列进行数据共享4.弹性设计示例代码:使用Kube

基于Matlab实现图像目标边界描述

图像目标边界描述是图像处理中的一个重要问题。边界描述可以用于目标检测和识别、图像分割等应用。Matlab提供了强大的图像处理工具箱,可以方便地实现图像目标边界描述。本文介绍一种基于边缘检测的图像目标边界描述方法,并提供一个简单的案例源码。文章目录步骤简单案例更多源码+图像下载步骤方法:基于边缘检测的图像目标边界描述方法

ruoyi框架修改左侧菜单样式

菜单效果ruoyi前端框架左侧的菜单很丑,我们需要修改一下样式,下面直接看效果。修改代码1、sidebar.scss.el-menu-item,.el-submenu__title{overflow:hidden!important;text-overflow:ellipsis!important;white-spac

Thymeleaf介绍及其在Spring Boot中的使用

📖Thymeleaf简介📚Thymeleaf的定义Thymeleaf是一款现代化的服务器端Java模板引擎,适用于Web和独立应用场景。它具备处理HTML、XML、JavaScript、CSS以及纯文本的能力。Thymeleaf的核心目标是为开发者提供一种优雅且自然的模板设计方式,从而使得开发者能够更加便捷地构建、

热文推荐