HTTP 2.0 新特性

news/2024/10/23 8:52:33

HTTP 2.0 新特性

HTTP 2.0 为什么使用二进制分帧?

  1. 二进制协议比文本协议更加紧凑,减少占用空间
  2. 分帧层相当于将 HTTP 切分,更加灵活,比如可以对 header 帧做单独的特殊处理
  3. 分帧层有着属于自己的报文头,其中的 Stream Identity 使得操作系统具备将多个响应以及请求一一匹配的能力,这个是 HTTP/2 性能提升的关键,也就是多路复用
  4. 二进制分帧存在的意义就是将请求或响应切分,可以更加灵活处理。分帧层定义的报文格式,例如 Stream Identity等,直接关乎 HTTP/2 的各种优化方案的实现。
    总的来说,2.0 大幅度提高了 web 性能,减少了网络延迟,实现低延迟高吞吐量,对于前端开发者而言,减少了优化工作。

二进制分帧

帧:HTTP 2.0 通信的最小单位,所有帧都共享一个 8 字节的首部,其中包括帧的长度,类型,标志和一个保留位,并且至少有标识出当前帧所属的流的标识符,帧承载着特定类型的数据,如 HTTP 首部,负荷等

消息:比帧大的通讯单位,是指逻辑上的 HTTP 消息,比如请求、响应等,由一个或多个帧组成

流:比消息大的通讯单位。是 TCP 连接中的一个虚拟通道,可以承载双向的消息,每个流都有一个唯一的整数标识符

1. 什么是二进制分帧?

在二进制分帧层上,HTTP 2.0 会将所有传输信息分割成更小的消息和帧,并对它们采用二进制格式的编码将其封装。

其中,HTTP 1.X 中的首部信息 header 封装到 Headers 帧中,而 request body 将被封装到 Data 帧中。

2. 二进制分帧如何工作?

HTTP 2.0 通信都在一个 TCP 连接上完成,这个连接可以承载任意数量的双向数据流,相应的每个数据流以消息的形式发送。

而消息由一个或多个帧组成,这些帧可以乱序发送,然后根据每个帧首部的流标识符重新组装。

3. 二进制分帧对性能优化工作的贡献

二进制分帧主要是为下文中的各种特性提供了基础,它把一个数据划分封装为更小更便捷的数据。

首先是在单连接多资源方式中,减少了服务端的连接压力,内存占用更少,连接吞吐量更大(这一点可以结合多路复用来体会)

另一方面,由于 TCP 链接的减少而使网络拥塞状态得以改善,同时慢启动时间的减少,使拥塞和丢包恢复的速度更快。

(这两方面其实都是多路复用)

首部压缩

1. 什么是首部压缩

HTTP1.x 每次通讯(请求或响应)都会携带首部信息用于描述资源属性。

HTTP/2 中的首部压缩(Header Compression)是通过一种叫 HPACK 的压缩算法实现的。流程如下:

  1. 初次请求时,客户端发送完整的首部字段,但会将首部存储在动态表中
  2. 之后的请求中,客户端只需要发送动态表中的索引值,服务器可以通过该索引找到对应的首部字段
  3. 同时 Huffman 编码用于进一步压缩首部字段中的字符

HPACK 实现的几个关键原理:

  1. 静态和动态表

静态表:HTTP/2 预定义了一组常见的 HTTP 首部名称和值对的静态表。该表是固定的,客户端和服务器都可以给共享,减少重复传输常见的首部字段

动态表:客户端和服务器各自维护一个动态表,用来存储之前传输的首部名称和值对

  1. 首部字段可以通过索引的方式引用静态表或动态表中的 条目

2. 首部压缩如何工作?

对于相同的数据,不再重新通过每次请求和响应发送。每个新的首部键值对要么追加到当前表的末尾,要么替换表中之前的值。
首部表在 HTTP2.0 的链接存续期内始终存在,由客户端和服务端共同渐进的更新。

流量控制

  • 流量基于 HTTP 连接的每一跳进行,而非端到端的控制
  • 流量控制基于窗口更新帧进行,即接收方广播自己准备接收某个数据流的多少字节,以及对整个链接要接受多少字节
  • 流量控制有方向性,即接收方可能根据自己的情况为每个流乃至整个连接设置任意窗口大小
  • 流量控制可以由接收方禁用,包括针对个别的流和针对整个连接
  • 帧的类型决定了流量控制是否适用于帧,目前只有 DATA 帧服从流量控制,所有其他类型的帧并不会消耗流量控制窗口的空间。这保证了重要的控制帧不会被流量阻塞

多路复用

基于二进制分帧层,HTTP2.0 可以在共享 TCP 连接的基础上同时发送请求和响应。

HTTP 消息别分解为独立的帧,而不破坏消息本身的语义,交错发出去,在另一端根据流标识符和首部将他们重新组装起来。

请求优先级

每个流都可以带有一个 31bit 的优先级:0 表示最高优先级;2^31 - 1表示最低优先级

客户端明确指定优先级,服务端可以根据这个优先级作为交互数据的依据,比如客户端优先设置为 .css > .js > .jpg

服务端按此顺序返回结果更加有利于高效利用底层连接,提高用户体验。

然而在使用请求优先级时应注意服务端是否支持请求优先级,是否会引起对首阻塞问题,比如高优先级的慢响应请求会阻塞其他资源的交互

服务器推送

服务器根据客户端的请求,提前返回多个响应,推送额外的资源给客户端。

参考

  • https://juejin.cn/post/6844903545532071943
  • https://github.com/strongcode9527/blog/issues/6
  • https://github.com/shfshanyue/Daily-Question/issues/275

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

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

相关文章

Python脚本检测笑脸漏洞

Python脚本检测笑脸漏洞 一、漏洞介绍 ​ vsftpd2.3.4中在6200端口存在一个shell,使得任何人都可以进行连接,并且VSFTPD v2.3.4 服务,是以 root 权限运行的,最终我们提到的权限也是root;当连接带有vsftpd 2.3.4版本的服务器的21端口时,输入用户中带有“😃 ”,密码…

Veritas Backup Exec 24.0 发布,新增功能概览

Veritas Backup Exec 24.0 发布,新增功能概览Veritas Backup Exec 24.0 发布,新增功能概览 Veritas Backup Exec 24.0 (Windows) - 面向中小型企业的数据备份和恢复 请访问原文链接:https://sysin.org/blog/veritas-backup-exec-24/ 查看最新版。原创作品,转载请保留出处。…

slope trick

slope trickP4597 序列 sequence 首先考虑 \(dp\) 。 由于只需将序列改为非严格递增,那么就有一个贪心,即最终答案的数集不会变大。 为什么呢? 这是因为只有序列某一位置严格递减时,才会进行修改。 修改可以将前面的数降到和后面的数一样大,或者将后面的数提到和前面的数一…

黄绿题选刷

[ABC376D] Cycle找到包含节点 1 的环,直接从节点一出发,BFS,如果第二次遍历到了节点1,直接输出时间即可。点击查看代码 #include <bits/stdc++.h> using namespace std; #define FOR(i, a, b) for (int i = (a); i <= (b); ++i) #define ROF(i, a, b) for (int i …

面试题:如何能够保证T2在T1执行完后执行,T3在T2执行完后执行?——CountDownLatch原理

CountDownLatch的使用方式 CountDownLatch用于某个线程等待其他线程执行完任务再执行,与thread.join()功能类似。常见的应用场景是开启多个线程同时执行某个任务,等到所有任务执行完再执行特定操作,如汇总统计结果。 面试题:如何能够保证T2在T1执行完后执行,T3在T2执行完后…

读数据工程之道:设计和构建健壮的数据系统17存储的原材料

存储的原材料1. 存储 1.1. 存储是数据工程生命周期的基石1.1.1. 是数据获取、转换和服务主要阶段的基础1.1.1.1. 当构建数据管道时,随着数据经过获取、转换和服务阶段,工程师会选择适当的抽象来存储他们的数据1.1.2. 当数据在生命周期中移动时,它会被多次存储1.1.2.1. 必须在…

JAVA 前三次题目集总结

在过去的一个月里完成了java的前三次大作业对于JAVA的语法以及面向对象编程还不台上手,接下来说前三次大作业。 前三次大作业要是围绕答题判题系统展开的每次作业都在完善这个程序的功能可以说 1.第一次作业判分功能 在第一次作业阶段,核心任务是建立一个能够接收题目信息和答…

数据结构 - 树,三探之代码实现

本文介绍了使用数组和链表两种方式实现二叉树,包括初始化、节点操作(如获取、添加、删除)、以及遍历方法(前序、中序、后序、层次遍历)。测试代码已上传至代码库。书接上回,今天和大家一起动手来自己实现树。相信通过前面的章节学习,大家已经明白树是什么了,今天我们主…