ストリーム

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