当前位置: 首页 > 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;掌握如…...

【Linux文件系统】被打开的文件与文件系统的文件之间的关联刨析总结

操作系统管理物理内存以及与外设磁盘硬件进行数据的交换 操作系统如何管理物理内存呢&#xff1f; 其实操作系统内核先对内存先描述再组织的&#xff01;操作系统管理内存的基本单位是4KB&#xff0c;操作系统会为每一个4KB大小的物理内存块创建一个描述该4KB内存块的struct pa…...

爱迪特两年创业板上市路:销售费用率远高同行,侵权风险引关注

《港湾商业观察》施子夫 王璐 从2022年4月7日就冲刺创业板的爱迪特&#xff08;秦皇岛&#xff09;科技股份有限公司&#xff08;以下简称&#xff0c;爱迪特&#xff09;&#xff0c;预计将很快登陆资本市场。 爱迪特日前披露中签结果&#xff1a;本次发行股份数量为约1902…...

SQLite 与 Python:集成与使用

SQLite 与 Python:集成与使用 SQLite 是一种轻量级的数据库管理系统,而 Python 是一种广泛使用的高级编程语言。这两种技术可以很好地结合在一起,为开发者提供强大的数据管理能力。本文将探讨如何在 Python 中集成和使用 SQLite,包括基本概念、安装过程、关键函数以及实际…...

【vue scrollTo 数据无限滚动 】

vue数据无限滚动 参考来源 Vue3 实现消息无限滚动的新思路 —— 林三心不学挖掘机 完整代码中项目中使用了vuetify&#xff0c;估div内的class会代表了对应的样式&#xff0c;根据需要自行删减。 功能实现主要依赖js代码部分。 鼠标悬浮停止滚动&#xff0c;鼠标离开恢复滚动在…...

MinIO在Linux环境中的使用

MinIO 是一个高性能的对象存储服务&#xff0c;兼容 Amazon S3 API。它设计用于大规模数据存储&#xff0c;可以很好地处理大数据集和高并发请求。如果你想在 Linux 系统上安装 MinIO&#xff0c;并开放必要的端口以便外部访问。 Vmware下载安装和linux安装这里就不在赘述了&a…...

免费内网穿透工具 ,快解析内网穿透解决方案

在IPv4公网IP严重不足的环境下&#xff0c;内网穿透技术越来越多的被人们所使用&#xff0c;使用内网穿透技术的好处有很多。 1&#xff1a;无需公网ip 物以稀为贵&#xff0c;由于可用的公网IP地址越来越少&#xff0c;价格也是水涨船高&#xff0c;一个固定公网IP一年的成本…...

踩坑——VS添加相对路径

需求&#xff1a;我需要将模型放到程序里面。 过程&#xff1a;附加包含目录添加目录&#xff0c;发现找不到onnx模型文件。我就想是不是相对路径不对&#xff0c;该来搞去都不对。 解决办法&#xff1a; 相对路径值得是运行程序的当下环境&#xff0c;什么是运行程序呢&…...

HTML【介绍】

HTML【介绍】 一、Web认知 1.网页组成 文字、图片、音频、视频、超链接 2.五大浏览器 IE浏览器、火狐浏览器&#xff08;Firefox&#xff09;、谷歌浏览器&#xff08;Chrome&#xff09;、Safari浏览器、欧朋浏览器&#xff08;Opera&#xff09; 3.Web标准的构成 HTML…...

网络安全:Web 安全 面试题.(XSS)

网络安全&#xff1a;Web 安全 面试题.&#xff08;XSS&#xff09; 网络安全面试是指在招聘过程中,面试官会针对应聘者的网络安全相关知识和技能进行评估和考察。这种面试通常包括以下几个方面&#xff1a; &#xff08;1&#xff09;基础知识:包括网络基础知识、操作系统知…...

Ubuntu网络管理命令:netstat

安装Ubuntu桌面系统&#xff08;虚拟机&#xff09;_虚拟机安装ubuntu桌面版-CSDN博客 顾名思义&#xff0c;netstat命令不是用来配置网络的&#xff0c;而是用来查看各种网络信息的&#xff0c;包括网络连接、路由表以及网络接口的各种统计数据等。 netstat命令的基本语法如…...