http/2 二进制分帧层 (Binary Framing Layer)讲解
文章目录
- 二进制帧
- HTTP/2 中的帧、消息和流
- 1. 帧(Frame)
- 2. 消息(Message)
- 3. 流(Stream)
- @总结
- 示例:
- 二进制帧结构
- 1.帧头部结构
- 2.帧负载数据
- 请求和响应多路复用
链接参考:https://web.dev/articles/performance-http2?hl=zh-cn#binary_framing_layer
二进制帧
在HTTP2.0中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码
HTTP/2 所有性能增强的核心是新的二进制分帧层
,它规定了 HTTP 消息的封装方式,并在客户端和服务器之间传输。
为了保证HTTP不受影响,那就需要在应用层(HTTP2.0)和传输层(TCP or UDP)之间增加一个二进制分帧层。在二进制分帧层上,HTTP2.0会将所有传输的信息分为更小的消息和帧,并采用二进制格式编码,其中HTTP1.x的首部信息会被封装到Headers帧,而Request Body则封装到Data帧。
在 HTTP/2 中,所有通信都在一个 TCP 连接
上进行,并被分割成更小的二进制帧
。这些帧按序列号发送和接收
,并在接收端重新组装成完整的消息
。这一层的实现为 HTTP/2 带来了显著的性能改进。
所以http2和http1.1互相不理解(但是应用无需感知这些变化,客户端和服务器会帮我们执行所有底层的动作)
HTTP/2 中的帧、消息和流
1. 帧(Frame)
定义和作用
:
- 定义:帧是 HTTP/2 协议中的
最小单位
。所有的 HTTP/2 通信都通过帧进行。每个
帧都包含
一个固定长度的头部(标识所属于的stream流)
和一个可变长度的负载 - 作用:
帧
是 HTTP/2 协议实现多路复用
的基础,通过帧的分割和重组,能够在单个连接上并行传输多个请求和响应
特点
:
- 头部:固定为 9 字节,包含长度、类型、标志和流标识符等信息。
- 负载:可变长度,具体内容根据帧的类型不同而有所变化。
常见类型
:
- DATA 帧:传输消息主体。
- HEADERS 帧:传输头部信息。
- PRIORITY 帧:设置流的优先级。
- RST_STREAM 帧:重置流。
- SETTINGS 帧:协商连接参数。
- PUSH_PROMISE 帧:服务器推送资源。
- PING 帧:检查连接的连通性。
- GOAWAY 帧:通知对端即将关闭连接。
- WINDOW_UPDATE 帧:进行流量控制。
2. 消息(Message)
定义和作用
:
- 定义:消息是由一组帧组成的完整的逻辑请求或响应。在 HTTP/2 中,消息通常包含一个 HEADERS 帧后跟一个或多个 DATA 帧(
一个完整的帧序列,用来映射到逻辑的请求或者响应信息
) - 作用: HTTP 协议的基本单元,用于传递客户端和服务器之间的请求和响应。通过将消息分割成多个帧,HTTP/2 能够更有效地传输和管理数据
特点
:
- 组成:
HEADERS 帧 + (可选的)多个 DATA 帧
。 - 逻辑完整性:
消息
表示一个完整的 HTTP 请求或响应
,包含所有必要的头部和主体信息。
3. 流(Stream)
定义和作用
:
- 定义:流是 HTTP/2 中的一个
独立的、双向的字节流
,包含多个帧
。每个流都有一个唯一的标识符
,用于区分同一连接上的不同流(在一个建立连接内的双向字节流,能承载一个或者多个消息
)(TCP连接中的一个虚拟通道,可以承载双向的消息
) - 作用:流是 HTTP/2 实现
多路复用的关键
,通过在一个连接上同时存在多个流,可以并行处理多个请求和响应,避免了HTTP/1.1 的队头阻塞
问题。
特点
:
- 双向性:流可以在客户端和服务器之间双向传输数据(
真正意义的全双工
) - 唯一标识符:每个流都有一个唯一的 31 位标识符,客户端和服务器使用
奇偶数区分流的来源(客户端创建的流为奇数,服务器创建的流为偶数)
。 - 优先级:流可以设置优先级,以优化资源分配和响应时间。
@总结
所有通信都在一个TCP连接上进行,该连接可以承载任意数量的双向流(streams)(一个流,一次请求与响应)
每个流都有一个唯一的标识符和可选的优先级信息,用于承载双向消息
每条消息是一个逻辑上的HTTP消息,例如请求或响应,由一个或多个帧组成
帧是通信的最小单位,承载特定类型的数据,例如HTTP头部、消息负载等。来自不同流的帧可以交替发送,并通过每个帧头部中的嵌入流ID标识符重新组装
示例:
- 客户端发送请求:客户端发送一个包含 HEADERS 帧和多个 DATA 帧的消息。消息被分割成多个帧,并通过流 1 传输。
- 服务器响应请求:服务器通过流 1 发送一个包含 HEADERS 帧和多个 DATA 帧的消息作为响应。
- 并行请求:客户端可以通过流 3 和流 5 同时发送其他请求,服务器可以通过相应的流进行响应。
二进制帧结构
帧的组成部分
- 帧头部(9 字节)
- 帧负载数据(可变长度)
+-----------------------------------------------+
| Length (24) |
+---------------+---------------+---------------+
| Type (8) | Flags (8) |
+---------------+---------------+---------------+
|R| Stream Identifier (31) |
+=+=============================================+
| Frame Payload |
+-----------------------------------------------+
1.帧头部结构
帧头部固定为 9 字节,由以下字段组成:
- 长度(Length)(3 字节), 表示帧负载数据的长度,确保接收方能正确读取和处理帧数据。它的值范围是 0 到 16,383(2^14 - 1)
- 类型(Type)(1 字节)表示帧的类型,接收方能够按照特定帧类型的规则处理该帧
常见帧类型:
- 0x0:DATA 帧
- 0x1:HEADERS 帧
- 0x2:PRIORITY 帧
- 0x3:RST_STREAM 帧
- 0x4:SETTINGS 帧
- 0x5:PUSH_PROMISE 帧
- 0x6:PING 帧
- 0x7:GOAWAY 帧
- 0x8:WINDOW_UPDATE 帧
- 标志(Flags)(1 字节),表示该帧的一些特殊属性,提供附加信息,如是否是最后一个帧(END_STREAM),是否包含头部(END_HEADERS),是否包含优先级信息(PRIORITY)
- 常见标志位:
- 0x1:END_STREAM,表示这是流的最后一个帧。
- 0x4:END_HEADERS,表示 HEADERS 帧的结束。
- 0x20:PRIORITY,表示包含优先级信息。
- 流标识符(Stream Identifier)(4 字节)
帧所属的流的唯一标识符
,该帧所属的流,以便接收方将帧数据归属到正确的流中。流标识符是一个 31 位的无符号整数,最高位保留,必须设置为 0。
2.帧负载数据
帧负载数据的长度和内容根据帧类型的不同而变化。以下是一些常见帧类型的负载数据示例:
-
DATA 帧:
- 负载数据:实际传输的数据(如 HTML 内容、二进制数据)。
- 特殊字段:可能包含 PADDED 数据(填充字节)。
-
HEADERS 帧:
- 负载数据:包含头部字段的压缩表示(使用 HPACK 算法)。
- 特殊字段:可能包含 PRIORITY 信息和 PADDED 数据。
-
PRIORITY 帧:
- 负载数据:包含优先级信息,如依赖的流标识符和权重。
-
SETTINGS 帧:
- 负载数据:包含连接的配置信息,如最大帧大小、最大并发流数等。
-
PING 帧:
- 负载数据:包含一个 8 字节的不可变数据,用于检测连接的连通性。
请求和响应多路复用
使用 HTTP/1.x 时,如果客户端想要发出多个并行请求以提高性能,则必须使用多个 TCP 连接。这是 HTTP/1.x 传送模型的直接结果,该行为可确保每个连接一次只传送一个响应(响应排队)。更糟糕的是,这也会导致队首阻塞(http1.x队头阻塞)
,以及底层 TCP 连接的效率低下。
HTTP/2 中新的二进制分帧层消除了这些限制并实现了完整的请求和响应多路复用,方法是允许客户端和服务器将 HTTP 消息分解为独立的帧,交错发送,然后在另一端重新组装这些帧
。
该快照捕捉了同一连接内传输的多个数据流。客户端正在向服务器传输 DATA 帧(流 5),而服务器正在将交错的帧序列发送到客户端,以便流 1 和流 3。因此,正在传输三个并行流
。
能够将 HTTP 消息分解为独立的帧,交错这些帧
,然后在另一端重新组装这些帧
,是 HTTP/2 最重要的增强功能。事实上,它在所有 Web 技术的整个堆栈中带来了众多性能优势的连锁效应,使我们能够:
- 并行交错地发送多个请求,请求之间互不影响。
- 并行交错地发送多个响应,响应之间互不影响。
- 使用一个连接并行发送多个请求和响应。
- 消除不必要的延迟并提高可用网络容量的利用率,从而缩短网页加载时间。
- 在HTTP1.x中,我们是通过文本的方式传输数据。基于文本的方式传输数据存在很多缺陷,文本的表现形式有多样性,因此要做到
健壮性
考虑的场景必然有很多,但是二进制则不同,只有0和1的组合,因此选择了二进制传输,实现方便且健壮。
相关文章:

http/2 二进制分帧层 (Binary Framing Layer)讲解
文章目录 二进制帧HTTP/2 中的帧、消息和流1. 帧(Frame)2. 消息(Message)3. 流(Stream)总结示例: 二进制帧结构1.帧头部结构2.帧负载数据 请求和响应多路复用 链接参考:https://web.…...
Mybatis分页查询,同时返回total
在垃圾项目中一般都是使用mybatis plus自动返回Page,但是涉及到多表联合或者等等情况最终还是要使用mybatis进行手写sql查询,所以有此文章以便后续使用查询. 首先mysql需要支持多条查询语句,在mysql配置url后加上: &allowMultiQueriestrue&useAffectedRowstrue Mapper…...
JDK17新增语法特征
1、引言 Spring Boot 3.0 开始不再支持 JDK 8,转而支持 JDK 17。 这篇博客我会列举较常用的新语法特性。 2、新增语法特征 2.1 yield关键字 从Java13开始引⼊yield关键字,yield关键字应用于switch语句中,我们可以使用yield来简化代码。 正常的…...

2748. 美丽下标对的数目(Rust暴力枚举)
题目 给你一个下标从 0 开始的整数数组 nums 。如果下标对 i、j 满足 0 ≤ i < j < nums.length ,如果 nums[i] 的 第一个数字 和 nums[j] 的 最后一个数字 互质 ,则认为 nums[i] 和 nums[j] 是一组 美丽下标对 。 返回 nums 中 美丽下标对 的总…...
Vue中双向数据绑定是如何实现的
在 Vue.js 中,双向数据绑定(也称为响应式系统)是通过其内部实现的一个系统来实现的,该系统可以追踪数据的变化,并在数据变化时自动更新 DOM。Vue 使用了一种称为“观察者-订阅者”的模式来实现这一点。 以下是 Vue 双…...
桌面云和云桌面的区别联系
桌面云和云桌面是两个相关但不完全相同的概念。桌面云是一种基于云计算技术的解决方案,将用户的桌面环境(包括操作系统、应用程序和数据)移至云端进行管理和交付,而云桌面是在服务器上虚拟化的桌面环境,用户通过网络连…...

ECMAScript6介绍及环境搭建
这实际上说明,对象的解构赋值是下面形式的简写。 let { foo: foo, bar: bar } { foo: ‘aaa’, bar: ‘bbb’ }; 也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而…...
什么是Azure OpenAI?
Azure OpenAI 是微软与 OpenAI 合作推出的人工智能服务,旨在通过 Azure 云平台提供 OpenAI 的先进模型和技术。这个服务允许开发者和企业使用 OpenAI 的强大语言模型(如 GPT-3、Codex 和 DALL-E 等)来创建智能应用和解决方案。以下是一些主要…...

一个易于使用、与Android系统良好整合的多合一游戏模拟器
大家好,今天给大家分享的是一个易于使用、与Android系统良好整合的多合一游戏模拟器 Lemuroid。 Lemuroid 是一个专为Android平台设计的开源游戏模拟器项目,它基于强大的Libretro框架,旨在提供广泛的兼容性和卓越的用户体验。 项目介绍 Lem…...
java spring注解的使用
Java Spring框架中的注解用于简化代码的编写和配置工作。它们提供了一种简洁、强大和灵活的方式来定义和配置Spring应用程序。 下面是一些常用的Java Spring注解的使用示例: Component: 标记一个类为Spring容器管理的Bean,可用于任何类。 Component p…...

什么是数据同步?数据同步时发生中断怎么办?
数据同步是将数据从一个系统或平台复制到另一个系统或平台的过程。在现代信息化时代,数据同步变得越来越重要,因为组织需要在不同的系统之间共享数据,并确保数据的准确性和一致性。本文将介绍什么是数据同步以及数据同步中常出现的问题&#…...

HarmonyOS Next开发学习手册——ExtensionAbility
概述 EmbeddedUIExtensionAbility 是EMBEDDED_UI类型的ExtensionAbility组件,提供了跨进程界面嵌入的能力。 EmbeddedUIExtensionAbility需要和 EmbeddedComponent 一起配合使用,开发者可以在UIAbility的页面中通过EmbeddedComponent嵌入本应用的Embed…...
如何开发企业微信SCRM
企业微信SCRM(Social Customer Relationship Management)是一种用于管理和优化企业与客户关系的工具,它整合了社交媒体和CRM系统,帮助企业更有效地跟进销售线索、提供客户服务和进行市场营销。以下是开发企业微信SCRM的一些关键步…...
Java中的标准注解与数据校验:深入解析与实例
目录 Java中的标准注解与数据校验:深入解析与实例1. 基础校验注解NonNullNotBlankSize 2. 数值校验注解Min & MaxPositive & Negative 3. 枚举与模式匹配自定义注解示例(概念性展示) 4. 自定义校验逻辑结论 Java中的标准注解与数据校…...

模型泛化性测试
文章目录 准备工作场景描述训练数据集获取与训练 测试结论测试方案外机进行平移外机进行旋转外机即平移又旋转该螺纹孔位置 准备工作 场景描述 场景搭建如下如所示: 在该场景中,将机器人安置在桌子左上角处(以面对显示器的视野)…...
智能推荐系统:技术解析与实践指南
智能推荐系统:技术解析与实践指南 背景与挖掘目标 在互联网信息爆炸的今天,用户在海量内容中筛选感兴趣的信息变得日益困难。因此,搜索引擎结合推荐系统的模式应运而生。本章节将深入探讨推荐系统,其核心目标如下: …...

盛元广通数字孪生智能集控实验室管理系统
盛元广通数字孪生智能集控实验室管理系统可广泛应用于各类实验室场景,包括科研实验室、教学实验室、工业实验室等。通过实时监测、预测性维护、故障诊断与优化等功能,该系统能够提高实验室的运行效率、安全性和可靠性,降低运维成本。设计直观…...
Spring Boot 优雅进行数据脱敏
文详细解析在Spring Boot应用中优雅地脱敏敏感信息,如手机号、邮箱、身份证等,使用的是Jackson库中的JsonSerializer。 1. 创建自定义脱敏序列化器 首先,创建一个继承自JsonSerializer<String>的序列化器。以MobileSerializer为例&am…...
Vue3 条件语句
Vue3 条件语句 在Vue.js 3.x版本中,条件语句是一种常用的功能,用于根据特定条件渲染不同的DOM元素。Vue提供了几种方式来实现条件渲染,包括v-if、v-else-if、v-else以及v-show。本文将详细介绍这些条件语句的用法,并通过示例来展…...
小白想要快速学好office办公软件,主要学习以下几个方面?
Office办公软件培训通常包括以下几个核心内容: 1.**Word文档处理**:学习如何创建、编辑、格式化文本,插入图片、表格和图表,调整页面布局和样式,以及进行文档打印和共享。 2.**Excel电子表格**:掌握如…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...