http 的成长史
·
giftia
http1.0
- 无状态,无连接:每次请求都是独立的,服务器不会记录客户端的状态。
- 短连接:每次发送请求都需要重新建立 TCP 连接(三次握手),完成后立即断开,导致性能浪费。
- 无host头域:HTTP/1.0 请求中没有 Host 字段,无法支持同一 IP 地址下的多个域名(虚拟主机)。
- 不允许断点续传:只能传输整个对象,无法只传输文件的一部分。
http1.1
- 长连接:默认启用 Connection: keep-alive,允许在一个 TCP 连接上发送多个请求,减少了连接建立的开销。
- 请求管道化:支持在同一个连接中同时发送多个请求,但服务器仍需按顺序响应,存在队头阻塞问题。
- 增加缓存处理:引入了 Cache-Control 和 ETag 等字段,优化了缓存管理。
- 增加Host字段:支持虚拟主机(同一 IP 地址下的多个域名)。
- 支持断点续传:通过 Range 请求头实现部分内容传输。
http2.0
- 二进制分帧:将 HTTP 报文分为更小的帧进行传输,客户端和服务器通过帧的标识符重新组装报文。
- 头部压缩:使用 HPACK 算法对头部进行压缩,客户端和服务器维护一个头部索引表,减少重复头部的传输。
- 多路复用:在一个 TCP 连接中可以同时处理多个请求,每个请求对应一个独立的流(Stream),解决了 HTTP/1.1 的队头阻塞问题。
- 服务器推送:服务器可以主动向客户端推送资源,而无需客户端显式请求。
http3.0
- 基于QUIC协议:QUIC 是 Google 开发的基于 UDP 的传输协议,减少了 TCP 的三次握手和 TLS 握手时间。
- 解决队头阻塞问题:HTTP/3.0 使用独立的流(Stream),即使某个流丢包,也不会阻塞其他流的传输。
- 优化了重传策略:重传包和原包的编号不同,降低了重传计算的开销。
- 连接迁移:使用 64 位随机数标识连接,而不是依赖 TCP 的四元组(IP + 端口),支持客户端在网络切换(如 Wi-Fi 到 4G)时保持连接。
- 更高效的流量控制:提供更灵活的流量控制机制,提升传输效率。
各版本对比
| 特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2.0 | HTTP/3.0 |
|---|---|---|---|---|
| 连接方式 | 短连接 | 长连接 | 长连接 | 基于 QUIC 的长连接 |
| 数据传输格式 | 文本 | 文本 | 二进制分帧 | 二进制分帧 |
| 多路复用 | 不支持 | 不支持 | 支持 | 支持 |
| 队头阻塞 | 存在 | 存在 | TCP 层队头阻塞 | 无队头阻塞 |
| 头部压缩 | 不支持 | 不支持 | 支持(HPACK) | 支持(QPACK) |
| 服务器推送 | 不支持 | 不支持 | 支持 | 支持 |
| 传输协议 | TCP | TCP | TCP | QUIC(基于 UDP) |
| 安全性 | 不安全 | 不安全 | 安全(TLS) | 安全(TLS) |