WebRTC 優先度制御 API

W3C 勧告候補 スナップショット、

このバージョン:
https://www.w3.org/TR/2021/CR-webrtc-priority-20210318/
最新公開バージョン:
https://www.w3.org/TR/webrtc-priority/
編集者草案:
https://w3c.github.io/webrtc-priority/
以前のバージョン:
実装報告:
https://wpt.fyi/results/webrtc-priority?label=experimental&label=master&aligned
テストスイート:
https://github.com/web-platform-tests/wpt/tree/master/webrtc-priority
課題追跡:
GitHub
編集者:
Google

概要

この API は、送信 WebRTC パケットのネットワーク 制御ビット(DSCP ビット)、および輻輳時における 送信 WebRTC パケットのキューイング優先度を操作するための制御面を定義します。

この文書のステータス

この節は、この文書の公開時点における ステータスを説明するものです。他の文書がこの文書に取って代わる可能性があります。 現在の W3C 公開文書およびこの技術報告の最新版の一覧は、 https://www.w3.org/TR/ の W3C 技術報告 インデックスにあります。

この文書は、Web リアルタイム コミュニケーション・ワーキンググループにより、勧告候補スナップショットとして公開されました。 この文書は W3C 勧告となることを意図しています。 この文書は、広範なレビューの機会を確保するため、 少なくとも までは 勧告候補のままとなります。

この文書に関してコメントしたい場合は、課題を登録するか、public-webrtc@w3.org に送信してください (購読アーカイブ)。 電子メールを送信する際は、 件名に “webrtc-priority” というテキストを入れてください。 できれば次のようにしてください: “[webrtc-priority] …コメントの要約…”。 すべてのコメントを歓迎します。

勧告候補としての公開は、W3C 会員による承認を意味するものではありません。 勧告候補スナップショットは、広範なレビューを受けており、 実装経験を収集することを意図しています。

この文書が勧告案段階に進むための開始基準は、 この仕様のすべての機能について、最低 2 つの独立した相互運用可能な実装が存在することです。 これは、ワーキンググループが開発したテストスイートで定義された テストに合格することにより判断されます。ワーキンググループは、進捗を追跡するための実装報告を作成します。

この文書は、 W3C 特許ポリシーの下で運営される グループによって作成されました。 W3C は、グループの成果物に関連して行われた すべての特許開示の公開リストを維持しています。 そのページには、特許を開示するための手順も含まれています。 個人が、必須クレームを含むと その個人が考える特許について実際の知識を有している場合、 その情報を W3C 特許 ポリシー第 6 節に従って開示しなければなりません。

この文書は、2020年9月15日版 W3C Process Document により管理されます。

1. 導入

この文書は、WEBRTC の RTCRtpEncodingParameters 構造体の一部として、取り得る値が "very-low"、 "low"、"medium"、"high" である "priority" フィールドを定義します。

この機能はもともと [WEBRTC] 仕様の一部でしたが、 実装経験が不足していたため 2019 年 11 月に 削除されました。現在はこの文書の一部です。

さらに、この仕様は RTCRtpEncodingParameters にフィールドを追加し、ローカルの優先順位付けに影響を与えずに DSCP マーキングを制御できるようにします。またその逆も可能にします。

2. 優先度と QoS モデル

多くのアプリケーションは同じデータ型の複数のメディアフローを持ち、 しばしば一部のフローは他より重要です。WebRTC は、[rfc8835] および [rfc8837] で説明される優先度および Quality of Service(QoS)フレームワークを使用して、 一部のネットワーク環境で QoS の提供に役立つパケットの優先度と DSCP マーキングを提供します。優先度設定は、さまざまなフローの相対的な 優先度を示すために使用できます。優先度 API により、JavaScript アプリケーションは、priority プロパティを設定して、 特定のメディアフローがアプリケーションにとって high、 medium、low、または very low の重要度であるかをブラウザーに伝えられます。 RTCRtpEncodingParameters オブジェクトの値を、以下で定義される値のいずれかに設定します。

3. メディア優先度の拡張

3.1. RTCPriorityType 列挙型

enum RTCPriorityType {
  "very-low",
  "low",
  "medium",
  "high"
};
列挙の説明
very-low [rfc8835] の第 4.1 節および第 4.2 節を参照。 [rfc8831] で定義される "below normal" に対応します。
low [rfc8835] の第 4.1 節および第 4.2 節を参照。 [rfc8831] で定義される "normal" に対応します。
medium [rfc8835] の第 4.1 節および第 4.2 節を参照。 [rfc8831] で定義される "high" に対応します。
high [rfc8835] の第 4.1 節および第 4.2 節を参照。 [rfc8831] で定義される "extra high" に対応します。

この API を使用するアプリケーションは、重要なものの優先度を上げるよりも、 それほど重要でないものの優先度を下げる方が、多くの場合、 全体的なユーザー体験をより良くできることに注意する必要があります。

3.2. RTCRtpEncodingParameters への拡張

partial dictionary RTCRtpEncodingParameters {
  RTCPriorityType priority = "low";
  RTCPriorityType networkPriority;
};
priority, 型は RTCPriorityType、既定値は "low"

RTCRtpSender の優先度を示し、 RTCRtpSender オブジェクト間の帯域幅割り当てに影響します。これは [rfc8835] 第 4 節で指定されています。 ユーザーエージェントは、RTCRtpSender のエンコーディング間で帯域幅を自由に細分配分できます。

networkPriority, 型は RTCPriorityType
これは priority と同じ効果を持ちますが、[rfc8835] 第 4.2 節で説明されるように、生成されるパケットの DSCP マーキングにのみ影響します。

networkPriority が未設定の場合、生成されるパケットの DSCP マーキングは priority メンバーによって制御されます。

4. RTCDataChannel の拡張

partial interface RTCDataChannel {
  readonly attribute RTCPriorityType priority;
};

partial dictionary RTCDataChannelInit {
  RTCPriorityType priority = "low";
};

4.1. 新しい RTCDataChannel 属性

priority, 型は RTCPriorityType、readonly

priority 属性は、 この RTCDataChannel の優先度を返します。 優先度は、チャンネル作成時にユーザーエージェントによって割り当てられます。 取得時、この属性は [[DataChannelPriority]] スロットの値を返さなければなりません。

4.2. 新しい RTCDataChannelInit メンバー

priority, 型は RTCPriorityType、既定値は "low"

このチャンネルの優先度。

4.3. RTCDataChannel 処理手順

次の手順が DataChannel の初期化手順に追加されます:

DataChannel が内部スロット [[DataChannelPriority]] を持つものとします。

DataChannel を初期化する処理手順において、option 引数の処理に次の 手順を挿入します:

configuration の優先度値 RTCPriorityType
0 から 128 very-low
129 から 256 low
257 から 512 medium
513 以上 high

5. セキュリティとプライバシーに関する考慮事項

この API 拡張は、それ自体として新しい情報を公開するものではなく、この拡張を通じて 扱われるデータはいずれも機微な情報または個人を識別可能な情報とは見なされません。

ネットワークトラフィックを監視する能力と組み合わせると、この拡張を使用して、 仕様のどの部分が実装によって実際に尊重されているかを把握できる可能性があります。 特に、優先度を設定することで、生成されるパケットの DSCP マーキングが 変更されるかどうかを把握できます。

この仕様は、ネットワークトラフィックの優先順位付けに一般的に使用される ネットワークヘッダーの一部(DSCP マーキング)をある程度制御できるようにします。 UA が接続されているネットワークが誤って設定されているか、容量不足である場合、 設定が想定しない DSCP マーキング付きのパケットを送出することにより、 ローカルネットワーク環境に影響を与える可能性があります。

このリスクに対する対策には、適切な設定が含まれます。最も単純な設定は DSCP bleaching、つまり DSCP マーキングを常にゼロにする、または無視することです。 輻輳制御(WebRTC では常に必須)は、多くの場合ネットワーク過負荷を防ぎます。

適合性

文書 表記規則

適合性要件は、記述的な表明と RFC 2119 用語の組み合わせによって 表現されます。 この文書の規範的な部分におけるキーワード “MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、 “MAY”、および “OPTIONAL” は、RFC 2119 で説明されるとおりに 解釈されるものとします。 ただし、読みやすさのため、 この仕様ではこれらの語がすべて大文字で現れるとは限りません。

この仕様のすべてのテキストは、 明示的に非規範的と示された節、例、および注記を除き、規範的です。 [RFC2119]

この仕様における例は、“for example” という語で導入されるか、 規範的なテキストから class="example" によって 次のように区別されます:

これは参考用の例の一例です。

参考用の注記は “Note” という語で始まり、 規範的なテキストから class="note" によって 次のように区別されます:

注記、これは参考用の注記です。

適合する アルゴリズム

アルゴリズムの一部として命令形で表現された要件 (たとえば "strip any leading space characters" や "return false and abort these steps" など)は、 そのアルゴリズムを導入する際に使用された キーワード ("must"、"should"、"may" など)の意味で解釈されます。

索引

この 仕様で定義される用語

参照により 定義される用語

参考文献

規範的参考文献

[RFC2119]
S. Bradner. RFC において要件レベルを示すために用いる キーワード. 1997年3月. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[RFC8831]
R. Jesup; S. Loreto; M. Tüxen. WebRTC Data Channels. 2021年1月. Proposed Standard. URL: https://datatracker.ietf.org/doc/html/rfc8831
[RFC8835]
H. Alvestrand. WebRTC のトランスポート. 2021年1月. Proposed Standard. URL: https://datatracker.ietf.org/doc/html/rfc8835
[RFC8837]
P. Jones; et al. WebRTC QoS のための Differentiated Services Code Point (DSCP)パケットマーキング. 2021年1月. Proposed Standard. URL: https://datatracker.ietf.org/doc/html/rfc8837
[WEBRTC]
Cullen Jennings; Henrik Boström; Jan-Ivar Bruaroey. WebRTC 1.0: ブラウザー間のリアルタイム通信. 2021年1月26日. REC. URL: https://www.w3.org/TR/webrtc/

IDL 索引

enum RTCPriorityType {
  "very-low",
  "low",
  "medium",
  "high"
};

partial dictionary RTCRtpEncodingParameters {
  RTCPriorityType priority = "low";
  RTCPriorityType networkPriority;
};

partial interface RTCDataChannel {
  readonly attribute RTCPriorityType priority;
};

partial dictionary RTCDataChannelInit {
  RTCPriorityType priority = "low";
};