9. HTTP/3への拡張 (Extensions to HTTP/3)
HTTP/3はプロトコルの拡張を許可します。このセクションで説明されている制限内で、プロトコル拡張は追加のサービスを提供するため、またはプロトコルのあらゆる側面を変更するために使用できます。拡張は単一のHTTP/3接続の範囲内でのみ有効です。
これは、このドキュメントで定義されているプロトコル要素に適用されます。これは、新しいメソッド、ステータスコード、またはフィールドを定義するなど、HTTPを拡張するための既存のオプションには影響しません。
拡張は、新しいフレームタイプ(セクション7.2)、新しい設定(セクション7.2.4.1)、新しいエラーコード(セクション8)、または新しい単方向ストリームタイプ(セクション6.2)を使用することが許可されています。これらの拡張ポイントを管理するためのレジストリが確立されています:フレームタイプ(セクション11.2.1)、設定(セクション11.2.2)、エラーコード(セクション11.2.3)、およびストリームタイプ(セクション11.2.4)。
実装は、すべての拡張可能なプロトコル要素において未知またはサポートされていない値を無視しなければなりません (MUST)。実装は、未知またはサポートされていないタイプを持つ単方向ストリームでデータを破棄するか、読み取りを中止しなければなりません (MUST)。これは、これらの拡張ポイントのいずれも、事前の調整や交渉なしに拡張によって安全に使用できることを意味します。ただし、既知のフレームタイプが特定の場所にある必要がある場合(コントロールストリームの最初のフレームとしてのSETTINGSフレームなど(セクション6.2.1参照))、未知のフレームタイプはその要件を満たさず、エラーとして扱うべきです (SHOULD)。
既存のプロトコルコンポーネントのセマンティクスを変更する可能性のある拡張は、使用する前に交渉しなければなりません (MUST)。たとえば、HEADERSフレームのレイアウトを変更する拡張は、ピアがこれが受け入れ可能であるという肯定的な信号を与えるまで使用できません。このような修正されたレイアウトがいつ有効になるかを調整することは複雑になる可能性があります。そのため、既存のプロトコル要素の新しい定義に新しい識別子を割り当てる方が効果的である可能性があります。
このドキュメントは、拡張の使用を交渉するための特定の方法を義務付けていませんが、その目的のために設定(セクション7.2.4.1)を使用できることに注意しています。両方のピアが拡張の使用意欲を示す値を設定した場合、拡張を使用できます。設定が拡張交渉に使用される場合、設定が省略された場合に拡張が無効になるように、デフォルト値を定義しなければなりません (MUST)。