QUICを使ってマルチキャスト配信を可能にする「Multicast Extension for QUIC」という仕様が、AkamaiのJake Holland氏らによって提案されています。
マルチキャストでデータを配信することで、よりネットワーク帯域を効率用使うことが出来ます。
まだ最初の提案であり、まだTBDとなってるところもあり、これから変わりそうだが一旦目を通しておく。
背景/関連動向
まず、この「Multicast Extension for QUIC」登場と、関連状況について簡単に説明します。
AkamaiのJake Holland氏はWebでマルチキャストを使うために幅広く活動されています。今回の「Multicast Extension for QUIC」もWebでコンテンツを配信するための流れでの提案となっています。(もちろんただのQUIC拡張ですので、用途はそれに限りません)
W3Cでは「Multicast Community Group」を設立しています。
asnokaze.hatenablog.com
また、実際にブラウザ(chromiumのfork)でマルチキャストデータを受信可能にするAPIを実装していたりします。
github.com
Multicast Extension for QUICの仕様
「Multicast Extension for QUIC」の仕様について眺めていきます。
ユニキャストで通常のQUICコネクションを確立した後に、マルチキャストチャネルとしてマルチキャストでデータ(1-RTTパケット)を送信できるようになります。もちろんマルチキャストチャネルはサーバ側からの一方向でしかQUICパケットを送れません。なお、マルチキャストの識別にはRFC4607で定義される(S,G)を用います。(マルチキャストルーティングについては下位層の話なので、この仕様では言及されません)
特徴としてはざっくりこんな感じ
- QUICコネクションはRFC9000で定義された通り
- マルチキャストデータは暗号化される(マルチキャストチャネル用の対象鍵により、他の参加者も同じデータを受信し処理できる)
- マルチキャストチャネルのデータがパケットロスした場合は、QUICコネクション経由で再送してもらえる (なお、DATAGRAMフレームも使える)
この仕様では、拡張機能のネゴシエーション、クライアントのマルチキャストチャネルの参加/離脱、フロー制御などについて定義しています。またそのために、新しい拡張フレームやエラーコードを定義します(MC_で始まる一連の拡張フレーム)。
大まかな流れ
マルチキャストでデータ受信の大まかな流れ
- クライアントは、QUICコネクション確立時にmulticast_client_paramsトランスポートパラメータで初期値をサーバに伝える
- サーバは、MC_CHANNEL_ANNOUNCEフレームを送信し今存在するマルチキャストチャネルの情報をクライアントに送信します。
- サーバは、MC_CHANNEL_JOINフレームでマルチキャストチャネルに参加を呼びかけます
- クライアントは、サーバからの要求に対しMC_CLIENT_CHANNEL_STATEフレームを返します。MC_CLIENT_CHANNEL_STATEフレームは"参加"、"拒否"、"離脱"をサーバに伝えることが出来ます
- クライアントは、マルチキャストチャネルでのデータ受信を開始します
- その後サーバがMC_CHANNEL_LEAVE でクライアントに離脱を要求するか、もしくはクライアントが自発的に離脱するとマルチキャストチャネルのデータ受信が完了します
パケロス
マルチキャストチャネルのパケロスに対して、クライアントはユニキャストのQUICコネクションで再送を要求します。
MC_CHANNEL_ACKをクライアントから送ることで、パケロスしたパケットをサーバに伝えます。サーバは、ユニキャストのQUICコネクションで該当パケットのデータを再送します (QUICでは、パケロスしてもそのパケットをそのまま送り直すのではなく、再送が必要なデータのみを送ります)。
マルチキャストチャネルで受信可能なフレーム
マルチキャストチャネルで受信可能なフレームは次のとおりです。
- PADDING Frames ([RFC9000] Section 19.1)
- PING Frames ([RFC9000] Section 19.2)
- RESET_STREAM Frames ([RFC9000] Section 19.4)
- STREAM Frames ([RFC9000] Section 19.8)
- DATAGRAM Frames (both types) ([RFC9221] Section 4)
- PATH_CHALLENGE Frames ([RFC9000] Section 19.17)
- MC_CHANNEL_PROPERTIES
- MC_CHANNEL_LEAVE (however, join must come over unicast?)
- MC_CHANNEL_INTEGRITY (not for this channel, only for another)
- MC_STREAM_BOUNDARY_OFFSET
- MC_CHANNEL_RETIRE
おわりに
今回はほんの一部の紹介でしたが、また機会があればフレームレベルで紹介したいと思います。
Webでのマルチキャスト配信は夢がありつつ、まだまだ熱量が高い領域ではありません。今後の動向が気になるところです。
技術的には大変おもしろいので追っていきたい。