简介
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
References
– EOF –