http/2 二进制分帧层 (Binary Framing Layer)讲解

news2024/11/27 8:39:48

文章目录

  • 二进制帧
  • 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://www.coloradmin.cn/o/1848733.html

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

相关文章

C#修改 EXE 文件图标和 winForm 窗口图标

修改 EXE 文件图标 1.准备好图片,转换为 Icon 图片; 2.右键工程,选择属性; 3.选择 Icon 图标即可; 4.重新生成可执行文件,查看。 修改 winForm 窗口图标 1.选中 winForm ,查看属性&#x…

天马学航——智慧教务系统(移动端)开发日志三

天马学航——智慧教务系统(移动端)开发日志三 日志摘要:更新了学生选课模块、我的课程模块以及退课的功能,优化了后端数据库的缓存 1、学生选课模块 学生选课模块主要实现,学生根据需求进行选课操作,通过后端查询到所有教师的课…

mysql 主从延迟

mysql 主从延迟 精华推荐 | 【MySQL技术专题】「主从同步架构」全面详细透析MySQL的三种主从复制(Replication)机制的原理和实战开发(原理实战) https://blog.csdn.net/l569590478/article/details/128329929 mysql主从之多线程复…

Nuxt 3 路由系统详解:配置与实践指南

title: Nuxt 3 路由系统详解:配置与实践指南 date: 2024/6/21 updated: 2024/6/21 author: cmdragon excerpt: 摘要:本文是一份关于Nuxt 3路由系统的详尽指南。它从介绍Nuxt 3的基本概念开始,包括Nuxt 3与Nuxt 2的区别和选择Nuxt 3的理由。…

创建OpenWRT虚拟机

环境:Ubuntu 2204,VM VirtualBox 7.0.18 安装必备软件包: sudo apt update sudo apt install subversion automake make cmake uuid-dev gcc vim build-essential clang flex bison g gawk gcc-multilib g-multilib gettext git libncurses…

供应链投毒预警 | utilitytool系列Py包开展XenoRAT远控木马投毒

概述 上周(2024年6月14号),悬镜供应链安全情报中心在Pypi官方仓库(https://pypi.org/)中捕获2起针对Windows系统的Python包投毒事件,涉及Python组件包utilitytool及utilitytools,投毒者&#x…

C++开发基础之频繁使用`std::endl`可能导致性能问题

前言 你是否曾经注意过这个问题,频繁使用std::endl可能导致性能问题。在C开发中,许多开发者习惯于使用std::endl来换行输出并刷新缓冲区。然而,这种习惯性操作可能会在高频率输出场景中带来显著的性能瓶颈。接下来,我们将深入探讨…

2.XSS-存储型

储存型XSS 或持久型 XSS 交互的数据会被存在在数据库里面,永久性存储,具有很强的稳定性。 在留言板里面进行测试一下是否有做过滤 "<>?&66666点击提交 查看元素代码&#xff0c;已经提交完成&#xff0c;并且没有做任何的过滤措施 接下来写一个javascrip…

由于没有远程桌面授权服务器怎么办?

在现代的工作环境中&#xff0c;远程访问和远程桌面控制已经成为一项日益重要的需求。随着企业和组织的扩张&#xff0c;人们经常需要在不同的地点之间共享文件和应用程序。由于缺乏远程桌面授权服务器&#xff0c;这一过程可能会变得困难和不安全。 远程桌面授权服务器是一种…

MGV电源维修KUKA机器人电源模块PH2003-4840

MGV电源维修 库卡电源模块维修 机器人电源模块维修 库卡控制器维修 KUKA电源维修 库卡机器人KUKA主机维修 KUKA驱动器模块维修 机械行业维修&#xff1a;西门子系统、法那克系统、沙迪克、FIDIA、天田、阿玛达、友嘉、大宇系统&#xff1b;数控冲床、剪板机、折弯机等品牌数控…

gbase8s之Encoding or code set not supported

如图发生以下错误&#xff1a; 解决办法&#xff1a;在url里加上ifx_use_strenctrue 就可以了 参数解释&#xff1a;

【PS】提取手写签名

准备工具&#xff1a; 纸张&#xff1a;用于承载签名&#xff1b; 笔&#xff1a;用于签名&#xff1b; 手机&#xff1a;用于拍摄签名&#xff1b; Adobe Photoshop 版本: 12.0.3 (12.0.3x20101211 [20101211.r.1222 2010/12/11:02:00:00 cutoff; r branch]) x32&#xff1a;用…

Nacos安装教程(很细很简单),解决启动报错Please set the JAVA_HOME

nacos安装 找到你要下载的版本解压到任意非中文目录下端口默认8848&#xff0c;如有端口冲突&#xff0c;可修改配置文件中的端口。编辑shutdown.cmd文件&#xff0c;路径换成你的jdk安装地址否则会报错Please set the JAVA_HOME variable in your environment, We need java(x…

AI在线免费视频工具2:视频配声音;图片说话hedra

1、视频配声音 https://deepmind.google/discover/blog/generating-audio-for-video/ https://www.videotosoundeffects.com/ &#xff08;免费在线使用&#xff09; 2、图片说话在线图片生成播报hedra hedra 上传音频与图片即可合成 https://www.hedra.com/ https://www.…

国产化操作系统杂谈

目录 操作系统国产化背景国产化操作系统名录优秀操作系统介绍1.深度Linux&#xff08;deepin&#xff09;2.FydeOS3.AliOS&#xff08;openAliOS&#xff09;4.openEuler5.红旗Linux6. startOS 总结 操作系统国产化背景 官方的说法是为了打破长期以来国外对中国的操作系统的垄…

【for循环】水仙花数

【for循环】水仙花数 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 【参考代码】 #include <iostream> using namespace std; int main(){ for(int abc 100; abc<999; abc){// 获取范围内所有的数字 int c abc%10; //获取个位 int b abc%10…

场外个股期权怎么看涨跌情况?怎么判断是选涨还是选跌?

今天带你了解场外个股期权怎么看涨跌情况&#xff1f;怎么判断是选涨还是选跌&#xff1f;在期权市场中&#xff0c;投资者想要在其中获得盈利&#xff0c;学会判断涨跌是期权投资者赚钱路上要走的第一步。 判断场外个股期权的涨跌情况主要可以从以下几个方面入手&#xff1a; …

如何去除VisualStudioCode最新版本出现的两条横线

作为一个对频繁更新有些抗拒的人&#xff0c;我曾多次遇到在更新后出现莫名问题的情况。然而&#xff0c;由于最近一次更新已经有一段时间了&#xff0c;我觉得或许这次会带来一些更好的设计或其他改进。于是&#xff0c;我决定更新Visual Studio Code&#xff0c;并分享一下我…

数据结构5---矩阵和广义表

一、矩阵的压缩存储 特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律。 稀疏矩阵:矩阵中有很多零元素。压缩存储的基本思想是: (1)为多个值相同的元素只分配一个存储空间; (2)对零元素不分配存储空间。 1、特殊矩阵的压缩存储 &#xff08;1&#xff09;对称矩…

vue3爷孙组件通信——provide和inject

父组件中提供数据&#xff0c;并在子组件中注入这些数据&#xff0c;从而实现了组件之间的数据传递。可用于兄弟组件通信&#xff0c;爷孙组件通信&#xff0c;父子通信。 provide( ‘注入名’, 注入值" ) 和 inject(‘注入名’) 第一代组件&#xff1a; <template>…