HTTP 1.0、HTTP 1.1 和 HTTP 2 是 HTTP 协议的不同版本,每个版本都引入了新的特性和改进。以下是它们的主要区别:
1. HTTP 1.0
- 发布时间:1996 年
- 特点:
- 短连接:每次请求都需要建立一个新的 TCP 连接,请求完成后立即关闭连接。
- 无状态:每个请求都是独立的,服务器不会记住之前的请求。
- 简单:支持基本的请求方法(如 GET、POST)和头部字段。
- 缺点:
- 性能差:频繁建立和关闭 TCP 连接导致高延迟。
- 功能有限:不支持持久连接、管道化等现代特性。
2. HTTP 1.1
- 发布时间:1997 年(1999 年成为标准)
- 改进点:
- 持久连接:默认使用持久连接(
Connection: keep-alive
),可以在一个 TCP 连接上发送多个请求和响应,减少连接建立和关闭的开销。 - 管道化:支持请求管道化(pipelining),客户端可以在收到上一个响应之前发送下一个请求,但服务器必须按顺序返回响应。
- 分块传输编码:支持分块传输(
Transfer-Encoding: chunked
),允许服务器在未知内容长度的情况下逐步发送数据。 - 缓存控制:引入了更多缓存控制机制(如
Cache-Control
、ETag
)。 - Host 头部:支持虚拟主机(一个 IP 地址托管多个域名),通过
Host
头部区分不同的网站。 - 更多方法:新增了 PUT、DELETE、OPTIONS、TRACE 等方法。
- 持久连接:默认使用持久连接(
- 缺点:
- 队头阻塞:虽然支持管道化,但响应必须按顺序返回,一个慢响应会阻塞后续响应。
- 头部冗余:每个请求都会发送完整的头部信息,导致冗余。
3. HTTP 2
- 发布时间:2015 年
- 改进点:
- 二进制协议:HTTP 2 使用二进制格式传输数据(而非 HTTP 1.x 的文本格式),解析更高效。
- 多路复用:在同一个 TCP 连接上并行发送多个请求和响应,解决了 HTTP 1.1 的队头阻塞问题。
- 头部压缩:使用 HPACK 算法压缩头部,减少冗余数据。
- 服务器推送:服务器可以主动向客户端推送资源,而无需客户端显式请求。
- 流优先级:支持为请求设置优先级,确保重要资源优先传输。
- 改进的安全性:虽然不是强制要求,但主流浏览器和服务器通常要求 HTTP 2 必须基于 HTTPS(TLS 加密)。
- 优点:
- 性能大幅提升:多路复用和头部压缩显著减少了延迟和带宽消耗。
- 更好的用户体验:服务器推送和流优先级优化了页面加载速度。
对比总结
特性 | HTTP 1.0 | HTTP 1.1 | HTTP 2 |
---|---|---|---|
连接管理 | 短连接(每次请求新建连接) | 持久连接(默认 keep-alive) | 多路复用(一个连接并行处理) |
数据传输 | 文本格式 | 文本格式 | 二进制格式 |
队头阻塞 | 存在 | 存在(管道化部分缓解) | 完全解决 |
头部压缩 | 不支持 | 不支持 | 支持(HPACK 算法) |
服务器推送 | 不支持 | 不支持 | 支持 |
安全性 | 无 | 无 | 通常基于 HTTPS |
性能 | 低 | 中等 | 高 |
使用场景
- HTTP 1.1:仍广泛使用,兼容性好,适合不支持 HTTP 2 的旧系统。
- HTTP 2:现代 Web 应用的首选,性能优越,适合高并发、低延迟的场景。
迁移建议
- 如果客户端和服务器都支持 HTTP 2,优先使用 HTTP 2。
- 对于旧系统,可以同时支持 HTTP 1.1 和 HTTP 2,通过 TLS 的 ALPN 扩展自动协商协议版本。