0

HTTP/2 Stream流创建流程详解:从TCP握手到请求发送的完整过程

2026.05.23 | youres | 20次围观

上一篇文章聊了HTTP/2的多路复用原理,知道了多个请求可以在同一条TCP连接上并行传输。但多路复用只是结果,底层是怎么"起个头"让 Stream 跑起来的?今天就把这个过程拆开来,一步步说清楚。

一、HTTP/2 连接建立:从TCP到HTTP/2的握手

HTTP/2 不能凭空出现,必须先建立一条有效的 TCP 连接。流程如下:

  1. TCP 三次握手建立连接(这是基础,不变)
  2. TLS 握手协商加密参数(HTTP/2 推荐使用 TLS 1.2+,且会协商 ALPN 标识)
  3. 握手完成后,客户端发送 连接前言(Connection Preface),即一串固定字节 PRI * HTTP/2.0 SM ,服务端收到后即知道对方使用的是 HTTP/2 协议
  4. 双方各自发送 SETTINGS 帧作为连接级配置确认

这整个过程完成后,HTTP/2 的双工通道才算真正打开,接下来就可以创建 Stream 了。

二、Stream 的创建:客户端发起的主动行为

在 HTTP/2 中,Stream 由客户端主动创建,服务端被动响应。创建方式很简单——客户端发送一个HEADERS 帧,帧头中包含一个尚未使用过的奇数 Stream ID,就表示开启了一个新 Stream。

Stream ID 的分配规则

  • Stream ID 是 31 位的无符号整数
  • 客户端发起的 Stream 使用奇数 ID(1、3、5、7……)
  • 服务端发起的 Stream 使用偶数 ID(2、4、6、8……)
  • ID 必须在当前连接中保持递增,客户端每新建一个 Stream,ID 自增 2(跳过对方使用的 ID)

例如,客户端创建第一个 Stream 使用 ID=1,创建第二个 Stream 使用 ID=3,以此类推。

三、HEADERS 帧的结构与内容

HEADERS 帧是创建 Stream 的核心载体。它的帧结构包含:

  • Length:帧负载长度
  • Type = HEADERS (0x01)
  • Flags:END_HEADERS 表示头部结束,PRIORITY 表示包含流优先级信息
  • Stream Identifier:这个 Stream 的 ID

HEADERS 帧中携带的内容,就是 HTTP 请求的行和头部字段(经过 HPACK 压缩后)。比如一个简单的 GET 请求:

:method: GET
:scheme: https
:path: /api/data
:authority: example.com

这些 HPACK 压缩后的二进制数据就放在 HEADERS 帧的 payload 中。

四、服务端响应:另一个 HEADERS 帧

服务端收到客户端的 HEADERS 帧并解析后,会在同一个 Stream(相同 ID)上返回一个响应,也是一个 HEADERS 帧,携带状态码和响应头。如果响应体较大,还会有后续的 DATA 帧。

整个请求-响应过程都在同一个 Stream 内完成,多个 Stream 之间互相独立、互不阻塞,这正是多路复用的威力所在。

五、Stream 的生命周期与结束

一个 Stream 有以下几种结束方式:

  • 正常结束:发送方在最后一个 DATA 帧上设置 END_STREAM 标志,表示数据发送完毕
  • RST_STREAM 帧:任何一方可以主动发送 RST_STREAM 帧立即终止 Stream,这种情况下 Stream 直接结束,不需要等对方确认
  • 连接关闭:如果 TCP 连接断开,所有 Stream 统一结束

六、Stream 与连接的关系:一个容易混淆的点

很多初学者会问:一个 TCP 连接上能创建多少个 Stream?

答案是:理论上没有硬性限制。HTTP/2 规范并没有规定单个连接上 Stream 的上限。但在实际使用中,服务器通常会通过 SETTINGS 帧设置 max_concurrent_streams 参数来限制同一条连接上可以并行存在的 Stream 数量,防止资源被耗尽。这个值一般设置在 100~1000 之间。

七、实战:抓包看 Stream 创建过程

用 Wireshark 抓一个 HTTP/2 请求,重点关注以下几点:

  1. 找到 PRI * HTTP/2.0 SM 前言包,确认协议升级
  2. 找到客户端发出的第一个 HEADERS 帧,记录其 Stream ID(如 1)
  3. 观察服务端返回的 HEADERS 帧,Stream ID 同样是 1
  4. 如果有多次请求,关注 Stream ID 是否递增(1 to 3 to 5……)

总结

HTTP/2 Stream 的创建过程并不复杂,本质上就是:TCP + TLS 握手 to 连接前言确认 to 客户端发送带新 Stream ID 的 HEADERS 帧 to 服务端在同 ID 上响应。整个过程围绕 Stream ID 展开,ID 的奇偶规则决定了谁发起了这个 Stream。

理解了 Stream 的创建机制,再去看多路复用、优先级、流量控制等高级特性,就会发现它们都是建立在这个基础之上的。


相关阅读:

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论
881文章数 0评论数
作者其它文章