最熟悉的陌生人, 5分钟快速理解HTTP2

最熟悉的陌生人, 5分钟快速理解HTTP2

💡 原文中文,约5800字,阅读约需14分钟。
📝

内容提要

HTTP/2 用于解决 HTTP/1.1 的 TCP 连接过多、头部重复和文本协议低效等问题,支持同一连接多路复用、二进制帧、HPACK 头部压缩、流量控制、流优先级和服务器推送,并兼容 HTTP/1.1 语义。升级方式包括 Upgrade 和 ALPN,帧是基本单元,流用于区分并发请求。

🔎

延伸解读

HTTP/2 如何解决 HTTP/1.1 的痛点

HTTP/1.1 存在 TCP 连接数过多、头部重复和文本协议低效等问题。HTTP/2 通过同一连接多路复用、二进制帧、HPACK 头部压缩、流量控制、流优先级和服务器推送等机制,显著提升了性能。这些改进并非改变 HTTP 语义,而是优化传输层,因此能兼容 HTTP/1.1。

升级到 HTTP/2 的两种方式

客户端可通过 HTTP 头部 Upgrade 指定 h2c 升级,或通过 TLS 的 ALPN 扩展协商。Upgrade 方式需要服务端返回 101 状态码,而 ALPN 在 TLS 握手时完成协商,更为高效。目前大多数网站采用 ALPN,因为它在建立连接时即确定协议,减少了额外往返。

帧与流:HTTP/2 的基本单元

HTTP/2 中,帧是二进制协议的基本单元,不同帧有不同作用,如 SETTINGS、HEADERS、DATA 等。流是抽象概念,用于区分并发请求,每个流有唯一 ID。帧通过 Stream Identifier 识别所属流,多个流可在同一连接上并发,实现多路复用。流的状态机管理其生命周期,类似 TCP 连接。

服务器推送与 WebSocket 的区别

HTTP/2 的服务器推送允许服务端主动发送资源,如 PUSH_PROMISE 帧预告推送内容,减少客户端请求延迟。但推送不能替代 WebSocket,因为 WebSocket 提供全双工通信,而 HTTP/2 推送仍是基于请求-响应模型的优化。若需双向实时通信,仍需 WebSocket 或类似协议。

❓

Q&A

HTTP/2 主要解决了 HTTP/1.1 的哪些问题?

HTTP/2 主要解决 HTTP/1.1 的 TCP 连接数过多、HTTP 头部重复以及使用文本协议导致的低效问题。

HTTP/2 有哪些核心特性?

HTTP/2 的核心特性包括:在同一个 TCP 连接上多路复用多个请求/响应、二进制帧、HPACK 头部压缩、流量控制、流优先级、服务器推送,并且兼容 HTTP/1.1 语义。

如何将 HTTP/1.1 升级到 HTTP/2?

升级到 HTTP/2 主要有两种方式:一是通过 HTTP 头部中的 Upgrade 指定 h2c(明文 HTTP/2);二是通过 TLS 的 ALPN 扩展,在握手时协商使用 h2。目前常见的是 ALPN 方式。

HTTP/2 中的帧(frame)是什么?有哪些常见类型?

帧是 HTTP/2 二进制协议的基本单元,不同帧有不同作用。常见类型包括:SETTING 帧(传递配置信息)、HEADERS 帧(发送头部)、CONTINUATION 帧(延续头部)、DATA 帧(发送 body 数据)、PUSH_PROMISE 帧(服务器推送)、WINDOW_UPDATE 帧(流量控制)等。

HTTP/2 中的流(stream)是什么?它如何实现多路复用?

流是 HTTP/2 连接中客户端与服务端之间双向交换帧的抽象概念,每个流有唯一的 Stream Identifier。多个流可以在同一连接中并发,帧通过 Stream Identifier 识别所属流,从而实现多路复用。

HTTP/2 的服务器推送(Server Push)是什么?它能替代 WebSocket 吗?

服务器推送允许服务器通过 PUSH_PROMISE 帧主动向客户端发送其可能需要的资源,让客户端提前缓存。但它不能替代 WebSocket,两者不等价,除非修改 HTTP/2 协议本身。

HTTP/2 的头部压缩(HPACK)是如何工作的?

HPACK 通过查表法压缩头部:客户端和服务器各自维护一个相同的哈希表,存储头部字段与值的对应关系。发送请求时,对于重复的头部,客户端只需发送索引值即可,从而减少冗余。

🏷️

标签

➡️

继续阅读