6月7日 2日前にHTTP/3 をはじめHTTP関連のRFCがHTTP wgよりたくさん発行された。
そのうち 新しいプライオリティ制御方式がRFC9218として標準化されたためまとめた。
- プライオリティ制御の必要性
- RFC7540のストリーム優先度との関係
- Priority Parameters (section4)
- Reprioritization 優先度の変更 (section6)
- PRIORITY_UPDATE frame (Section7)
- HTTP RFC Publication Study で話しました。
- 色んな参考サイト
プライオリティ制御の必要性
↓上手なプライオリティ制御が大事というRobin Marxさんの図
RFC7540のストリーム優先度との関係
RFC7540のストリーム プライオリティ制御を置き換える理由
もともと rfc7540 HTTP/2 の section 5.3で stream priority の説明をしている。リクエストの依存関係(dependency)と重さ(weight)で優先度を管理する方式をもちいる。
しかし仕様が複雑すぎたために広く実装されず、CDNの実装もbugが多かったとのこと。
つまりRFC7540のプライオリティ制御は失敗だったと言えるでしょう。
RFC9218では、よりシンプルで制約が多く、解釈を必要とせず、バリエーションも少ないシグナリングを記述することでより簡単に優先度制御をできる様にしています。
RFC7540との互換性
RFC9113 HTTP/2 よりRFC7540のプライオリティ制御はdeprecatedとなった。
相互運用性のための互換性は残してあります。
The description of frame fields and some of the mandatory handling is retained to ensure that implementations of this document remain interoperable with implementations that use the priority signaling described in RFC 7540.
from: RFC 9113: HTTP/2
SETTINGS_NO_RFC7540_PRIORITIES によってRFC9218に従うエンドポイントは相手に RFC7540のHTTP/2 プライオリティシグナルを使用しないことを通知します。
ただしクライアントはサーバからSETTINGSフレームをもらうまではサーバがHTTP/2 プライオリティシグナルを無視するかわからないため、クライアントはHTTP/2 プライオリティシグナル と このRFC9218で定められるprioritization schemeの両方を送ることが推奨される(SHOULD)。
Priority Parameters (section4)
- Urgency(緊急度) と Incremental (逐次処理可能か) の二つの値を送る。
- RFC7540よりシンプルなアプローチ
- リクエストとリスポンスどちらにも含まれることがある。
- ASCII text
- encoded using Structured Fields
- HTTP/2 に存在したStream Dependency (依存関係) は完全に廃止。
- サーバがこれに従ってスケジュールを組むことは RECOMMENDED
Urgency (緊急度)
0 (優先度最大) から7 (優先度最低) までの整数値をとる。 (デフォルト3)
urgency の 高い順に レスポンスをサーバに返して欲しい。
最も低い緊急度レベル(7)は、ソフトウェアアップデートの配信のような バックグラウンドタスクのために予約されている。この緊急度レベルは、ユーザーとの対話に影響を与える応答を取得するために 使用されるべきではない(SHOULD NOT)。
例: urgencyを 0 に設定して CSS ファイルを要求したもの。
:method = GET :scheme = https :authority = example.net :path = /style.css priority = u=0
Incremental (逐次処理可能か)
ブール値でデフォルト値は false(0)
false(0) に設定して複数同時リクエストを行う場合
- クライアントは応答を受け取りながら処理できない
- サーバは同じ緊急度を持つ非インクリメンタルな応答を一つずつ送る。
true(1) に設定して複数同時リクエストを行う場合
- サーバは同じurgencyを持つリクエストを同時並行に送る。
- 帯域を分け合うためそれぞれの応答が完了するまでに時間がかかる。
- 複数の部分的な応答 がクライアントに何らかの価値を提供できる場合有用。
例: JPEGファイルのリクエストを、urgencyパラメータを5に、incrementalパラメータをtrueに設定したもの。
:method = GET
:scheme = https
:authority = example.net
:path = /image.jpg
priority = u=5, i
Reprioritization 優先度の変更 (section6)
クライアントがリクエストを送った後、応答の優先度を変更する必要がある時にPRIORITY_UPDATE frameを送ってurgencyパラメータを変更する。
例 : JavaScriptのプリフェッチ
- urgency パラメータを u=7 (background) に設定したプリフェッチリクエストを発行
- プリフェッチの進行中にユーザーが新しい JavaScript ファイルを参照するページに移動
- ブラウザは Priority Field Value を u=0 に設定した優先度の変更シグナルを送信
複数PRIORITY_UPDATE frameが届いた場合サーバは最新の情報を用いる。
- HTTP/3では 順番は保証されないためメインよりupdateが先に到着する場合もある。
PRIORITY_UPDATE frame (Section7)
HTTP/2 ではストリーム ID を指定するのに対し、HTTP/3 では追加で type としてリクエストス トリームなのか、プッシュストリームなのかを指定します。
HTTP RFC Publication Study で話しました。
RFCが発行された3日以内に発行されたRFCについて話そうという勉強会に参加させていただきました。自分は7分だけ喋りました。他の人たちはとても長いRFCをdraftの段階から追っていてすごいなと思うとともに自分もこれからもっとRFCとかdraftとか読んでいきたいなとおもいました。
色んな参考サイト
kazuho さんが 2019年にhttp wg に送った draft書きましたメール。
http wg adoptionまでの道のりが書かれているLucas先生のブログ
robin marx 先生
For optimal web performance, just using HTTP/3 is not enough!
— Robin Marx (@programmingart) 2022年6月9日
You also need RFC 9218 for "Stream Prioritization": this steers how data from multiple responses should be mixed in a single connection: https://t.co/WBYtSlq77K
Bad prioritization can lead to terrible performance 👇 pic.twitter.com/9Vcsijkn1v