HTTP 协议
HTTP(Hyper Text Transfer Protocol,超文本传输协议)是互联网上应用最广泛的应用层协议,基于 TCP 协议,主要用于浏览器/服务器(B/S)架构通信。它是整个 Web 世界的通信基石。
发展历程
| 版本 | 年份 | 关键特性 | 连接方式 |
|---|---|---|---|
| HTTP/0.9 | 1991 | 仅 GET,纯文本 | 短连接 |
| HTTP/1.0 | 1996 | POST/DELETE/PUT,超文本,头部,Cookie | 短连接(可 keep-alive) |
| HTTP/1.1 | 1997 | 默认长连接,管道化,Host 头 | 长连接(默认) |
连接演进
短连接(HTTP/0.9 默认):
TCP 三次握手 → HTTP 请求/响应 → 服务端主动断开
TCP 三次握手 → HTTP 请求/响应 → 服务端主动断开
问题:每个请求都要三次握手,高并发下消耗巨大。
长连接(HTTP/1.0 Keep-Alive / HTTP/1.1 默认):
TCP 三次握手 → 请求1+响应1 → 请求2+响应2 → ... → 空闲超时断开
一个 TCP 连接处理多个请求,大幅减少握手开销。
无状态问题与解决方案
HTTP 协议本质是无状态的——每次请求都是独立的,服务器无法识别请求来自谁。
Cookie 独立存储
| 步骤 | 说明 |
|---|---|
| 首次访问 | 服务端 Set-Cookie: k=v → 浏览器存入本地 |
| 后续请求 | 浏览器自动携带 Cookie: k=v |
| 缺点 | 客户端可篡改,不安全 |
Cookie + Session
| 步骤 | 说明 |
|---|---|
| 首次认证 | 服务端创建 Session,返回 Session ID(写入 Cookie) |
| 后续请求 | 携带 Session ID,服务端查 Session |
| 优点 | 敏感数据在服务端,安全 |
| 缺点 | 集群需 Session 共享(存入 Redis) |
JWT(JSON Web Token)
| 结构 | 说明 |
|---|---|
| Header | 算法类型(HS256/RSA) |
| Payload | 用户身份等声明数据 |
| Signature | 签名防篡改 |
- 客户端存储 Token,服务端无状态,天然集群友好
- 签名机制保证数据不可篡改
| 方案 | 存储位置 | 安全性 | 集群友好 |
|---|---|---|---|
| Cookie 独立 | 客户端 | ❌ 可篡改 | ✅ |
| Cookie+Session | 服务端 | ✅ | ❌ 集群需共享存储(Redis) |
| JWT | 客户端 | ✅ 签名 | ✅ |
报文结构
请求报文
请求行:GET /index.html HTTP/1.1
请求头:Host: example.com
User-Agent: Chrome/...
Cookie: session_id=abc123
空行
请求体(POST 时包含数据)
响应报文
状态行:HTTP/1.1 200 OK
响应头:Content-Type: text/html
Set-Cookie: k=v
空行
响应体(HTML/JSON/二进制等)
状态码分类
| 分类 | 范围 | 含义 | 常见举例 |
|---|---|---|---|
| 1xx | 100-199 | 信息 | 100 Continue |
| 2xx | 200-299 | 成功 | 200 OK, 201 Created |
| 3xx | 300-399 | 重定向 | 301 Moved, 302 Found |
| 4xx | 400-499 | 客户端错误 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found |
| 5xx | 500-599 | 服务端错误 | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable |
HTTPS / TLS
HTTPS = HTTP + TLS(传输层安全协议)
TLS 握手简流程
Client Hello → Server Hello + 证书 → 密钥交换 → 加密通信
证书类型
| 类型 | 验证级别 | 适用 |
|---|---|---|
| DV | 域名所有权 | 个人/博客 |
| OV | 企业认证 | 企业官网 |
| EV | 最高级 | 金融/银行 |
HTTP/2 多路复用
- 一个 TCP 连接上并发送多个请求/响应
- 解决 HTTP/1.x 的队头阻塞问题
浏览器访问完整流程
1. DNS 解析(域名 → IP)
2. TCP 三次握手(建立连接)
3. TLS 协商(HTTPS 时)
4. HTTP 请求/响应(数据传输)
5. 浏览器渲染(解析 HTML/CSS/JS)
6. TCP 四次挥手(关闭连接)
上下游通信原则
上下游之间,通信协议能对上就可以。上游用什么协议封装,下游就用什么协议解封。