R

ストリーム識別子 (HTTP)

[21] ストリーム識別子 (stream identifier) は、 ストリームを接続中で一意に識別する整数です。 すべての HTTP/2 ストリームには、ストリーム識別子がちょうど1つだけ割り当てられます。

仕様書

意味

[2] ストリームは、符号無し31ビット整数で識別されます。 これをストリーム識別子 (stream identifier) といいます。 >>1

文脈

[15] フレームのストリーム識別子 (Stream Identifier) 欄は、 ストリーム識別子を符号無し31ビット整数 (ネットワークバイト順 >>14) として表したものです。 >>13

[16] 値としては、ストリーム識別子か、接続全体を表す 0x0 を指定できます。ただしフレーム型によっては、どちらかに限定されています。

各フレーム型の項を参照。

[20] PUSH_PROMISE フレームの約束ストリームID欄には、 予約するストリームのストリーム識別子を設定します。

[23] GOAWAY フレームの最終ストリームID欄には、 一部または全部を処理したストリームのストリーム識別子を設定します。

特別な値

[3] ストリーム識別子 0x0 は、接続全体の制御メッセージに使います。 個々のストリームには使えません。 >>1, >>13

[12] ストリーム識別子 0x0 は、依存性の木の根としても使われます >>11。

[24] GOAWAY フレームの最大ストリームID欄では、 該当するストリームが無い場合には、値として 0x0 を使います >>22。

[4] HTTP/1.1 から Upgrade: h2c で切り替えた場合は、 HTTP/1.1 の要求に対する応答でストリーム 0x1 を使います >>1, >>47。切り替え完了後、クライアントでは half-closed (local) 状態となります >>1, >>47。サーバーでは half-closed (remote) 状態となります >>47。

割り当て

[5] クライアントが開始したストリームは、奇数を使わなければなりません。 サーバーが開始したストリームは、偶数を使わなければなりません。 >>1

[6] 新しいストリームのストリーム識別子は、 当該エンドポイントが開始したストリームのいずれよりも大きな値としなければなりません。 >>1

[9] ストリーム識別子は、再利用できません >>1。

[10] ストリーム識別子が枯渇したら、新しい接続を開くしかありません。 サーバーは、 GOAWAY フレームを送信してクライアントに新しい接続を開くことを求めることができます。 >>1

処理

[7] 予期しないストリーム識別子を受信したら、接続エラー PROTOCOL_ERROR としなければなりません >>1。

[18] ストリーム識別子が 0 のフレームに長さの問題があれば、 接続エラーとなります。

フレームを参照。

[8] 新しいストリーム識別子が最初に使われた時、 当該 peer が開始し未だ idle 状態にある、より小さなストリーム識別子のストリームは、 すべて暗示的に閉じられ (closed 状態となり) ます。 >>1

R ビット

[17] フレームの共通のヘッダー >>13 や PUSH_PROMISE フレーム >>19 や GOAWAY フレーム >>22 には、ストリーム識別子31ビットの直前に予約の R 欄1ビットがあります >>13, >>19。意味は定義されていません。

[26] WINDOW_UPDATE フレームにも予約の R 欄1ビットがあります >>25。その意味は定義されていません。 こちらはストリーム識別子の前ではありません。

[10] 送信者は、ヘッダーの R 欄に 0 を設定しなければなりません >>3。

[11] 受信者は、ヘッダーの R 欄を無視しなければなりません >>3。

[27] 送受信者に対する規定は、フレームの R 欄にのみ存在しています。 その他の R 欄をどう扱うべきなのかは謎です。