http2的多路复用

http2 多路复用

在网络安全和 Web 技术的语境下,多路复用(Multiplexing)是 HTTP/2 协议最核心的进化。
简单来说,它的目的是解决 HTTP/1.1 时代的“排队塞车”问题。

1. 为什么需要多路复用?(痛点)

在传统的 HTTP/1.1 中:

  • 串行传输:一个 TCP 连接一次只能处理一个请求。如果你想同时下载图片 A、网页 B 和脚本 C,浏览器必须排队。
  • 线头阻塞(Head-of-Line Blocking):如果图片 A 很大,或者服务器处理它很慢,后面的 B 和 C 就算再小也得等着。
  • 浏览器策略:为了加速,浏览器通常会针对一个域名开启 6-8 个 TCP 连接,但这会消耗大量系统资源。

2. H2 多路复用的原理

HTTP/2 改变了数据传输的底层逻辑,它引入了“二进制分帧层(Binary Framing Layer)”。

🔹 帧(Frame)与流(Stream)

  • 分帧:H2 不再发送整块的文本请求,而是将请求(Request)和响应(Response)切分成更小的二进制单位,叫做“帧”。
  • 流:每个帧都带有一个 ID 编号,标识它属于哪个“流”。

🔹 实现方式

在同一个 TCP 连接上,客户端和服务器可以同时发送成百上千个不同请求的帧。

  • 乱序发送:图片 A 的第 1 帧、脚本 C 的第 1 帧、网页 B 的第 1 帧可以交替发出。
  • 重组接收:接收方根据每个帧身上的“流 ID”,将它们重新组装回完整的请求或响应。

形象比喻:

  • HTTP/1.1:像单车道,货车不走完,后面的轿车不能过。
  • HTTP/2:像快递物流系统。所有的货(请求)都被拆成小包裹(帧),混在一起装进一辆大卡车(TCP 连接)。到了目的地,快递员再根据包裹上的单号(流 ID)把它们分给不同的人。

3. 多路复用对“翻墙”或“隐蔽通信”的意义

当你使用 v2ray-plugin 的 H2 模式时,多路复用带来了巨大的安全和性能优势:

  • ⚡ 极低的延迟:
    由于不需要为每个请求重新握手,也不存在线头阻塞,网页加载速度显著提升,尤其是当代理后面有大量小文件加载时。
  • 🎭 完美的行为伪装:
    现代 Web 浏览器在访问正常网站(如 YouTube、Google、淘宝)时,几乎全是使用 H2 协议。H2 的流量特征就是:一个 TCP 连接内充斥着大量乱序的加密数据帧。
    这正好与 SS 加密后的流量特征完美契合。GFW 很难区分这到底是“浏览器在加载几十张小图片”还是“你在通过代理下载一个大文件”。
  • 🚀 资源节省:
    只需要维持一个 TCP 长连接,减少了服务器和客户端的 CPU 及内存开销,也降低了被防火墙检测到异常连接数的风险。

4. 总结:H2 的本质改进

特性 HTTP/1.1 HTTP/2 (H2)
连接模型 每个请求可能需要新连接或排队 一个连接处理所有请求
数据格式 文本(容易被特征识别) 二进制(更难被解析)
传输顺序 必须按顺序(先进先出) 乱序传输,实时重组
效率 低,容易产生延迟 极高,压榨带宽潜力

💡 缺陷

虽然 H2 解决了 HTTP 层面的线头阻塞,但它依然跑在 TCP 上。如果网络环境极差导致 TCP 丢包,整个 H2 连接依然会卡住。这就是为什么现在业界开始推广基于 UDP 的 HTTP/3 (QUIC) 协议。