Skip to content

HTTP 协议详解

MDN HTTP 文档

1. HTTP 基础

1.1 GET 和 POST 的区别

这是面试中最基础但也最容易答不全的问题。

维度GETPOST
语义获取资源 (Safe & Idempotent)提交资源 (Non-idempotent)
参数位置URL 查询参数 (Query String)请求体 (Request Body)
数据长度受浏览器/服务器 URL 长度限制 (一般 2KB~8KB)无限制 (受服务器配置影响)
缓存能被浏览器主动缓存除非手动设置 Cache-Control,否则不缓存
历史记录参数保留在浏览器历史中 (隐私风险)参数不会保留
编码只能进行 URL 编码支持多种编码 (form-data, json, etc.)

1.2 RESTful API 设计风格

REST (Representational State Transfer) 是一种软件架构风格。

  • 资源 (Resources): URL 应该代表资源,使用名词 (e.g., /users, /articles).
  • 动作 (Verbs): 使用 HTTP 方法表达动作。
    • GET: 获取资源
    • POST: 创建资源
    • PUT: 全量更新资源
    • PATCH: 增量更新资源
    • DELETE: 删除资源
  • 状态码 (Status Codes): 准确使用 HTTP 状态码 (200, 201, 400, 401, 403, 404, 500).
  • 无状态 (Stateless): 服务器不保存客户端状态,每次请求包含所有必要信息 (Token).

2. HTTP 状态码

HTTP 状态码模拟器

类别描述常见代码
1xx信息性100 Continue
2xx成功200 OK, 201 Created (创建成功), 204 No Content (删除成功)
3xx重定向301 (永久重定向), 302 (临时重定向), 304 (协商缓存命中)
4xx客户端错误400 (参数错误), 401 (未登录), 403 (无权限), 404 (未找到)
5xx服务端错误500 (服务器炸了), 502 (网关错误), 503 (服务不可用), 504 (网关超时)

3. HTTP 版本演变

3.1 HTTP/1.0 vs HTTP/1.1

  • 长连接 (Keep-Alive): 1.1 默认开启,复用 TCP 连接,减少握手开销。
  • Host 头: 允许一台服务器托管多个域名 (虚拟主机)。
  • 缓存控制: 引入 Cache-Control, Etag
  • 断点续传: Range 头。

3.2 HTTP/2.0

  • 多路复用 (Multiplexing): 同一个 TCP 连接上并发处理多个请求,解决 HTTP 队头阻塞。
  • 二进制分帧: 解析更高效,体积更小。
  • 头部压缩 (HPACK): 压缩请求头,减少体积。
  • 服务端推送 (Server Push): 主动推送资源。

3.3 HTTP/3.0

  • 基于 UDP (QUIC): 彻底解决 TCP 队头阻塞 (丢包不影响其他流)。
  • 连接迁移: 切换网络 (WiFi <-> 4G) 不断连 (基于 Connection ID)。
  • 0-RTT: 建连更快。

4. HTTPS 与 安全

HTTPS = HTTP + SSL/TLS。

4.1 SSL/TLS 握手流程

  1. ClientHello: 客户端发送支持的加密套件、随机数 (Random1)。
  2. ServerHello: 服务端选择加密套件、发送随机数 (Random2)、发送证书
  3. 验证证书: 客户端验证证书有效性 (CA 签名、有效期、域名)。
  4. Premaster Secret: 客户端生成预主密钥,用服务器公钥加密发送。
  5. 生成会话密钥: 双方利用 Random1 + Random2 + Premaster 生成 Session Key。
  6. 加密通信: 后续使用 Session Key 进行对称加密传输。

4.2 证书防篡改原理

证书包含:明文信息 + 数字签名

  • 签名生成: CA 用自己的私钥明文信息 的 Hash 值进行加密。
  • 签名验证: 客户端用 CA 的公钥解密签名得到 Hash1,再计算 明文信息 的 Hash2。若 Hash1 === Hash2,则证书未被篡改。

5. 网络基础设施

5.1 正向代理 vs 反向代理

  • 正向代理 (Forward Proxy): 代理客户端。隐藏客户端身份,翻墙,缓存。
    • 例子: VPN, 公司内网代理。
  • 反向代理 (Reverse Proxy): 代理服务端。负载均衡,隐藏服务器真实 IP,SSL 卸载。
    • 例子: Nginx, Cloudflare。

5.2 CDN (内容分发网络)

  • 原理: 将静态资源 (JS/CSS/Img) 缓存到离用户最近的边缘节点。
  • DNS 调度: 用户请求域名 -> CNAME 到 CDN 域名 -> CDN DNS 返回最近节点的 IP。
  • 回源: 如果边缘节点没有资源,向源站拉取并缓存。

Power by VitePress