Skip to content
标签
note
字数
1289 字
阅读时间
6 分钟

HTTP/1.0:短连接时代

  • 每个 HTTP 请求都需要建立一个新的 TCP 连接。
  • 请求完成后,TCP 连接立即关闭。
  • 缺点:效率低下,大量的 TCP 连接建立和关闭开销巨大。

HTTP/1.1:长连接与管道化

为了解决 HTTP/1.0 的效率问题,HTTP/1.1 引入了两个重要改进:

  1. 长连接 (Persistent Connection)

    • 默认开启(Connection: keep-alive)。
    • 允许在一个 TCP 连接上传输多个 HTTP 请求和响应,避免了频繁创建和销毁连接的开销。
  2. 管道化 (Pipelining)

    • 允许客户端在收到上一个响应前,连续发送多个请求。
    • 缺点:服务器必须按顺序响应请求。如果第一个请求处理很慢,后续所有请求都会被阻塞。这就是著名的队头阻塞 (Head-of-Line Blocking, HOLB)

HTTP/1.1 队头阻塞

由于队头阻塞的存在,加上浏览器对同域名下的并发 TCP 连接数有限制(通常为 6-8 个),HTTP/1.1 的性能瓶颈依然明显。

HTTP/2:多路复用

HTTP/2 的核心目标是解决 HTTP/1.1 的性能问题,其最重要的改进是多路复用 (Multiplexing)

  • 二进制分帧 (Binary Framing):HTTP/2 将所有传输的信息(请求/响应)分割为更小的消息和帧 (Frame),并对它们采用二进制格式编码。
  • 流 (Stream):每个请求/响应对都被视为一个独立的“流”,每个流都有自己的 ID。
  • 多路复用:在一个 TCP 连接上,多个流的帧可以并行交错地发送,接收方再根据帧头中的流 ID 将它们重新组装成完整的请求/响应。

HTTP/2 多路复用

优点

  • 彻底解决了应用层(HTTP 层)的队头阻塞问题。
  • 只需一个 TCP 连接即可实现并行请求,大大提高了网络利用率。

其他特性

  • 头部压缩 (Header Compression):使用 HPACK 算法压缩请求和响应头,减少传输开销。
  • 服务器推送 (Server Push):服务器可以主动向客户端推送资源,而无需等待客户端请求。

HTTP/2 的局限:TCP 队头阻塞

HTTP/2 虽然解决了应用层的队头阻塞,但其本身基于 TCP 协议,而 TCP 协议本身存在队头阻塞问题。

TCP 是一个可靠的、按序交付的协议。如果在一个 TCP 连接中,某个数据包(Packet)在网络中丢失,TCP 会等待该数据包重传并到达后,才会将后续已到达的数据包交付给上层应用。在这个等待过程中,整个 TCP 连接上的所有 HTTP/2.0 的流都会被阻塞。

TCP 队头阻塞

HTTP/3:基于 QUIC

为了彻底解决 TCP 队头阻塞问题,HTTP/3 选择了一个全新的底层传输协议:QUIC (Quick UDP Internet Connections)

QUIC 是一个基于 UDP 的、可靠的、多路复用的传输协议。

QUIC 的核心特性

  1. 基于 UDP,解决了 TCP 队头阻塞

    • QUIC 在一条连接上支持多个独立的流。
    • 如果某个流中的一个数据包丢失,它只会阻塞该流,而不会影响其他流的传输。

    QUIC 解决了 TCP 队头阻塞

  2. 更快的连接建立 (0-RTT 或 1-RTT)

    • QUIC 将传输层(类 TCP)和加密层(TLS)的握手合并在了一起。
    • 首次连接仅需 1-RTT(往返时间)。
    • 对于已有连接,可以实现 0-RTT 的快速连接恢复,直接发送应用数据。
  3. 连接迁移 (Connection Migration)

    • QUIC 连接不依赖于 IP 地址和端口号,而是由一个 64 位的连接 ID 来标识。
    • 当客户端的网络发生变化时(如从 Wi-Fi 切换到 4G),它可以无缝地迁移连接,而无需重新建立,保证了通信的连续性。

HTTP/3 的挑战

  • 生态支持:需要操作系统、网络中间设备(防火墙、路由器)、服务器和浏览器的广泛支持。
  • UDP 优化:操作系统内核和网络硬件对 UDP 的优化程度普遍低于 TCP。
  • 协议部署:作为一个全新的协议,其推广和普及需要时间。

RTT 和 RTO

  • RTT (Round Trip Time):连接的往返时间,即从数据发送到收到对方确认的耗时。
  • RTO (Retransmission Time Out):重传超时时间。发送方在等待一个 ACK 超时后,会重新发送数据包。RTO 的值是根据 RTT 动态调整的。

参考

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写