メインコンテンツまでスキップ

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) を割り当てることができます。