HTTP 协议演变
一、HTTP 版本对比
| 版本 | 连接 | 并发 | 队头阻塞 | 协议层 |
|---|---|---|---|---|
| HTTP/1.0 | 短连接 | 多 TCP | 严重 | TCP |
| HTTP/1.1 | 长连接 | 有限 | 应用层 | TCP |
| HTTP/2 | 多路复用 | 高 | TCP 层 | TCP |
| HTTP/3 | QUIC | 极高 | 无 | UDP |
二、HTTP/1.0
- 短连接: 每次请求建立新 TCP 连接
- 无 Host 头: 无法虚拟主机
- 无状态: 无 Cookie 支持
三、HTTP/1.1
改进
Keep-Alive: 复用 TCP 连接
Pipelining: 并行发送请求 (实践中很少使用)
Host 头: 支持虚拟主机
分块传输: Transfer-Encoding: chunked
缓存控制: Cache-Control, ETag队头阻塞
请求1 ─────────────────────▶ 响应1 (慢)
请求2 ─► ▶ 响应2 (等待响应1)
请求3 ─► ▶ 响应3 (等待响应2)四、HTTP/2
核心特性
javascript
// 二进制帧
// 原来的文本协议 -> 二进制帧
// Frame: Length (3) + Type (1) + Flags (1) + Stream ID (4) + Payload
// 多路复用
// 一个 TCP 连接上并发多个 Stream
// 每个 Stream 由多个 Frame 组成
// Stream 之间独立,无队头阻塞
// HPACK 头部压缩
// 静态表: 61 个预定义 header
// 动态表: 连接期间建立
// Huffman 编码服务器推送
javascript
// 服务器主动推送资源
// 客户端请求 index.html
// 服务器响应 index.html + 推送 style.css + app.js
// Nginx 配置
// location / {
// http2_push /style.css;
// http2_push /app.js;
// }五、HTTP/3 (QUIC)
解决 TCP 队头阻塞
HTTP/2 over TCP:
Stream1 ──────X──────────────▶ (丢包导致所有 Stream 阻塞)
Stream2 ──────────────────────▶
Stream3 ──────────────────────▶
HTTP/3 over QUIC:
Stream1 ──────X──────────────▶ (只影响 Stream1)
Stream2 ──────────────────────▶ (正常)
Stream3 ──────────────────────▶ (正常)核心特性
- 0-RTT/1-RTT 握手: 首次 1-RTT,恢复连接 0-RTT
- 连接迁移: 基于 Connection ID,切换网络无需重连
- 改进的拥塞控制: 更精确的 RTT 测量
六、常见状态码
| 状态码 | 含义 | 场景 |
|---|---|---|
| 200 | OK | 请求成功 |
| 201 | Created | 创建成功 |
| 204 | No Content | 成功但无返回 |
| 301 | Moved Permanently | 永久重定向 |
| 302 | Found | 临时重定向 |
| 304 | Not Modified | 缓存有效 |
| 400 | Bad Request | 请求格式错误 |
| 401 | Unauthorized | 未认证 |
| 403 | Forbidden | 无权限 |
| 404 | Not Found | 资源不存在 |
| 500 | Internal Server Error | 服务器错误 |
| 502 | Bad Gateway | 网关错误 |
| 503 | Service Unavailable | 服务不可用 |
| 504 | Gateway Timeout | 网关超时 |
七、常见请求头
| 头部 | 用途 | 示例 |
|---|---|---|
| Content-Type | 内容类型 | application/json |
| Accept | 接受类型 | text/html,application/json |
| Authorization | 认证 | Bearer xxx |
| Cache-Control | 缓存控制 | max-age=3600, no-cache |
| Cookie | 会话 | session_id=abc |
| User-Agent | 客户端信息 | Mozilla/5.0... |
| Origin | 来源 | https://example.com |
| Referer | 来源页面 | https://example.com/page |
八、常见响应头
| 头部 | 用途 | 示例 |
|---|---|---|
| Content-Type | 内容类型 | application/json; charset=utf-8 |
| Content-Length | 内容长度 | 1234 |
| Set-Cookie | 设置 Cookie | session=abc; HttpOnly |
| Cache-Control | 缓存 | max-age=31536000 |
| ETag | 资源版本 | "abc123" |
| Access-Control-* | CORS | Allow-Origin: * |
| Content-Encoding | 压缩 | gzip, br |
面试高频题
Q1: HTTP/1.1 的队头阻塞如何解决?
- 域名分片 (多个 TCP 连接)
- 资源合并 (减少请求数)
- 升级 HTTP/2
Q2: HTTP/2 为什么还有队头阻塞?
TCP 层丢包会阻塞所有 Stream。HTTP/3 使用 UDP 的 QUIC 解决。
Q3: HTTPS 的握手过程?
- 客户端发送 Client Hello (支持的加密套件)
- 服务器返回 Server Hello + 证书
- 客户端验证证书,生成预主密钥
- 使用预主密钥生成会话密钥
- 加密通信