每一代 HTTP 解决了什么问题?下图说明了主要特征。
图片
HTTP/1
HTTP 1.0 于 1996 年定型并形成完整文档。对同一服务器的每个请求都需要单独的 TCP 连接。
HTTP 1.1 于 1997 年发布。TCP 连接可以保持开放以便重复使用(持久连接),但这并不能解决 HOL(Head of Line)阻塞问题。
HOL 阻塞 - 当浏览器允许的并行请求数用完时,后续请求需要等待前一个请求完成。
HTTP/2
HTTP 2.0 于 2015 年发布。它通过请求复用解决了 HOL 问题,消除了应用层的 HOL 阻塞,但传输(TCP)层仍存在 HOL。
如图所示,HTTP 2.0 引入了 HTTP “流”的概念:这是一种抽象概念,允许在同一 TCP 连接上复用不同的 HTTP 交换。每个流无需按顺序发送。
应用场景:
- 大型网站:HTTP/2 的多路复用特性允许多个请求共享一个连接,避免了 HTTP/1.1 中的队头阻塞问题。这对于需要加载大量资源的复杂网页(如图片、脚本、样式表等)非常适合。
- CDN:HTTP/2 的头部压缩和二进制格式能够显著减少数据量,提升数据传输效率。更高效的连接复用让 CDN 在传输大型文件或流媒体内容时有更好的性能。
- 移动应用:HTTP/2 可以显著减少移动设备上的网络延迟,适合需要快速响应的移动应用和 API 请求。
HTTP/3
HTTP 3.0 第一稿于 2020 年发布。它是 HTTP 2.0 的后续版本。它使用 QUIC 代替 TCP 作为底层传输协议,从而消除了传输层中的 HOL 阻塞。
QUIC 基于 UDP。它将流作为一等公民引入传输层。QUIC 流共享同一个 QUIC 连接,因此创建新的 QUIC 流无需额外的握手和慢启动,但 QUIC 流是独立传输的,因此在大多数情况下,影响一个流的数据包丢失不会影响其他流。
应用场景:
- 实时应用和游戏:HTTP/3 的快速握手和低延迟特性使其非常适合需要实时数据传输的应用,比如在线游戏、视频会议、和实时流媒体。
- 现在 web 应用:由于 HTTP/3 提供了更高效的连接管理和更好的用户体验,对于现代 Web 应用和服务提供商来说,如使用 SPAs(单页应用)和频繁的小数据请求的场景,HTTP/3 是更优的选择。
- 安全性要求较高的服务:QUIC 协议自带加密,简化了 TLS 的握手过程,因此对于那些需要快速、安全连接建立的服务,HTTP/3 是很合适的。