流和多路复用
“流”是一个在客户端和服务端间通过 HTTP/2 连接进行数据交换的独立的、双向的帧序列。流有以下几个重要的特点:
- 一个单独的 HTTP/2 连接能够包含多个同时打开的流,各个端点通过多个流交换帧。
- 流可以被客户端或服务端单方面的建立或共享。
- 流可以被任何一个端点关闭。
- 流内帧的发送顺序是重要的。接收者按照接收顺序进行处理。特别是,HEADERS 和 DATA 帧的顺序是具有语义的。
- 流以一个整数进行标识。流标识符由发起该流的端点分配。
流状态
流的生命周期如图 1 所示:
+--------+
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 |
`----------------------->| |<----------------------'
+--------+
send: endpoint sends this frame
recv: endpoint receives this frame
H: HEADERS frame (with implied CONTINUATIONs)
PP: PUSH_PROMISE frame (with implied CONTINUATIONs)
ES: END_STREAM flag
R: RST_STREAM frame
图1:流状态