从HPACK到多路复用,揭秘HTTP/2如何终结网络拥堵

简介: HTTP/2通过HPACK压缩头部冗余信息,提升传输效率;并利用多路复用技术,在单个TCP连接上并行处理多个请求,避免队头阻塞,显著提升性能。同时支持服务器推送和流优先级设置,优化资源加载体验。

头部压缩 (HPACK)
在HTTP/1中,每个请求和响应都会发送大量重复的头部信息,比如 Cookie、User Agent、Accept 等,会使得大量带宽被这些冗余的数据占用。为了解决这个问题,HTTP/2引入了HPACK算法来压缩头部信息。HPACK算法有两个主要的特性。
1)静态表(Static Table)和动态表():用来存储头部字段。静态表包含了61 种常见的头部字段,如":method"、":path"等。动态表则是在会话过程中动态更新,它存储了最近使用的头部字段。同时HPACK会建立一种称为“索引”的机制,用于快速查找和引用两个表中的键值对。这样对于相同的键值对数据,只需发送对应的键值就行。
1)静态表 (Static Table): 预定义了61个常用的HTTP头部字段名及其常见值(如 :method: GET, accept-encoding: gzip, deflate)。这些条目有固定的索引。
2)动态表 (Dynamic Table): 在连接的生命周期内,由编码器和解码器共同维护。新遇到的或不适合静态表的头部键值对可以添加到动态表中,并赋予动态索引。后续传输相同的头部时,只需发送其索引。
3)霍夫曼编码:用来压缩头部字段的值。霍夫曼编码是一种可变长度编码方法,将较短的代码分配给出现机率高的字母,而较长的代码分配给出现机率低的字母。这样可以使编码之后的字符串的平均长度降低,从而达到压缩数据的目的。
需注意的是,HPACK只用于压缩HTTP头部信息。另外假如每次请求的头部信息不一样,也会导致动态表建立过多索引,从而导致占用太多内存。因此服务器会对一个连接上的请求数量做限制(http2_max_concurrent_Streams),避免动态表无限增大。
image.png

多路复用 (Multiplexing)
在HTTP/1中,如果想并发发送多个请求,必须创建多个TCP连接,每个 TCP 连接都要经过 TCP 握手、慢启动以及 TLS 握手过程,这些都很耗时。浏览器为了减少负载,会对同一域名下的TCP连接做限制,这样当请求量比较大时,会引起阻塞,如下图,Stalled 阻塞已经达到356ms。如果当前请求响应迟迟不来,那么后续的请求是无法发送的,也造成了队头阻塞(Head-of-line blocking)的问题。
image.png

在 HTTP/2 中,有二进制分帧之后,HTTP/2 不再依赖 TCP 链接去实现多流并行,而是基于多个并行流复用单TCP连接的方式来实现多路复用(Multiplexing):
1)同个域名只需要占用一个 TCP 连接,单个TCP 连接可以承载任意数量的双向流,这些流并行交错,之间互不干扰。
2)流以消息的形式发送,而消息又由一个或多个帧组成,不同流的帧是可以乱序发送,因为可以根据帧首部的流标识重新组装。同一个流内的帧必须是有序的。
流标识符是实现多路复用的关键,如下图,服务端并行交错地发送了两个响应: 流1和流 3,这两个流都是跑在一个TCP连接上,客户端收到后,会根据相同的流标识符有序组装成 HTTP 消息。
image.png

客户端和服务器可以建立双向流,服务端可以主动推送资源给客户端。 客户端建立的流必须是奇数号,而服务器建立的流必须是偶数号。
比如下图,流1是客户端向服务端请求的资源,属于客户端建立的流,所以该流的ID是奇数(数字 1);流 2 和 4 都是服务端主动向客户端推送的资源,属于服务端建立的流,所以这两个流的 ID 是偶数(数字 2 和 4)。
image.png

HTTP/2 还可以对每个流设置不同优先级,帧头中的“标志位”可以设置优先级,比如客户端访问 HTML/CSS 和图片资源时,希望服务器先传递 HTML/CSS,再传图片,那么就可以通过设置流的优先级来实现,以此提高用户体验。

image.png

未完待续

很高兴与你相遇!如果你喜欢本文内容,记得关注哦!

目录
相关文章
|
4月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
278 61
|
5月前
|
监控 应用服务中间件 Linux
掌握并发模型:深度揭露网络IO复用并发模型的原理。
总结,网络 I/O 复用并发模型通过实现非阻塞 I/O、引入 I/O 复用技术如 select、poll 和 epoll,以及采用 Reactor 模式等技巧,为多任务并发提供了有效的解决方案。这样的模型有效提高了系统资源利用率,以及保证了并发任务的高效执行。在现实中,这种模型在许多网络应用程序和分布式系统中都取得了很好的应用成果。
155 35
|
4月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
5月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
169 18
|
6月前
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
220 22
|
6月前
|
网络安全
网络问题解析:如何解决CondaHTTPError HTTP 000 CONNECTION FAILED错误。
以上就是斯诺普为你准备的解决Conda出现HTTP连接错误的手术室。希望这辆小车可以顺利驶出棘手的泥潭,再次在自由的大路上疾驰。一切的尝试和努力,只为更好的探索与开发。
235 17
|
10月前
|
前端开发 网络协议 安全
【网络原理】——HTTP协议、fiddler抓包
HTTP超文本传输,HTML,fiddler抓包,URL,urlencode,HTTP首行方法,GET方法,POST方法
|
10月前
|
JSON Dart 前端开发
鸿蒙应用开发从入门到入行 - 篇7:http网络请求
在本篇文章里,您将掌握鸿蒙开发工具DevEco的基本使用、ArkUI里的基础组件,并通过制作一个简单界面掌握使用
415 8
|
10月前
|
存储 JSON 缓存
【网络原理】——HTTP请求头中的属性
HTTP请求头,HOST、Content-Agent、Content-Type、User-Agent、Referer、Cookie。
|
10月前
|
数据采集 安全 搜索推荐
HTTP代理IP纯净度 提升用户网络体验的核心竞争力
随着互联网发展,使用HTTP动态代理IP的需求日益增加。高纯净度的代理IP在隐私与安全、网络体验和业务运营方面至关重要。它能保护用户信息、提高数据安全性、确保访问速度和连接稳定,并提升业务效率与信誉度。
171 2