HTTP(HyperText Transfer Protocol,超文本传输协议)定义了客户端和服务器之间交换报文的格式和方式,默认使用 80 端口,基于 TCP 保证传输可靠性。本文整合 HTTP 的完整知识:协议特性、请求/响应报文、以及从 HTTP/1.1 到 HTTP/3 的版本演进与性能优化。
HTTP 协议具有以下优点:
Content-Type 标记。缺点:无状态(服务器不保存客户信息)、明文传输(报文文本形式暴露、不安全)——不加密会被窃听、不验证身份可能被伪装、无法证明完整性可能被篡改。
GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*请求报文第一行是请求行(方法 + URL + HTTP 版本),后面是首部行,首部后可跟实体主体。请求首部之后有一个不能省略的空行,划分首部与实体。
请求方法:GET(获取数据)、POST(提交实体,通常造成资源修改)、PUT(上传文件/修改数据)、DELETE(删除对象)、HEAD(获取报文首部,不返回主体)、OPTIONS(询问支持的方法,用于跨域)、TRACE(追踪请求-响应路径)、CONNECT(代理通信时建立隧道)。
方法更多是语义上的区别,并非 POST 能做的 GET 不能做,主要看如何选择。
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Server: Apache 0.84响应报文第一行是状态行(协议版本 + 状态码 + 状态信息),后面是首部行,最后是实体主体。
首部分类(请求报文和响应报文都有的通用/实体首部,以及各自的请求/响应首部):
HTTP 基于 TCP 且使用请求-应答模式,性能关键在这两点:
Connection: keep-alive 要求服务器不关闭);管道传输(pipeline):HTTP/1.1 长连接下可在同一 TCP 连接发起多个请求(不必等第一个回来),但服务器仍按顺序响应——前面响应慢会导致后面请求排队,即队头阻塞。
队头阻塞的解决方案:
相较 HTTP/1.0,HTTP/1.1 引入三项关键优化:
| 优化 | 机制 | 效果 |
|---|---|---|
| 持久连接 | Connection: keep-alive(默认) | TCP 连接复用,减少握手开销 |
| 管道化 | 连续发送多请求不等响应 | 理论减少延迟,实际很少用 |
| 分块传输 | Transfer-Encoding: chunked | 无需预知 Content-Length |
同时加入:PUT/OPTIONS/DELETE/TRACE/CONNECT 等方法(PATCH 随 RFC 5789 于 2010 年补充)、强缓存与协商缓存机制、Host 字段(区分虚拟主机)。
性能瓶颈:
HTTP/2 核心特性:多路复用、HPACK 头部压缩、服务器推送、流优先级、二进制分帧。
二进制分帧层:HTTP/2 在 HTTP 语义与 TCP 之间引入二进制分帧,帧类型包括 HEADERS(头部)、DATA(体)、SETTINGS(配置)、WINDOW_UPDATE(流量控制)、PUSH_PROMISE(推送声明)、GOAWAY(关闭)。
多路复用:单条 TCP 连接上实现多个并发流,每个流携带一个请求-响应对,消除应用层队头阻塞。数据流通过 Stream ID 标记归属,可交错发送。
HPACK 头部压缩:静态表(常见字段索引代替文本)、动态表(首存后复用索引)、Huffman 编码(高频字符短编码),显著减少冗余头部传输。
服务器推送的废弃:HTTP/2 服务器推送允许主动发送未请求资源,但缓存命中率低、与缓存策略冲突、代理难处理,增加带宽浪费。Chrome 于 2022 年移除 Server Push 支持,替代方案为 103 Early Hints、preload 链接、Speculation Rules。
HTTP/2 的 TCP 队头阻塞:解决了应用层队头阻塞,但 TCP 层仍存在——单连接中一个包丢失阻塞所有流。测试数据:丢包率 2% 时 HTTP/1.1 传输效率反而优于 HTTP/2(6 连接中仅 1 条受影响)。
标准化历程:2009 Google 提出 SPDY、2012 开始实验 QUIC → 2015 HTTP/2 标准化 → 2021 RFC 9000(QUIC)→ 2022 RFC 9114(HTTP/3)→ 2022 起主流浏览器稳定支持 → 2023-2025 全球部署率增至 30%+。
QUIC 核心特性(运行于 UDP 之上):
| 特性 | 说明 |
|---|---|
| 流级多路复用 | 单流丢包仅影响该流,消除 TCP 队头阻塞 |
| 0-RTT/1-RTT 握手 | 连接建立与加密合并,内置 TLS 1.3 |
| 连接迁移 | 用 Connection ID 标识连接,与网络路径无关(Wi-Fi 切 5G 不断连) |
| 内置 TLS 1.3 | 加密默认开启 |
| 用户态拥塞控制 | 可快速迭代 |
Alt-Svc 协商:服务器通过 Alt-Svc: h3=":443" 响应头告知客户端 HTTP/3 端点,浏览器缓存后优先尝试 QUIC,失败回退 HTTP/2。
| 维度 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 传输层 | TCP | TCP | QUIC (UDP) |
| 连接复用 | 6 连接/域名 | 单连接多流 | 单连接多流 |
| 队头阻塞 | 应用层 | TCP 层 | 无(流级独立) |
| 头部压缩 | 无 | HPACK | QPACK |
| 握手延迟 | 1.5+1-2 RTT | 1.5+1 RTT | 1/0 RTT |
| 连接迁移 | 不支持 | 不支持 | ✅ CID |
| 加密 | 可选 | 可选 | 强制 TLS 1.3 |
| 服务器推送 | 无 | 有(已废弃) | 无(用 Early Hints) |
| 标准 | RFC 9112 | RFC 9113 | RFC 9114 |
部署现状(2025-2026,Cloudflare Radar):HTTP/1.1 ~35%(下降)、HTTP/2 ~35%(稳定)、HTTP/3 ~30%(快速增长)。
| 场景 | 推荐 | 理由 |
|---|---|---|
| 新项目 | HTTP/3 | 默认 QUIC,性能最优 |
| 现有 HTTP/2 站点 | 启用 Alt-Svc | 渐进式升级 |
| 内网/低延迟 | HTTP/2 | 局域网丢包率极低 |
| CDN 托管 | HTTP/3 | 主流 CDN 已支持 |
优化清单:启用 HTTP/2/3、减少域名分片、内联关键资源、用 Early Hints 替代 Server Push、配置 Alt-Svc、用 fetchpriority 标记关键资源。
| 项目 | 说明 |
|---|---|
| 更新日期 | 2026-06-09 |
| HTTP/2 | RFC 9113 (2022,取代 RFC 7540) |
| HTTP/3 | RFC 9114 (2022) |
| QUIC | RFC 9000 (2021) |