HTTP/3 DATAGRAMの優先度制御方式を定義した「HTTP Datagram Prioritization」が提出されました。
これについて簡単に眺めていきます。
目次
背景: HTTP/3 DATAGRAMについて
下記の記事で書いた通り、HTTP/3の拡張仕様でパケロス時に再送を必要としないアプリケーションデータの送受信ができるようになっています。
asnokaze.hatenablog.com
特に、WebSocketの次世代版ともいわれるWebTransportや、HTTP/3コネクションをトンネルさせるMASQUEといった仕様で使われるものです。
- WebTransport over HTTP/3のプロトコル仕様 - ASnoKaze blog
- HTTP/3で接続してVPNとして使うMASQUEプロトコルの提案仕様 - ASnoKaze blog
このDATAGRAM拡張仕様では、優先度制御については具体的な方法を指定していません。
(なおDATAGRAMはHTTP/3のみに限定されず、HTTP/2でも使用されます)
補足: HTTP/3の優先度
HTTPでは、一つのコネクション上で複数のリクエストを並列的に送ります。そのときに、例えばWebページのレンダリングに必要なファイルの優先度をあげることで、結果としてWebページの表示を早くします。
通常のHTTPメッセージの送受信の優先度は、クライアントからサーバに対してレスポンスの優先度を通知します。
HTTPリクエストでpriorityヘッダで、u(urgency)で優先順位と、i(incremental)で並列処理出来るか示します。
:method = GET :scheme = https :authority = example.net :path = /menu.png priority = u=5, i
また、通信中の優先度の変更はPRIORITY_UPDATEフレームを利用します。
この方法はHTTP/3以外でも利用できます。詳しくは以前書いた通り。
asnokaze.hatenablog.com
このHTTPの優先度制御では、DATAGRAM拡張の優先度制御については具体的な方法を指定していません。
DATAGRAM の優先度
本題です。「HTTP Datagram Prioritization」ではDATAGRAM通信の優先度制御方法を定義します。
HTTP/3のDATAGRAMは必ず関連付けられるHTTPリクエストがあります。そのリクエストで、通常のHTTPメッセージの優先度制御と同じように、DATAGRAMの優先度を制御します。意図的にシンプルな設計としているようです。
priorityヘッダでduを付けることで、DATAGRAMの優先度を指定できます。
:method = GET :scheme = https :authority = example.net :path = /style.css priority = u=0, du=2
優先度の高いものから送信し、同じ優先度のものはラウンドロビンされます。
一つのHTTPリクエストに対して複数のDATAGRAMフローを指定できるのですが、各コンテキスト毎に優先度制御方式は指定しません。
また、優先度の更新は通常のHTTP優先度制御と同様、PRIORITY_UPDATEフレームで行います。
IETF 111の発表スライド
発表予定でしたが、時間が足りなかった模様。
内容はまとまってるので、おすすめ。
https://datatracker.ietf.org/meeting/111/materials/slides-111-masque-http-dgram-priorities-01