5. ストリームと多重化 (Streams and Multiplexing)
「ストリーム (Stream)」は、HTTP/2接続内でクライアントとサーバー間で交換される、独立した双方向のフレームシーケンス (Bidirectional Sequence of Frames) です。
主な特性
- ストリームは、クライアントまたはサーバーのいずれかによって一方的に確立および使用できます
- ストリームは、いずれかのエンドポイントによって閉じることができます
- ストリーム上で送信されるフレームの順序は重要です
- ストリームは整数 (ストリーム識別子, Stream Identifier) によって識別されます
- クライアントによって開始されるストリームIDは奇数です; サーバーによって開始されるものは偶数です
- ストリームID 0は接続制御メッセージ用に予約されています
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 フロー制御 (Flow Control)
HTTP/2は、送信者が受信者を圧倒するのを防ぐために、WINDOW_UPDATEフレームを使用してフロー制御 (Flow Control) を提供します。
原則:
- フロー制御は接続固有です
- フロー制御は方向性があります
- フロー制御はクレジットベースです
- 初期フロー制御ウィンドウサイズは65,535オクテットです
- フロー制御はDATAフレームに適用されます
5.3 ストリーム優先度 (Stream Priority)
クライアントは、PRIORITYフレームまたは優先度情報を含むHEADERSフレームを使用して、ストリームに優先度 (Priority) を割り当てることができます。