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的组合,因此选择了二进制传输,实现方便且健壮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/753038.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法设计与分析--考试真题

分布式算法试题汇总选择题简答题算法题 2013级试题2019级试题2021年秋考卷 根据考试范围找相应题目做。 分布式算法试题汇总 选择题 下述说法错误的是___ A 异步系统中的消息延迟是不确定的 B 分布式算法的消息复杂性是指在所有合法的执行上发送消息总数的最大值 C 在一个异步…

深入探索Java开发世界:Redis~类型分析大揭秘

文章目录 深入探索Java开发世界:Redis~类型分析大揭秘一、数据结构类型二、分布式锁类型三、事物命令类型四、事物三大特性类型 深入探索Java开发世界:Redis~类型分析大揭秘 Redis数据库基础知识,类型知识点梳理~ 一、数据结构类型 Redis是一…

PHP语言学习02

好久不见&#xff0c;学如逆水行舟&#xff0c;不进则退&#xff0c;真是这样。。。突然感觉自己有点废。。。 <?php phpinfo(); ?> 新生第一个代码。 要想看到运行结果&#xff0c;打开浏览器&#xff08;127.0.0.1/start/demo01.php&#xff09; 其中&#xff0c…

揭开免费可视化工具流行背后的原因

免费可视化工具为什么越来越受欢迎&#xff1f;在大数据时代&#xff0c;数据可视化已经成为各行各业的重要工具。它不仅帮助企业和个人更直观地理解数据&#xff0c;还在决策过程中起到关键作用。尽管市场上有许多付费的数据可视化工具&#xff0c;但免费工具的受欢迎程度却在…

面试准备算法

枚举 答案肯定是字符串的某个前缀&#xff0c;然后简单直观的想法是枚举所有前缀来判断&#xff0c;设前缀长度lenz&#xff0c;前缀串的长度必然要是两个字符串长度的约数才能满足条件。 可以枚举长度&#xff0c;再去判断这个前缀串拼接若干次以后是否等于str1和str2。 cla…

高德地图基于Three开发三维流动管线。

先看效果 废话少说直接上干货,整体思路通过高德地图的GLCustomLayer图层加载Three三维管线。 第一步将管线经纬度转成三维空间经纬度 GLCustomLayer = new (window as any).AMap.GLCustomLayer({zIndex: 120,visible: true,init: (gl: any) => {initThree(gl);// burialDe…

idea Error running ‘Application‘

1、Error running ‘Application’ Error running ApplicationError running Application. Command line is too long.Shorten the command line via JAR manifest or via a classpath file and rerun.找到 .idea/libraies/workspace.xml 中的 PropertiesComponent 属性&#…

ICRA 2024 混变刚度的仿人软体手指实现多模式抓取

ICRA 2024 发表了"用于多模式抓取的具有混合可变刚度机制的仿生软指 "的研究工作。核心思想是利用记忆合金的形状记忆效应&#xff0c;构建结构简化、功能多样的柔性手指&#xff0c;从而实现更高效的多模式抓取。 与传统的刚性夹爪相比&#xff0c;柔性软体夹爪具有…

阿里巴巴找黄金宝箱(IV)

系列文章目录 本人最近再练习算法&#xff0c;所以会发布自己的解题思路&#xff0c;希望大家多指教 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 一、题目描述 贫如洗的椎夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现…

CICD相关概念简单理解——筑梦之路

CI/CD 是现代软件开发流程中的关键实践&#xff0c;它代表着持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09;的组合。这些实践旨在帮助软件开发团队更…

Java学习 (五) 面向对象--包概念、封装、构造器

一、 package &#xff08;包&#xff09; package 包 用于指定该文件中定义的类、接口等结构 像我们之前练习的代码&#xff0c;在顶部并没有定义package的关键字&#xff0c;这种就属于无名包 1、包 &#xff08;java 库&#xff09; 在java中的包&#xff0c;是一堆类和接…

2024我们该学习大模型吗?

一、引言 在快速变化的科技行业中&#xff0c;人工智能&#xff08;AI&#xff09;大模型已成为研究和应用的热点。随着AI技术的不断进步&#xff0c;特别是在自然语言处理、计算机视觉和机器学习平台等领域&#xff0c;许多专业人士开始将目光投向AI大模型的开发和应用。 二…

Linux挂载Windows共享文件

一、Windows共享目录 二、Linux挂载 yum install cifs-utils mkdir /aaa/ mount.cifs -o usernamexxx,passwordxxx //172.16.8.121/aaa /aaa/

【机器学习】在【PyCharm中的学习】:从【基础到进阶的全面指南】

目录 第一步&#xff1a;基础准备 1.1 Python基础 1.1.1 学习Python的基本语法 变量和数据类型&#xff1a; 1.1.2 控制流 条件语句&#xff1a; 循环语句&#xff1a; 1.1.3 函数和模块 函数&#xff1a; 模块&#xff1a; 1.2 安装PyCharm 1.2.1 下载并安装 第二…

Spring Boot 过滤器和拦截器详解

目录 Spring Boot 过滤器1.什么是过滤器2.工作机制3.实现过滤器 Spring Boot 拦截器1. 什么是拦截器2. 工作原理3.实现4.拓展&#xff08;MethodInterceptor 拦截器&#xff09;实现 过滤器和拦截器区别过滤器和拦截器应用场景过滤器拦截器 Spring Boot 过滤器 1.什么是过滤器 …

从零开始做题:LSB

1 题目 2 解题 2.1 使用stegsolve工具 ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc] └─$ java -jar Stegsolve.jar 2.1.1 发现R、G、B的plane0有隐藏信息 2.1.2 提取隐藏信息 2.1.3 save bin后得到二维码 2.1.4 QR Research得到flag 3 flag cumtctf{1sb_i4_s0_Ea4y}

leetCode.92. 反转链表 II

leetCode.92. 反转链表 II 题目思路 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode …

【LeetCode:2742. 给墙壁刷油漆 + 递归 + 记忆化搜索 + dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

硬件实用技巧:摄像头常用的输出协议类型和输出接口类型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140042485 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

正念:照进乌云的阳光,改变你的人生|流静

在人生的旅途中&#xff0c;我们时常遭遇乌云密布的时刻&#xff0c;困厄与挫折如同浓重的阴霾&#xff0c;遮挡了前行的道路。然而&#xff0c;在这黑暗之中&#xff0c;总有一束名为“正念”的阳光&#xff0c;能够穿透云层&#xff0c;照亮我们的内心&#xff0c;引领我们走…