Skip to content

HTTP 协议演变

一、HTTP 版本对比

版本连接并发队头阻塞协议层
HTTP/1.0短连接多 TCP严重TCP
HTTP/1.1长连接有限应用层TCP
HTTP/2多路复用TCP 层TCP
HTTP/3QUIC极高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 测量

六、常见状态码

状态码含义场景
200OK请求成功
201Created创建成功
204No Content成功但无返回
301Moved Permanently永久重定向
302Found临时重定向
304Not Modified缓存有效
400Bad Request请求格式错误
401Unauthorized未认证
403Forbidden无权限
404Not Found资源不存在
500Internal Server Error服务器错误
502Bad Gateway网关错误
503Service Unavailable服务不可用
504Gateway 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设置 Cookiesession=abc; HttpOnly
Cache-Control缓存max-age=31536000
ETag资源版本"abc123"
Access-Control-*CORSAllow-Origin: *
Content-Encoding压缩gzip, br

面试高频题

Q1: HTTP/1.1 的队头阻塞如何解决?

  1. 域名分片 (多个 TCP 连接)
  2. 资源合并 (减少请求数)
  3. 升级 HTTP/2

Q2: HTTP/2 为什么还有队头阻塞?

TCP 层丢包会阻塞所有 Stream。HTTP/3 使用 UDP 的 QUIC 解决。

Q3: HTTPS 的握手过程?

  1. 客户端发送 Client Hello (支持的加密套件)
  2. 服务器返回 Server Hello + 证书
  3. 客户端验证证书,生成预主密钥
  4. 使用预主密钥生成会话密钥
  5. 加密通信

前端面试知识库