简介

HTTP/2(RFC 7540,2015 年发布)是自 1999 年 HTTP/1.1 以来的第一次重大升级,目标是在 不改变应用语义 的前提下,改善延迟、并发和网络效率。浏览器端基本只在 TLS 上启用(h2),明文版本 h2c 仅用于内部服务间通信。

  • h2:HTTP/2 over TLS(最常见,浏览器只支持这一种)
  • h2c:HTTP/2 over TCP(无加密)

设计背景

移动端和富媒体时代,请求量激增,HTTP/1.1 的队头阻塞、多个 TCP 连接并行带来的 慢启动/拥塞竞争 成为瓶颈。

谷歌的 SPDY 原型验证了“单连接、多路复用、压缩头部”等思路;IETF 在 SPDY 3.1 基础上标准化为 HTTP/2。

核心特性

特性作用
二进制分帧 (Binary Framing)把 HTTP 报文拆成小型 Frame;机器易解析、可并行
多路复用 (Multiplexing)多个请求/响应 共享一个 TCP 连接,互不阻塞
流与优先级 (Stream & Priority)每个请求是双向 Stream,可指定权重与依赖
头部压缩 (HPACK)静态 Huffman + 动态表,大幅减少重复的 Header 字节
服务器推送 (Server Push)服务器可在请求外预送资源 (已被多数浏览器弱化/关闭)
流量控制端到端窗口,避免单个大文件占满带宽

开始实验

启用 HTTP/2 需要使用 HTTPS,请先参考 在本地环境使用 HTTPS | ZYF.IM

修改 NGINX default.conf 配置文件,启用 HTTP/2:

# vi default.conf
server {
    listen 443 ssl;
    # 启用 HTTP/2
    http2 on;

    server_name localhost;
    ssl_certificate /etc/ssl/certs/localhost.pem;
    ssl_certificate_key /etc/ssl/certs/localhost-key.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        root /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
docker container restart nginx-ssl

测试

游览器

游览器访问 https://localhost:8443/,在 Chrome 开发者工具 Network 面板勾选 Protocol,可看到 h2 字样。

或者使用 Chrome 插件 HTTP Indicator

  • HTTP/1.1 显示为灰色。
  • HTTP/2 显示为蓝色。
  • HTTP/3 显示为绿色。

curl

# -I (--head) 只返回响应头
curl -I https://localhost:8443/

HTTP/2 200
server: nginx/1.29.0
date: Fri, 27 Jun 2025 01:56:55 GMT
content-type: text/html
content-length: 615
last-modified: Tue, 24 Jun 2025 17:57:38 GMT
etag: "685ae712-267"
accept-ranges: bytes

HTTP/3

请移步 NGINX 启用 HTTP/3 | ZYF.IM

References

– EOF –