Skip to main content

5. 流和多路复用 (Streams and Multiplexing)

"流"是在HTTP/2连接内在客户端和服务器之间交换的独立、双向的帧序列。流具有几个重要特征:

  • 单个HTTP/2连接可以包含多个并发打开的流,任一端点交错来自多个流的帧
  • 流可以单方面建立和使用,或由客户端或服务器共享
  • 流可以由任一端点关闭
  • 流上帧的发送顺序很重要
  • 流由整数标识

5.1 流状态 (Stream States)

流的生命周期如下所示:

                       +--------+
send PP | | recv PP
,--------| idle |--------.
/ | | \
v +--------+ v
+----------+ | +----------+
| | | send H / | |
,------| reserved | | recv H | reserved |------.
| | (local) | | | (remote) | |
| +----------+ v +----------+ |
| | +--------+ | |
| | recv ES | | send ES | |
| send H | ,-------| open |-------. | recv H |
| | / | | \ | |
| v v +--------+ v v |
| +----------+ | +----------+ |
| | half | | | half | |
| | closed | | send R / | closed | |
| | (remote) | | recv R | (local) | |
| +----------+ | +----------+ |
| | | | |
| | send ES / | recv ES / | |
| | send R / v send R / | |
| | recv R +--------+ recv R | |
| send R / `----------->| |<-----------' send R / |
| recv R | closed | recv R |
`----------------------->| |<-----------------------'
+--------+

5.2 流标识符 (Stream Identifiers)

流由31位无符号整数标识。客户端发起的流必须使用奇数流标识符;服务器发起的流必须使用偶数流标识符。流标识符零(0x0)用于连接控制消息;流标识符零不能用于建立新流。

5.3 流优先级 (Stream Priority)

客户端可以通过在打开流的HEADERS帧中包含优先级信息来为新流分配优先级。在任何其他时间,可以使用PRIORITY帧更改流优先级。

优先级的目的是允许端点表达它希望对等方如何在管理并发流时分配资源。最重要的是,当发送容量有限时,可以使用优先级来选择用于传输帧的流。

5.4 错误处理 (Error Handling)

HTTP/2帧层上的错误处理有两种形式:连接错误和流错误。连接错误是阻止进一步处理帧层或损坏任何连接状态的任何错误。流错误是与特定流相关的错误,不影响其他流的处理。

5.5 扩展HTTP/2 (Extending HTTP/2)

HTTP/2允许扩展协议。协议扩展可用于提供额外的服务或修改协议的任何方面,范围从新帧类型到全新的语义。


上一章: 4. HTTP帧 (HTTP Frames)
下一章: 6. 帧定义 (Frame Definitions)