1. HTTP/1.1 流水线(Pipelining)
在流水线模式下,客户端确实可以一口气把请求 A、请求 B、请求 C 全发过去,不用等一个好才发下一个。
-
致命死穴:响应必须按顺序返回。 服务器 收到 A、B、C 后,必须 严格按照 A B C 的顺序 把结果吐给客户端。
-
结果: 如果请求 A 是一个超级复杂的数据库查询,需要耗时 5 秒,而请求 B 和 C 只需要 0.01 秒,服务器明明已经把 B 和 C 做好了,也必须憋着,先等 A 发送完,才能发送 B 和 C。这就是队头阻塞(Head-of-Line Blocking)。
2. HTTP/2 多路复用(Multiplexing)
HTTP/2 引入了“帧(Frame)”和“流(Stream)”的概念,彻底改变了传输方式。
-
打破规则:响应可以交错返回(乱序)。
-
客户端把请求 A、B、C 拆成一小块一小块的“数据包”(帧),贴上各自的标签(Stream ID),混合在一个 TCP 连接里发过去。
-
结果: 服务器同时处理 A、B、C。如果 B 和 C 先做好了,服务器就先把 B 和 C 的数据块贴上标签丢回给客户端。客户端收到后,根据标签自己组装。即使 A 被卡住了,完全不会影响 B 和 C 的传输。
核心区别总结
我们可以用一张直观的表格来看清它们的差异:
| 特性 | HTTP/1.1 流水线 (Pipelining) | HTTP/2 多路复用 (Multiplexing) |
|---|---|---|
| 发送请求 | 连续发送,不用等上一个响应 | 并发发送,完全打散传输 |
| 返回响应 | 必须严格按请求顺序返回 | 谁先好谁先回,可以交错乱序 |
| 队头阻塞 | 存在(如果第一个响应慢,后面全卡死) | 彻底解决(应用层无队头阻塞) |
| 实际应用 | 绝大多数浏览器默认禁用 | 现代互联网的标准配置 |
💡 总结一句话: > HTTP/1.1 的流水线只是 “敢于先发送”,但收货时还是得老老实实排队;而 HTTP/2 的多路复用才是真正的“并发处理”**,彻底解耦了请求和响应的顺序。所以它们并不是同一种东西。