6. データチャネルのための SCTP の使用 (The Usage of SCTP for Data Channels)
6.1 SCTP プロトコルの考慮事項 (SCTP Protocol Considerations)
[RFC8261] で説明されている SCTP パケットの DTLS カプセル化を使用しなければなりません (MUST)。
この SCTP プロトコルスタックとその上位層は、複数の SCTP ストリームの使用をサポートしなければなりません (MUST)。ユーザーメッセージは順序付きまたは順序なしで、部分的または完全な信頼性で送信できます。
以下の SCTP プロトコル拡張が必要です。
- [RFC6525] で定義されたストリーム再設定拡張 (Stream Reconfiguration Extension) をサポートしなければなりません (MUST)。チャネルを閉じるために使用されます。
- [RFC6525] で定義されたストリームリセット拡張のサポートをシグナリングするために、[RFC5061] で定義された動的アドレス再設定拡張 (Dynamic Address Reconfiguration Extension) を使用しなければなりません (MUST)。
- [RFC3758] で定義された部分信頼性拡張 (Partial Reliability Extension) をサポートしなければなりません (MUST)。
6.2 SCTP アソシエーション管理 (SCTP Association Management)
WebRTC コンテキストでは、WebRTC PeerConnection の 2 つのエンドポイントが SCTP アソシエーションを開くことに合意した場合にアソシエーションが確立されます。
SCTP アソシエーション確立中にネゴシエートされるストリーム数は 65535 であるべきです (SHOULD)。これはアソシエーション確立中にネゴシエートできる最大ストリーム数です。
6.3 SCTP ストリーム (SCTP Streams)
SCTP はストリームを SCTP アソシエーション内の別の SCTP エンドポイントへの単方向論理チャネルとして定義します。ストリームは順序付き配信の概念と多重化を提供するために使用されます。
6.4 データチャネルの定義 (Data Channel Definition)
データチャネルの実装は、同じ SCTP ストリーム識別子 (Stream Identifier) を持つ受信ストリームと送信 SCTP ストリームのペアです。これにより双方向通信が可能になります。
各データチャネルは各方向に以下の属性を持ちます。
- 信頼性のあるまたは信頼性のないメッセージ転送: 信頼性のない転送の場合、同じレベルの信頼性のなさを使用します。
- 順序付きまたは順序なしのメッセージ配信
- 優先度 (Priority): 2 バイトの符号なし整数。これらの優先度は [RFC8260] の対応するストリームスケジューラの定義に従って加重公平キューイングスケジューリング優先度として解釈されなければなりません (MUST)。WebRTC での使用では、使用する値は 128(「通常以下」)、256(「通常」)、512(「高」)、または 1024(「超高」)のいずれかであるべきです (SHOULD)。
- オプションのラベル (Label)
- オプションのプロトコル (Protocol)
6.5 データチャネルのオープン (Opening a Data Channel)
データチャネルは、SCTP アソシエーション内でのネゴシエーション(帯域内ネゴシエーション)または帯域外ネゴシエーションを使用してオープンできます。[RFC8832] で帯域内ネゴシエーションのための簡単なプロトコルが規定されています。
6.6 データチャネルでのユーザーデータの転送 (Transferring User Data on a Data Channel)
データチャネルで双方向に送信されるすべてのデータは、データチャネルをオープンする際に定義された信頼性を使用して基礎となるストリームを通じて送信されなければなりません (MUST)。
SCTP ペイロードプロトコル識別子 (Payload Protocol Identifiers, PPIDs) は「ペイロードデータ」の解釈をシグナリングするために使用されます。以下の PPID を使用しなければなりません (MUST)。
WebRTC String: UTF-8 エンコードされた空でない JavaScript 文字列を識別するために使用。
WebRTC String Empty: UTF-8 エンコードされた空の JavaScript 文字列を識別するために使用。
WebRTC Binary: 空でない JavaScript バイナリデータを識別するために使用。
WebRTC Binary Empty: 空の JavaScript バイナリデータを識別するために使用。
SCTP は空のユーザーメッセージの送信をサポートしません。したがって、空のメッセージを送信する必要がある場合は、適切な PPID(WebRTC String Empty または WebRTC Binary Empty)を使用し、ゼロバイトの SCTP ユーザーメッセージを送信します。
6.7 データチャネルのクローズ (Closing a Data Channel)
データチャネルのクローズは、対応する送信ストリームをリセット [RFC6525] することでシグナリングしなければなりません (MUST)。一方が データチャネルをクローズすることを決定した場合、対応する送信ストリームをリセットします。ピアが受信ストリームがリセットされたことを確認すると、対応する送信ストリームもリセットします。完了すると、データチャネルはクローズされます。