当前位置: 首页 > news >正文

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 同时发送其他请求,服务器可以通过相应的流进行响应。

二进制帧结构

帧的组成部分

  1. 帧头部(9 字节)
  2. 帧负载数据(可变长度)
+-----------------------------------------------+
|                 Length (24)                   |
+---------------+---------------+---------------+
|   Type (8)    |   Flags (8)   |
+---------------+---------------+---------------+
|R|           Stream Identifier (31)            |
+=+=============================================+
|                  Frame Payload                |
+-----------------------------------------------+

1.帧头部结构

帧头部固定为 9 字节,由以下字段组成:

  1. 长度(Length)(3 字节), 表示帧负载数据的长度,确保接收方能正确读取和处理帧数据。它的值范围是 0 到 16,383(2^14 - 1)
  2. 类型(Type)(1 字节)表示帧的类型,接收方能够按照特定帧类型的规则处理该帧

常见帧类型

  • 0x0:DATA 帧
  • 0x1:HEADERS 帧
  • 0x2:PRIORITY 帧
  • 0x3:RST_STREAM 帧
  • 0x4:SETTINGS 帧
  • 0x5:PUSH_PROMISE 帧
  • 0x6:PING 帧
  • 0x7:GOAWAY 帧
  • 0x8:WINDOW_UPDATE 帧
  1. 标志(Flags)(1 字节),表示该帧的一些特殊属性,提供附加信息,如是否是最后一个帧(END_STREAM),是否包含头部(END_HEADERS),是否包含优先级信息(PRIORITY)
  • 常见标志位
  • 0x1:END_STREAM,表示这是流的最后一个帧。
  • 0x4:END_HEADERS,表示 HEADERS 帧的结束。
  • 0x20:PRIORITY,表示包含优先级信息。
  1. 流标识符(Stream Identifier)(4 字节)帧所属的流的唯一标识符,该帧所属的流,以便接收方将帧数据归属到正确的流中。流标识符是一个 31 位的无符号整数,最高位保留,必须设置为 0。

2.帧负载数据

帧负载数据的长度和内容根据帧类型的不同而变化。以下是一些常见帧类型的负载数据示例:

  1. DATA 帧

    • 负载数据:实际传输的数据(如 HTML 内容、二进制数据)。
    • 特殊字段:可能包含 PADDED 数据(填充字节)。
  2. HEADERS 帧

    • 负载数据:包含头部字段的压缩表示(使用 HPACK 算法)。
    • 特殊字段:可能包含 PRIORITY 信息和 PADDED 数据。
  3. PRIORITY 帧

    • 负载数据:包含优先级信息,如依赖的流标识符和权重。
  4. SETTINGS 帧

    • 负载数据:包含连接的配置信息,如最大帧大小、最大并发流数等。
  5. 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 &#xff0c;如果 nums[i] 的 第一个数字 和 nums[j] 的 最后一个数字 互质 &#xff0c;则认为 nums[i] 和 nums[j] 是一组 美丽下标对 。 返回 nums 中 美丽下标对 的总…...

Vue中双向数据绑定是如何实现的

在 Vue.js 中&#xff0c;双向数据绑定&#xff08;也称为响应式系统&#xff09;是通过其内部实现的一个系统来实现的&#xff0c;该系统可以追踪数据的变化&#xff0c;并在数据变化时自动更新 DOM。Vue 使用了一种称为“观察者-订阅者”的模式来实现这一点。 以下是 Vue 双…...

桌面云和云桌面的区别联系

桌面云和云桌面是两个相关但不完全相同的概念。桌面云是一种基于云计算技术的解决方案&#xff0c;将用户的桌面环境&#xff08;包括操作系统、应用程序和数据&#xff09;移至云端进行管理和交付&#xff0c;而云桌面是在服务器上虚拟化的桌面环境&#xff0c;用户通过网络连…...

ECMAScript6介绍及环境搭建

这实际上说明&#xff0c;对象的解构赋值是下面形式的简写。 let { foo: foo, bar: bar } { foo: ‘aaa’, bar: ‘bbb’ }; 也就是说&#xff0c;对象的解构赋值的内部机制&#xff0c;是先找到同名属性&#xff0c;然后再赋给对应的变量。真正被赋值的是后者&#xff0c;而…...

什么是Azure OpenAI?

Azure OpenAI 是微软与 OpenAI 合作推出的人工智能服务&#xff0c;旨在通过 Azure 云平台提供 OpenAI 的先进模型和技术。这个服务允许开发者和企业使用 OpenAI 的强大语言模型&#xff08;如 GPT-3、Codex 和 DALL-E 等&#xff09;来创建智能应用和解决方案。以下是一些主要…...

一个易于使用、与Android系统良好整合的多合一游戏模拟器

大家好&#xff0c;今天给大家分享的是一个易于使用、与Android系统良好整合的多合一游戏模拟器 Lemuroid。 Lemuroid 是一个专为Android平台设计的开源游戏模拟器项目&#xff0c;它基于强大的Libretro框架&#xff0c;旨在提供广泛的兼容性和卓越的用户体验。 项目介绍 Lem…...

java spring注解的使用

Java Spring框架中的注解用于简化代码的编写和配置工作。它们提供了一种简洁、强大和灵活的方式来定义和配置Spring应用程序。 下面是一些常用的Java Spring注解的使用示例&#xff1a; Component: 标记一个类为Spring容器管理的Bean&#xff0c;可用于任何类。 Component p…...

什么是数据同步?数据同步时发生中断怎么办?

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

HarmonyOS Next开发学习手册——ExtensionAbility

概述 EmbeddedUIExtensionAbility 是EMBEDDED_UI类型的ExtensionAbility组件&#xff0c;提供了跨进程界面嵌入的能力。 EmbeddedUIExtensionAbility需要和 EmbeddedComponent 一起配合使用&#xff0c;开发者可以在UIAbility的页面中通过EmbeddedComponent嵌入本应用的Embed…...

如何开发企业微信SCRM

企业微信SCRM&#xff08;Social Customer Relationship Management&#xff09;是一种用于管理和优化企业与客户关系的工具&#xff0c;它整合了社交媒体和CRM系统&#xff0c;帮助企业更有效地跟进销售线索、提供客户服务和进行市场营销。以下是开发企业微信SCRM的一些关键步…...

Java中的标准注解与数据校验:深入解析与实例

目录 Java中的标准注解与数据校验&#xff1a;深入解析与实例1. 基础校验注解NonNullNotBlankSize 2. 数值校验注解Min & MaxPositive & Negative 3. 枚举与模式匹配自定义注解示例&#xff08;概念性展示&#xff09; 4. 自定义校验逻辑结论 Java中的标准注解与数据校…...

模型泛化性测试

文章目录 准备工作场景描述训练数据集获取与训练 测试结论测试方案外机进行平移外机进行旋转外机即平移又旋转该螺纹孔位置 准备工作 场景描述 场景搭建如下如所示&#xff1a; 在该场景中&#xff0c;将机器人安置在桌子左上角处&#xff08;以面对显示器的视野&#xff09…...

智能推荐系统:技术解析与实践指南

智能推荐系统&#xff1a;技术解析与实践指南 背景与挖掘目标 在互联网信息爆炸的今天&#xff0c;用户在海量内容中筛选感兴趣的信息变得日益困难。因此&#xff0c;搜索引擎结合推荐系统的模式应运而生。本章节将深入探讨推荐系统&#xff0c;其核心目标如下&#xff1a; …...

盛元广通数字孪生智能集控实验室管理系统

盛元广通数字孪生智能集控实验室管理系统可广泛应用于各类实验室场景&#xff0c;包括科研实验室、教学实验室、工业实验室等。通过实时监测、预测性维护、故障诊断与优化等功能&#xff0c;该系统能够提高实验室的运行效率、安全性和可靠性&#xff0c;降低运维成本。设计直观…...

Spring Boot 优雅进行数据脱敏

文详细解析在Spring Boot应用中优雅地脱敏敏感信息&#xff0c;如手机号、邮箱、身份证等&#xff0c;使用的是Jackson库中的JsonSerializer。 1. 创建自定义脱敏序列化器 首先&#xff0c;创建一个继承自JsonSerializer<String>的序列化器。以MobileSerializer为例&am…...

Vue3 条件语句

Vue3 条件语句 在Vue.js 3.x版本中&#xff0c;条件语句是一种常用的功能&#xff0c;用于根据特定条件渲染不同的DOM元素。Vue提供了几种方式来实现条件渲染&#xff0c;包括v-if、v-else-if、v-else以及v-show。本文将详细介绍这些条件语句的用法&#xff0c;并通过示例来展…...

小白想要快速学好office办公软件,主要学习以下几个方面?

Office办公软件培训通常包括以下几个核心内容&#xff1a; 1.**Word文档处理**&#xff1a;学习如何创建、编辑、格式化文本&#xff0c;插入图片、表格和图表&#xff0c;调整页面布局和样式&#xff0c;以及进行文档打印和共享。 2.**Excel电子表格**&#xff1a;掌握如…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...