面试高频问题:说一下 HTTP 1.0、HTTP 1.1、HTTP 2 以及 HTTP 3 的发展以及变化

1. HTTP 1.0:基础协议的诞生(1991年)

HTTP 1.0 是最早的 HTTP 协议版本,由万维网的发明人蒂姆·伯纳斯-李(Tim Berners-Lee)在 1991 年提出并应用于最初的 Web 服务。作为一个简单的基于文本的协议,HTTP 1.0 在当时的互联网环境下解决了浏览器和服务器之间的数据传输问题。

特点
  • 请求/响应模型:HTTP 1.0 是基于请求-响应模型的。当客户端向服务器发送请求时,服务器会根据请求返回响应。这是 HTTP 协议的核心理念。
  • 无状态性:HTTP 是无状态的,即每一次请求都是独立的,服务器不会记住上一次请求的状态。
  • 文本协议:所有的 HTTP 消息都是纯文本的,便于人类阅读和调试。
  • 一次请求/一次响应:HTTP 1.0 协议设计中,客户端发起请求时,服务器处理该请求并返回响应后,连接就会关闭。如果客户端需要请求多个资源(如 HTML 页面中的图片、CSS 文件、JavaScript 文件等),就需要建立多个连接。
限制与问题
  • 每个请求需要建立新连接:在 HTTP 1.0 中,每个请求和响应都需要建立一个新的 TCP 连接。随着 Web 内容日益复杂,页面上需要加载的资源数量增加,每个请求都要重新建立连接,导致了大量的网络开销和性能瓶颈。
  • 头部冗余:每个 HTTP 请求和响应都带有完整的头部信息,但这些头部信息往往重复,增加了传输的数据量。

2. HTTP 1.1:改进与优化(1997年)

HTTP 1.1 是对 HTTP 1.0 的重要改进,由 IETF(互联网工程任务组)在 1997 年发布,并迅速成为 Web 上的标准协议。与 HTTP 1.0 相比,HTTP 1.1 引入了多个优化和新特性,主要是为了解决性能瓶颈和提高多用户的并发性能。

主要特点
  • 持久连接(Persistent Connection):HTTP 1.1 引入了持久连接的概念。通过将“Connection: close”头去除,HTTP 1.1 默认为持久连接。这样,客户端和服务器之间可以复用同一个连接,减少了每个请求都建立新连接的开销。一个 TCP 连接可以处理多个请求和响应,直到客户端或服务器主动关闭连接。
  • 管道化(Pipelining):管道化技术允许客户端在等待服务器响应之前,先后发送多个请求,而无需等待每个请求的响应。这有助于减少请求延迟,提升性能。然而,管道化存在问题,比如响应顺序问题,当一个请求的响应延迟时,后续请求的响应也会被阻塞。
  • 缓存控制:HTTP 1.1 引入了更加精细的缓存控制机制,包括 Cache-Control、ETag、Last-Modified 等头部字段,使得浏览器能够更好地控制缓存,从而减少不必要的请求和数据传输。
  • 更多的状态码:HTTP 1.1 扩展了状态码的定义,增加了一些新的响应状态码,例如 409 Conflict411 Length Required 和 416 Range Not Satisfiable 等,提供了更好的错误处理机制。
  • Chunked Transfer Encoding:HTTP 1.1 支持分块传输编码(Chunked Transfer Encoding),允许服务器分块发送响应数据,客户端可以在接收到部分数据时开始处理,提升了响应的速度。
限制与问题
  • Head-of-line Blocking(HOLB):尽管 HTTP 1.1 引入了持久连接和管道化技术,管道化模式存在一个重大问题:如果其中一个请求的响应延迟,则后续的请求也会被阻塞,这被称为“Head-of-line Blocking”。这种情况在请求较多时会显著影响性能。
  • TCP 连接的限制:虽然持久连接降低了每个请求的连接开销,但仍然受到 TCP 的限制,浏览器通常会为每个域名建立有限数量的连接,导致需要加载多个资源时性能依然受限。

3. HTTP 2:性能革命(2015年)

随着 Web 技术的发展和用户需求的提升,HTTP 1.1 逐渐暴露出一些性能瓶颈,尤其是在处理复杂页面和高并发场景时。为了提升性能,HTTP 2 在 2015 年正式发布,成为现代 Web 上广泛采用的协议。HTTP 2 主要通过优化传输层、提高并发性和减少延迟来改进 HTTP 1.1 的局限。

主要特点
  • 二进制协议:HTTP 2 完全摒弃了 HTTP 1.x 的文本协议,采用了二进制协议。二进制协议相比文本协议具有更高的传输效率,并且解析更为简便,可以避免出现由于文本格式导致的错误和性能损失。
  • 多路复用(Multiplexing):HTTP 2 允许在一个 TCP 连接上并发地发送多个请求和响应,并且它们的顺序不会相互干扰。这样可以有效解决 HTTP 1.1 中的 Head-of-line Blocking 问题,多个请求可以同时发出并独立处理。
  • 流控制:HTTP 2 引入了流控制机制,可以有效控制数据流的传输速率,防止一方发送数据过快导致另一方处理不过来,从而避免网络阻塞。
  • 头部压缩:HTTP 2 使用 HPACK 压缩算法来压缩 HTTP 请求和响应的头部信息,减少了由于重复的头部信息造成的开销,提高了传输效率。
  • 服务器推送(Server Push):HTTP 2 支持服务器推送机制,允许服务器主动向客户端推送资源,而不需要客户端明确请求。这有助于减少延迟,特别是在页面加载时,服务器可以提前将客户端可能需要的资源推送到浏览器中。
  • 优先级和依赖关系:HTTP 2 允许客户端指定请求的优先级,服务器可以根据优先级来处理请求,这对于高性能的应用尤为重要,能够显著提升页面加载速度。
限制与问题
  • 依然依赖 TCP:HTTP 2 尽管引入了多路复用和流控制等优化机制,但它仍然基于 TCP 连接,这意味着它仍然无法克服 TCP 协议在高延迟和网络丢包情况下的局限性。
  • 服务器推送的问题:虽然服务器推送可以减少某些情况下的请求次数,但它也存在一定的问题,例如推送资源可能没有被客户端需要,从而浪费带宽。

4. HTTP 3:基于 QUIC 协议的新时代(2020年)

HTTP 3 是基于 Google 提出的 QUIC(Quick UDP Internet Connections)协议的 HTTP 协议新版本,旨在进一步提升 Web 性能,特别是在高延迟和不稳定网络环境下。HTTP 3 仍然基于 HTTP 2 的多路复用和流控制等特性,但它摒弃了传统的 TCP 协议,转而使用 QUIC 协议。

主要特点
  • 基于 QUIC 协议:HTTP 3 使用 QUIC 协议而不是 TCP。QUIC 是一个基于 UDP 的传输协议,具有低延迟和更快连接建立的优势。由于 QUIC 可以在用户端和服务器之间建立加密的传输通道,并且实现了多路复用和流控制机制,它能够有效解决 HTTP 2 中 TCP 带来的瓶颈。
  • 更快的连接建立:QUIC 协议比 TCP 协议建立连接的速度更快,因为它集成了 TLS(传输层安全协议)和握手过程,减少了连接时延。QUIC 在首次连接时仅需一次握手就可以完成加密,避免了 TCP 中多次握手的延迟。
  • 内建加密:QUIC 协议内建加密功能,确保了 HTTP 3 传输的数据始终是加密的,这比传统的 HTTP 协议更加安全。
  • 更强的抗丢包能力:由于QUIC 基于 UDP 协议,它比 TCP 更加高效地处理丢包和网络延迟问题。在 TCP 中,丢包会导致整个连接的阻塞(因为 TCP 是面向流的协议,每次丢包都需要等待重传),而 QUIC 可以独立地重传丢失的数据包,不会影响到其他数据流的传输,因此在不稳定网络环境下性能更好。
  • 减少的延迟:QUIC 支持快速恢复连接,它在中断后可以快速恢复,并且减少了重新握手的延迟。在传统的 TCP 中,每次建立新连接时需要经过三次握手,TLS 也需要额外的加密和握手过程,而 QUIC 能够在同一连接中直接进行加密和身份验证,大大减少了延迟。
  • 多路复用与流控制:与 HTTP 2 类似,HTTP 3 支持多路复用,在同一个连接上同时传输多个数据流,而且每个流可以独立地处理,避免了 HTTP 2 中的 Head-of-Line Blocking 问题。每个数据流在 QUIC 中是独立的,即使一个流丢包或出现延迟,其他流也不会受到影响。
  • 内建加密:HTTP 3 默认启用了加密,使用的是 TLS 1.3 协议。这意味着所有的 HTTP 3 流量都是加密的,确保了更高的安全性和隐私保护。
  • 更快的连接恢复和更低的延迟:相比于传统的 TCP + TLS,QUIC 协议能够提供更快速的连接建立和恢复,因为它减少了多个协议层之间的交互和握手过程。QUIC 采用了基于 UDP 的流量控制和拥塞控制,减少了连接建立的时延,特别是在需要频繁断开和重新连接的移动网络环境中表现尤为突出。
  • 抗丢包能力更强:QUIC 可以更好地应对丢包情况,在不影响其他流的情况下重传丢失的包,极大地提升了数据传输的可靠性和稳定性。
  • 自动加密:HTTP 3 强制使用加密连接,这使得 Web 安全性得到更大的提升,同时也避免了多次加密层的开销,提升了性能。
  • 广泛的支持尚需时间:虽然主要浏览器和服务器已经开始支持 HTTP 3,但因为 QUIC 协议基于 UDP,这意味着防火墙和网络运营商的支持仍然是一个挑战。某些网络可能会阻止 UDP 流量,这可能影响到 HTTP 3 的普及程度。
  • 过渡期的兼容性问题:虽然大多数现代浏览器和服务器已经开始支持 HTTP 3,但对于仍然使用 HTTP 1.1 和 HTTP 2 的环境,仍然需要维持向后兼容。服务器和客户端需要根据协议版本的支持情况选择适当的协议版本,可能会导致一些额外的复杂性。
  • HTTP 1.0 为 Web 的初步发展奠定了基础,但它的局限性很快暴露,尤其是每次请求都需要建立一个新的连接的问题。
  • HTTP 1.1 通过引入持久连接、管道化和缓存控制等特性,显著提高了性能,尤其是在客户端与服务器之间频繁通信的情况下。
  • HTTP 2 则通过采用二进制协议、支持多路复用和服务器推送等技术,进一步提高了 Web 应用的响应速度和效率。
  • HTTP 3 采用基于 UDP 的 QUIC 协议,解决了 HTTP 2 中的 TCP 拥塞问题,进一步降低了延迟,并提高了抗丢包能力,尤其在移动网络和高延迟环境下表现尤为出色。

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注