本文目录导读:
HTTP/2 是 HTTP 协议自 1999 年 HTTP/1.1 发布以来的首个重大更新,其核心目标是解决 HTTP/1.1 的性能瓶颈,提升网页加载速度和用户体验。
以下是 HTTP/2 的主要特性,可以概括为一个核心、三大支柱、多项优化:
核心基石:二进制分帧层
- 对比 HTTP/1.1: 使用纯文本格式(可读但解析效率低)。
- HTTP/2: 将报文拆分为更小的帧(Frame),并采用二进制格式进行编码。
- 优势: 计算机解析二进制更高效,减少了传输错误,并且为后续的多路复用等高级特性奠定了基础。
三大支柱特性
多路复用
- 解决的问题: HTTP/1.1 的“队头阻塞”(Head-of-Line Blocking)——同一连接上只能串行处理请求,如果一个请求被阻塞,后续请求也会被等待。
- 实现原理: 在一个 TCP 连接上,可以同时发送多个请求和接收多个响应,这些请求/响应被拆分成独立的帧,通过 流 ID 进行标识,交错传输。
- 效果: 浏览器无需再为每个域名建立多个 TCP 连接(传统 HTTP/1.1 通常会开 6-8 个连接),HTTP/2 一个域名只需一个连接即可并行处理所有资源(CSS、JS、图片等),极大减少了连接开销和延迟。
服务器推送
- 解决的问题: 传统模式下,浏览器请求 HTML,解析后发现需要 CSS、JS,然后再次请求,这个过程会浪费一次往返时间(RTT)。
- 实现原理: 服务器在收到客户端请求 HTML 时,可以主动推测客户端接下来会需要的资源(如 style.css、app.js),并“推送”给客户端,而无需等待客户端显式请求。
- 注意: 这个推送是由服务器主动发起的“虚拟请求”,客户端可以选择拒绝(例如缓存中已有该资源),实际应用中,由于推送的资源可能未被使用导致带宽浪费,目前常用于特定的优化场景(如关键首屏资源)。
头部压缩
- 解决的问题: HTTP/1.1 的头部是纯文本且重复率高(如 User-Agent、Cookie、Accept 等),每次请求都重复发送,浪费带宽。
- 技术原理: 使用 HPACK 算法。
- 静态表: 维护一个预定义常用头部字段(如 :method: GET)的索引表。
- 动态表: 记录连接中已发送过的头部,后续相同头部只需发送索引号(1-2 字节)。
- Huffman 编码: 对不常见的头部值进行压缩。
- 效果: 头部体积通常可压缩 85%-90%,显著减少了首字节时间(TTFB)和整体传输量。
其他优化特性
连接复用
- 所有资源在一个长期保持的 TCP 连接上传输,由于避免了 TCP 的“慢启动”和“三次握手”反复建立,高并发场景下的性能非常稳定。
请求优先级
- 多路复用虽然并发传输,但浏览器可以给不同资源的请求设置优先级(如:CSS > 图片 > 异步JS),服务器可以按照优先级顺序发送响应帧,确保关键资源(如首屏CSS)先被加载和渲染。
流量控制(端到端)
- 与 TCP 的流量控制不同,HTTP/2 允许浏览器或服务器单独控制每个流(Stream)的发送速度,防止某个大文件(如视频帧)占满整个连接,影响其他小资源的加载。
关键对比:HTTP/1.1 vs HTTP/2
| 特性 | HTTP/1.1 | HTTP/2 |
|---|---|---|
| 数据格式 | 文本(可读但解析慢) | 二进制帧(解析高效) |
| 连接复用 | 串行(队列阻塞) | 并行(多路复用) |
| 头部传输 | 纯文本重复传输 | 压缩(HPACK算法) |
| 服务器动作 | 被动响应 | 可主动推送资源 |
| 连接数量 | 每个域名需多个连接 | 一个域名一个连接 |
| 优先级 | 无官方支持 | 支持流级别优先级 |
部署与注意事项
- 需要 TLS(HTTPS): 虽然 HTTP/2 协议本身不强制要求加密,但主流浏览器(Chrome、Firefox、Safari 等)只支持基于 TLS 的 HTTP/2(即 h2),实际部署 HTTP/2 必须同时启用 HTTPS。
- 性能提升条件: 对于文件多、体积小、高并发的现代 Web 页面(如图片、JS、CSS 碎片化加载)效果极其明显,如果是只有一个大文件(如视频流或超大 PDF),HTTP/2 的优势不如 HTTP/1.1 明显(因为多路复用对此无增益)。
- 与 HTTP/3 的关系: HTTP/3 是继 HTTP/2 后的下一代协议,它将底层从 TCP 更换为 QUIC(基于 UDP),进一步解决了 TCP 层面的队头阻塞(HTTP/2 仍受 TCP 丢包重传影响),HTTP/2 仍是当前主流浏览器和 Web 服务器广泛支持的标准。
| 特点 | 一句话总结 |
|---|---|
| 多路复用 | 一个连接并发多个请求,告别队头阻塞。 |
| 头部压缩 | 大幅减少重复头部数据,节省带宽。 |
| 服务器推送 | 服务器可提前推送关键资源,减少等待。 |
| 二进制协议 | 解析效率高,扩展性强。 |
一句话理解: HTTP/2 通过二进制分帧和多路复用,将一个慢速、多连接的“单车道”协议,升级成了一个高速、单连接并发跑的“多车道”高速公路。