| 特性 | 解决的问题 |
|---|---|
| 请求方法(GET、POST、HEAD) | 支持表单提交、获取元信息 |
| 状态码(200、404、500 等) | 客户端能判断请求结果 |
| 请求/响应头 | Content-Type、Content-Length、User-Agent |
| Cache 机制(Expires、Pragma: no-cache) | 减少重复请求 |
❌ 核心问题:短连接
1. 持久连接(Keep-Alive)
Connection: keep-alive2. 管道化(Pipelining)
3. Host 头
Host: www.example.com4. 分块传输编码(Chunked Transfer Encoding)
text
Transfer-Encoding: chunked5. 更强的缓存控制
6. 新增请求方法
页面加载 example.com(包含 20 个资源)
浏览器行为:
┌─────────────────────────────────────────────────────────────┐
│ 建立 6 个 TCP 连接到 example.com(连接池) │
└─────────────────────────────────────────────────────────────┘
连接1(TCP端口 12345): 请求A → 响应A → 请求G → 响应G → 请求M → 响应M
└─串行─┘ └─串行─┘ └─串行─┘
连接2(TCP端口 12346): 请求B → 响应B → 请求H → 响应H → 请求N → 响应N
└─串行─┘ └─串行─┘ └─串行─┘
连接3(TCP端口 12347): 请求C → 响应C → 请求I → 响应I → 请求O → 响应O
└─串行─┘ └─串行─┘ └─串行─┘
连接4(TCP端口 12348): 请求D → 响应D → 请求J → 响应J → 请求P → 响应P
└─串行─┘ └─串行─┘ └─串行─┘
连接5(TCP端口 12349): 请求E → 响应E → 请求K → 响应K → 请求Q → 响应Q
└─串行─┘ └─串行─┘ └─串行─┘
连接6(TCP端口 12350): 请求F → 响应F → 请求L → 响应L → 请求R → 响应R
└─串行─┘ └─串行─┘ └─串行─┘
关键点:
✅ 6个连接之间是并行的(同时工作)
❌ 每个连接内部是串行的(必须等前一个响应回来,才能发下一个请求)1. 二进制分帧层(Binary Framing Layer) ⭐
2. 多路复用(Multiplexing) ⭐
3. 头部压缩(HPACK) ⭐
4. 服务器推送(Server Push)
同一个 TCP 连接(只需要1个):
时间轴 →
请求A(Stream1) ────────────────────── 响应A(Stream1) ─────────>
请求B(Stream2) ──────────── 响应B(Stream2) ──────>
请求C(Stream3) ── 响应C(Stream3) ──>
请求D(Stream4) ───────────────────────────────── 响应D(Stream4) →
所有请求可以同时发送,响应可以乱序返回
因为每个帧都有 Stream ID 来标识属于哪个请求