HTTP 协议详解
1. HTTP 基础
1.1 GET 和 POST 的区别
这是面试中最基础但也最容易答不全的问题。
| 维度 | GET | POST |
|---|---|---|
| 语义 | 获取资源 (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 握手流程
- ClientHello: 客户端发送支持的加密套件、随机数 (Random1)。
- ServerHello: 服务端选择加密套件、发送随机数 (Random2)、发送证书。
- 验证证书: 客户端验证证书有效性 (CA 签名、有效期、域名)。
- Premaster Secret: 客户端生成预主密钥,用服务器公钥加密发送。
- 生成会话密钥: 双方利用 Random1 + Random2 + Premaster 生成 Session Key。
- 加密通信: 后续使用 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。
- 回源: 如果边缘节点没有资源,向源站拉取并缓存。
