标签
note
字数
1289 字
阅读时间
6 分钟
HTTP/1.0:短连接时代
- 每个 HTTP 请求都需要建立一个新的 TCP 连接。
- 请求完成后,TCP 连接立即关闭。
- 缺点:效率低下,大量的 TCP 连接建立和关闭开销巨大。
HTTP/1.1:长连接与管道化
为了解决 HTTP/1.0 的效率问题,HTTP/1.1 引入了两个重要改进:
长连接 (Persistent Connection):
- 默认开启(
Connection: keep-alive)。 - 允许在一个 TCP 连接上传输多个 HTTP 请求和响应,避免了频繁创建和销毁连接的开销。
- 默认开启(
管道化 (Pipelining):
- 允许客户端在收到上一个响应前,连续发送多个请求。
- 缺点:服务器必须按顺序响应请求。如果第一个请求处理很慢,后续所有请求都会被阻塞。这就是著名的队头阻塞 (Head-of-Line Blocking, HOLB)。

由于队头阻塞的存在,加上浏览器对同域名下的并发 TCP 连接数有限制(通常为 6-8 个),HTTP/1.1 的性能瓶颈依然明显。
HTTP/2:多路复用
HTTP/2 的核心目标是解决 HTTP/1.1 的性能问题,其最重要的改进是多路复用 (Multiplexing)。
- 二进制分帧 (Binary Framing):HTTP/2 将所有传输的信息(请求/响应)分割为更小的消息和帧 (Frame),并对它们采用二进制格式编码。
- 流 (Stream):每个请求/响应对都被视为一个独立的“流”,每个流都有自己的 ID。
- 多路复用:在一个 TCP 连接上,多个流的帧可以并行交错地发送,接收方再根据帧头中的流 ID 将它们重新组装成完整的请求/响应。

优点:
- 彻底解决了应用层(HTTP 层)的队头阻塞问题。
- 只需一个 TCP 连接即可实现并行请求,大大提高了网络利用率。
其他特性:
- 头部压缩 (Header Compression):使用 HPACK 算法压缩请求和响应头,减少传输开销。
- 服务器推送 (Server Push):服务器可以主动向客户端推送资源,而无需等待客户端请求。
HTTP/2 的局限:TCP 队头阻塞
HTTP/2 虽然解决了应用层的队头阻塞,但其本身基于 TCP 协议,而 TCP 协议本身存在队头阻塞问题。
TCP 是一个可靠的、按序交付的协议。如果在一个 TCP 连接中,某个数据包(Packet)在网络中丢失,TCP 会等待该数据包重传并到达后,才会将后续已到达的数据包交付给上层应用。在这个等待过程中,整个 TCP 连接上的所有 HTTP/2.0 的流都会被阻塞。
HTTP/3:基于 QUIC
为了彻底解决 TCP 队头阻塞问题,HTTP/3 选择了一个全新的底层传输协议:QUIC (Quick UDP Internet Connections)。
QUIC 是一个基于 UDP 的、可靠的、多路复用的传输协议。
QUIC 的核心特性
基于 UDP,解决了 TCP 队头阻塞:
- QUIC 在一条连接上支持多个独立的流。
- 如果某个流中的一个数据包丢失,它只会阻塞该流,而不会影响其他流的传输。
更快的连接建立 (0-RTT 或 1-RTT):
- QUIC 将传输层(类 TCP)和加密层(TLS)的握手合并在了一起。
- 首次连接仅需 1-RTT(往返时间)。
- 对于已有连接,可以实现 0-RTT 的快速连接恢复,直接发送应用数据。
连接迁移 (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 动态调整的。