ストリーム
QUIC におけるストリームは軽量で順序付けられたバイトストリームの概念を提供します。
QUIC には2種類の基本的なストリームが存在します:
イニシエータからピアへデータを1方向に転送する単方向ストリーム
お互いにデータを送ることができる双方向ストリーム
どちらのエンドポイントも、両方のタイプのストリームを作成でき、交互に配置した複数ストリームのデータを並行で送信したり中止したりできます。
QUIC のコネクションを経由してデータを送る際には、1つ以上のストリームが利用されます。
フロー制御
ストリームは各自独立にフロー制御が行われ、エンドポイントがメモリの割当量を制限したり、バックプレッシャーをかけたりできるようになっています。
ストリーム作成も同様にフロー制御が行われ、それぞれのピアが一時的に許可される最大 Stream ID を宣言します。
ストリームの識別名
ストリームは 62bit の符号なし整数により識別され、この整数を Stream ID と呼びます。
Stream ID の最下位 2bit はストリームの種類 (単方向もしくは双方向) とストリームのイニシエータの識別に利用されます。
Stream ID の 最下位 bit (0x1) は ストリームのイニシエータを識別します。
クライアントは偶数のストリームを開始し (このときの最下位 bit は 0 に設定されます)、サーバーは奇数のストリームを開始します (このときの最下位 bit は 1 に設定されます)。
Stream ID の最下位 2bit (0x2) は 単方向ストリームと双方向ストリームの両者を区別します。
単方向ストリームでは常にこの bit は 1 に設定され、双方向ストリームではこの bit は 0 に設定されます。
ストリームの並行性
QUIC では任意の数のストリームを並行で操作することができます。エンドポイントは最大の Stream ID を制限することにより、並行して受信できる有効な入力ストリームの個数を制限できます。
Stream ID の上限はエンドポイント特有で、設定を受け取ったピアにのみ適用されます。
データの送受信
エンドポイントはデータの送受信にストリームを利用します。それがつまるところストリームの究極の目的です。
ストリームは順序付けられたバイトストリームの概念です。
別々のストリームは必ずしも元の順序で配信されるとは限りません。
ストリームの優先順位付け
ストリームに割り当てられたリソースに正しい優先順位付けがされているのならば、ストリームの多重化はアプリケーションのパフォーマンスに莫大な効果を与えます。
HTTP/2 のような他の多重化されたプロトコルでの経験から言って、効果的な優先順位付けの計画はパフォーマンスに莫大なプラスの影響を持ちます。
QUIC 自身は優先順位付けの情報を交換するフレームを持ちません。そのかわり、QUIC を利用するアプリケーションからの優先順位情報を信頼します。
QUIC を利用するプロトコルはそのアプリケーションのセマンティクスに合った優先順位付けのスキームを定義することが出来ます。
HTTP/3 に QUIC を利用する場合、HTTP レイヤーにおいては優先順位付けは不要です。
HTTP/2 の優先順位付けモデルは、それが過度に複雑で多くの HTTP/2 サーバにおいて使用および実装されていないことを懸念され、批判されています。現時点では、優先順位付けはメインの HTTP/3 仕様から削除されており、個別の仕様としての取り組みが行われています。
Last updated