メインコンテンツまでスキップ

2. Motivation for Replacing RFC 7540 Stream Priorities (RFC 7540ストリーム優先度を置き換える動機)

RFC 7540ストリーム優先度([RFC7540]の第5.3節を参照)は、クライアントがストリームの依存関係と重みを通知して不均衡なツリーを記述する複雑なシステムです。限定的な展開と相互運用性の問題に悩まされ、HTTP/2 [HTTP/2]の改訂版で非推奨となりました。HTTP/2は、ワイヤー互換性を維持するためにこれらのプロトコル要素を保持しています([HTTP/2]の第5.3.2節を参照)。これは、本文書が記述するスキームなどの代替シグナリングが存在する場合でも、それらがまだ使用される可能性があることを意味します。

多くのRFC 7540サーバー実装は、HTTP/2優先度シグナルに対して動作しません。

優先順位付けは、サーバーがリソースについて持っている情報や、リクエストが生成される順序を使用できます。例えば、HTML文書構造の知識を持つサーバーは、ユーザーエクスペリエンスにとって重要な画像を他の画像よりも優先して配信したい場合があります。RFC 7540では、同じ条件でも異なるクライアントから非常に異なるシグナリングが生じる可能性があるため、サーバーが優先順位付けのためにクライアントからのシグナルを解釈することは困難です。本文書は、より単純で制約のあるシグナリングを記述しており、解釈が少なく、変動も少なくなります。

RFC 7540は、サーバーが中継装置に優先度シグナルを提供するために使用できる方法を定義していません。

RFC 7540ストリーム優先度は、同時に同じ接続を共有する他のリクエストに対して相対的に表現されます。このような設計を、他のリクエストがどのように接続を共有するかを知らずにリクエストを生成するアプリケーションや、HTTP/3 [HTTP/3]のようにストリーム間で強力な順序保証を持たないプロトコルに組み込むことは困難です。

独立した研究 [MARX] からの実験により、少なくともWebユースケースでは、より単純なスキームが実際に見られるより複雑なRFC 7540セットアップと少なくとも同等のパフォーマンス特性に達することが示されています。

2.1. Disabling RFC 7540 Stream Priorities (RFC 7540ストリーム優先度の無効化)

上記で示された問題と洞察は、RFC 7540ストリーム優先度の代替案([HTTP/2]の第5.3節を参照)の動機を提供しました。

本文書では、エンドポイントがHTTP/2優先度シグナルを省略または無視できるようにするために、SETTINGS_NO_RFC7540_PRIORITIES HTTP/2設定を定義します([HTTP/2]の第5.3.2節を参照)。以下に説明します。SETTINGS_NO_RFC7540_PRIORITIESの値は0または1でなければなりません (MUST)。0または1以外の値は、PROTOCOL_ERRORタイプの接続エラー([HTTP/2]の第5.4.1節を参照)として扱わなければなりません (MUST)。初期値は0です。

エンドポイントがSETTINGS_NO_RFC7540_PRIORITIESを使用する場合、最初のSETTINGSフレームで送信しなければなりません (MUST)。送信者は、最初のSETTINGSフレームの後にSETTINGS_NO_RFC7540_PRIORITIES値を変更してはなりません (MUST NOT)。変更を検出した受信者は、PROTOCOL_ERRORタイプの接続エラーとして扱ってもかまいません (MAY)。

クライアントは、HTTP/2優先度シグナルを使用していないことを示すために、値1のSETTINGS_NO_RFC7540_PRIORITIESを送信できます。SETTINGSフレームはクライアントから送信されるHTTP/2優先度シグナルより前に送信されるため、サーバーはシグナルが到着する前にシグナル処理のためにリソースを割り当てる必要があるかどうかを判断できます。値1のSETTINGS_NO_RFC7540_PRIORITIESを受信したサーバーは、HTTP/2優先度シグナルを無視しなければなりません (MUST)。

サーバーは、クライアントから送信されたHTTP/2優先度シグナルを無視することを示すために、値1のSETTINGS_NO_RFC7540_PRIORITIESを送信できます。

SETTINGS_NO_RFC7540_PRIORITIESを送信するエンドポイントは、代替優先度シグナル(例えば、第5節または第7.1節を参照)を使用することが推奨されますが、特定のシグナルタイプを使用する要件はありません。

2.1.1. Advice when Using Extensible Priorities as the Alternative (代替として拡張可能な優先度を使用する際のアドバイス)

サーバーからSETTINGSフレームを受信する前、クライアントはサーバーがHTTP/2優先度シグナルを無視しているかどうかを知りません。したがって、クライアントがサーバーからSETTINGSフレームを受信するまで、クライアントはHTTP/2優先度シグナルとこの優先順位付けスキームのシグナルの両方を送信すべきです (SHOULD)(第5節と第7.1節を参照)。

クライアントが値1のSETTINGS_NO_RFC7540_PRIORITIESパラメータを含む最初のSETTINGSフレームを受信すると、HTTP/2優先度シグナルの送信を停止すべきです (SHOULD)。これにより、無視されることがわかっている冗長なシグナルの送信が回避されます。

同様に、クライアントが値0のSETTINGS_NO_RFC7540_PRIORITIESを受信した場合、または設定パラメータが存在しなかった場合、それらのフレームは無視される可能性が高いため、PRIORITY_UPDATEフレーム(第7.1節)の送信を停止すべきです (SHOULD)。ただし、クライアントは、クライアントが直接接続しているサーバーの背後にあるノードに役立つ可能性のあるエンドツーエンドシグナルであるため、Priorityヘッダーフィールド(第5節)の送信を継続してもかまいません (MAY)。