HTTP/1.0 与 HTTP/1.1 有什么区别?
| 维度 | HTTP/1.0 | HTTP/1.1 |
|---|
| 缓存机制 | 仅客户端缓存 | 客户端缓存 + 服务器缓存 |
| 持久连接 | 默认非持久连接 | 默认持久连接 |
| 超时机制 | 无明确超时机制 | 连接超时 + 读取超时 + 空闲连接超时 |
| 状态码 | 较少 | 更多状态码 |
| 带宽优化 | 无 | 分块传输 + 范围请求 |
| 主机识别 | 无 | 引入 Host 首部字段 |
| 管线化 | 不支持 | 支持 |
HTTP/1.x 有哪些固有弊端?
- 一次连接只能按序处理请求, 存在队首阻塞;
- 请求只能从客户端发起, 服务端无法主动推送;
- 首部信息冗余且不压缩;
HTTP/2 增加了哪些能力?
- 多路复用: 基于二进制帧首部的标识字段区分不同请求, 在一条连接上并行交错传输;
- 二进制分帧: 提高传输效率;
- 首部压缩: 压缩 HTTP 首部信息;
- 服务器推送: 服务端主动推送资源;
- 请求优先级: 控制响应的优先级;
HPACK 如何压缩首部?
- 静态压缩: 预先建立静态表字典, 把常用首部预编码, 传输时只发静态表索引;
- 动态压缩: 双方基于哈希算法维护动态表, 传输时只发哈希表索引;
- 淘汰: 动态表空间不足时, 优先删除最少使用的首部字段;
HTTP/3 为什么改用 QUIC?
- 传输层: 基于 UDP 实现 QUIC 协议;
- QUIC 提供的能力:
- 前向纠错: 基于 FEC, 额外发送一个校验包(值为所有数据包的异或); 只丢失一个非校验包时可用其他包还原;
- 重传机制;
- 拥塞控制;
- 消除队首阻塞: HTTP/2 的 TCP 与 TLS 都存在队首阻塞, QUIC 基于 UDP, 服务端无滑动窗口, 不强制数据包处理顺序;
- 建连更快: HTTP/3 只需一次握手, 第一个包即可携带请求数据;