[21] [DFN[[RUBYB[ストリーム識別子]@en[stream identifier]]]]は、
[[ストリーム]]を[[接続]]中で一意に識別する[[整数]]です。
すべての [[HTTP/2]] [[ストリーム]]には、[[ストリーム識別子]]がちょうど1つだけ割り当てられます。

* 仕様書

[REFS[
- [14] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-2.2>
- [47] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-3>
- [13] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-4.1>
- [1] '''[CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-5.1.1>'''
- [11] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-5.3.1>
- [19] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-6.6>
- [22] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-6.8>
- [25] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-6.9>
]REFS]

* 意味

[2] [[ストリーム]]は、[[符号無し]]31ビット[[整数]]で識別されます。
これを[DFN[[RUBYB[[[ストリーム識別子]]]@en[stream identifier]]]]といいます。 [SRC[>>1]]

* 文脈

[15] [[フレーム]]の[DFN[[RUBYB[[[ストリーム識別子]]]@en[Stream Identifier]]]]欄は、
[[ストリーム識別子]]を[[符号無し]]31ビット[[整数]]
([[ネットワークバイト順]] [SRC[>>14]]) として表したものです。 [SRC[>>13]]

[16] 値としては、[[ストリーム識別子]]か、[[接続]]全体を表す [CODE[[[0x0]]]]
を指定できます。ただし[[フレーム型]]によっては、どちらかに限定されています。

;; 各[[フレーム型]]の項を参照。

[20] [CODE(HTTP)@en[[[PUSH_PROMISE]]]] [[フレーム]]の[[約束ストリームID]]欄には、
予約する[[ストリーム]]の[[ストリーム識別子]]を設定します。

[23] [CODE(HTTP)@en[[[GOAWAY]]]] [[フレーム]]の[[最終ストリームID]]欄には、
一部または全部を処理した[[ストリーム]]の[[ストリーム識別子]]を設定します。

* 特別な値

[3] [[ストリーム識別子]] [CODE[0x0]] は、[[接続]]全体の[[制御メッセージ]]に使います。
個々の[[ストリーム]]には使えません。 [SRC[>>1, >>13]]

[12] [[ストリーム識別子]] [CODE[0x0]] は、[[依存性]]の[[木]]の[[根]]としても使われます
[SRC[>>11]]。

[24] [CODE(HTTP)@en[[[GOAWAY]]]] [[フレーム]]の[[最大ストリームID]]欄では、
該当する[[ストリーム]]が無い場合には、値として [CODE[[[0x0]]]]
を使います [SRC[>>22]]。

[4] [[HTTP/1.1]] から [CODE(HTTP)[[[Upgrade:]] [[h2c]]]] で切り替えた場合は、
[[HTTP/1.1]] の[[要求]]に対する[[応答]]で[[ストリーム]] [CODE[0x1]]
を使います [SRC[>>1, >>47]]。切り替え完了後、[[クライアント]]では [[half-closed (local)]]
状態となります [SRC[>>1, >>47]]。[[サーバー]]では [[half-closed (remote)]]
状態となります [SRC[>>47]]。

* 割り当て

[5] [[クライアント]]が開始した[[ストリーム]]は、[[奇数]]を使わなければ[['''なりません''']]。
[[サーバー]]が開始した[[ストリーム]]は、[[偶数]]を使わなければ[['''なりません''']]。 [SRC[>>1]]

[6] 新しい[[ストリーム]]の[[ストリーム識別子]]は、
当該[[エンドポイント]]が開始した[[ストリーム]]のいずれよりも大きな値としなければ[['''なりません''']]。
[SRC[>>1]]

[9] [[ストリーム識別子]]は、再利用できません [SRC[>>1]]。

;; [10] [[ストリーム識別子]]が枯渇したら、新しい[[接続]]を開くしかありません。
[[サーバー]]は、 [CODE[[[GOAWAY]]]] [[フレーム]]を送信して[[クライアント]]に新しい[[接続]]を開くことを求めることができます。 [SRC[>>1]]

* 処理

[7] 予期しない[[ストリーム識別子]]を受信したら、[[接続エラー]]
[CODE[[[PROTOCOL_ERROR]]]] としなければ[['''なりません''']] [SRC[>>1]]。

[18] [[ストリーム識別子]]が 0 の[[フレーム]]に長さの問題があれば、
[[接続エラー]]となります。

;; [[フレーム]]を参照。

[8] 新しい[[ストリーム識別子]]が最初に使われた時、
当該 [[peer]] が開始し未だ [[idle]] 状態にある、より小さな[[ストリーム識別子]]の[[ストリーム]]は、
すべて暗示的に閉じられ ([[closed]] 状態となり) ます。 [SRC[>>1]]

* [CODE[R]] ビット

[17] [[フレーム]]の共通の[[ヘッダー]] [SRC[>>13]] や
[CODE(HTTP)@en[[[PUSH_PROMISE]]]] [[フレーム]] [SRC[>>19]] や
[CODE(HTTP)@en[[[GOAWAY]]]] [[フレーム]] [SRC[>>22]]
には、[[ストリーム識別子]]31ビットの直前に予約の
[DFN[[CODE[R]]]] 欄1ビットがあります [SRC[>>13, >>19]]。意味は定義されていません。

[26] [CODE(HTTP)@en[[[WINDOW_UPDATE]]]] [[フレーム]]にも予約の [CODE[R]]
欄1ビットがあります [SRC[>>25]]。その意味は定義されていません。
[WEAK[こちらは[[ストリーム識別子]]の前ではありません。]]

[10] [[送信者]]は、[[ヘッダー]]の [[R]] 欄に 0 を設定しなければ[['''なりません''']] [SRC[>>3]]。

[11] [[受信者]]は、[[ヘッダー]]の [[R]] 欄を無視しなければ[['''なりません''']] [SRC[>>3]]。

;; [27] 送受信者に対する規定は、[[フレーム]]の [[R]] 欄にのみ存在しています。
その他の [[R]] 欄をどう扱うべきなのかは謎です。