DataChannel 機能

警告

DataChannel 機能は実験的機能のため正式版では仕様が変更される可能性があります

概要

DataChannel は WebRTC の機能の一つでデータの送受信を行える機能です。

この資料は Sora が持っている DataChannel の機能の詳細について説明します。

目的

この資料は主に Sora SDK 開発者、または Sora SDK を利用しない Sora のクライアントの開発者向けに書かれているため、かなり細かい仕様まで書かれています。 SDK ユーザは先に DataChannel 経由のシグナリング をご確認ください。

注意

Sora の DataChannel は P2P で DataChannel を利用する場合とは異なります。

  • Sora が生成する DataChannel を変更することはできません

  • Sora が生成する DataChannel を追加することや削除することはできません

  • Sora が生成する DataChannel の Label 名は変更できません

禁止

  • クライアント側から DataChannel を開いたり閉じたりはできません

条件

  • クライアント側から send する場合は label 毎に条件があります

未実装

  • Sora 2021.1 では orderedmaxRetransmitsmaxPacketLifeTime の設定には対応していません。

"type": "offer" 時の "data_channels"

"type": "offer""data_channels" が含まれることを確認することで、DataChannel への切り替えが必要と判断することが可能です。

切り替えが不要な場合は "data_channels" は送られてきません。

"type": "switched"

Sora 側ですべての DataChannel が確立したと判断したタイミングで WebSocket 経由で "type": "switched" メッセージが送られてきます。

クライアントはこのメッセージが送られてきてから DataChannel 経由でメッセージを送るようにしてください。

  • "type": "switched" には "ignore_disconnect_websocket": boolean が含まれています。

    • クライアント側が WebSocket を切断しても Sora が無視して切断と見なさないかどうかが送られてきます

ignore_disconnect_websocket が true の場合

ignore_disconnect_websockettrue の場合は "type": "switched" を受け取ったタイミングから、 WebSocket を切断することが可能になります。

この場合はクライアント側で WebSocket を切断してください。

圧縮/展開

"type": "offer"data_channels で送られてくる compresstrue の label を処理する場合、メッセージの送受信には zlib/deflate での圧縮/展開が必要になります。

以下は "type": "offer" で送られてくる data_channels の例です。

"type": "offer",
"data_channels": [
  {
    "compress": true,
    "label": "stats"
  },
  {
    "compress": false,
    "label": "e2ee"
  },
  {
    "compress": true,
    "label": "push"
  },
  {
    "compress": true,
    "label": "notify"
  },
  {
    "compress": true,
    "label": "signaling"
  }
]
  • Sora は圧縮時に zlib ヘッダーを付けて送ってきます

  • Sora は展開時に zlib ヘッダーを必要とします

  • Sora は圧縮レベルは default を利用します

クライアント側の終了処理

DataChannel を利用した際の クライアント側の終了処理 について説明していきます。

WebSocket の切断

  • Sora から WebSocket が切断されて、 "type": "switched" が送られてきていない

    • WebSocket と DataChannel を切断し、終了処理に入る

  • Sora から WebSocket が切断されて、 "type": "switched", "ignore_disconnect_websocket": true が送られてきていた

    • 何もしない

  • Sora から WebSocket が切断されて、 "type": "switched", "ignore_disconnect_websocket": false が送られてきていた

    • WebSocket と DataChannel を切断し、終了処理に入る

DataChannel の切断

  • どれかの DataChannel が Sora から切断された

    • WebSocket と他のすべての DataChannel を切断し、終了処理に入る

    • WebSocket の close code と合わせるためにコードが必要な場合は 4999 を利用する

"type": "disconnect" による切断

  • "type": "switched" が送られて来ていない

    • WebSocket 経由で "type": "disconnect" を送る

    • N ミリ秒たっても切断されない場合は WebSocket を切断し、終了処理に入る

  • "type": "switched" が送られてきている

    • DataChannel 経由で "type": "disconnect" を送る

    • N ミリ秒たっても切断されない場合は WebSocket と DataChannel を切断し、終了処理に入る

  • "type": "switched", "ignore_disconnect_websocket": false が送られてきていて、 WebSocket は切断していない

    • DataChannel 経由で "type": "disconnect" を送る

    • N ミリ秒たっても切断されない場合は WebSocket と DataChannel を切断し、終了処理に入る

  • "type": "switched", "ignore_disconnect_websocket": true が送られてきていて、 WebSocket も切断している

    • DataChannel 経由で "type": "disconnect" を送る

    • N ミリ秒たっても切断されない場合は DataChannel を切断し、終了処理に入る

Sora SDK の N ミリ秒のデフォルト値は 3000 ミリ秒です。

クライアント側で切断判断を行いたい場合

注意

ユースケースに依存するため、 SDK 側では提供しておらず、アプリケーション側で実装する必要があります。

  • "type": "switched", "ignore_disconnect_websocket": true が送られてきていて、 DataChannel メッセージが送られてこなくなった場合

    • DataChannel 経由で "type": "disconnect" を送る

    • すべての DataChannel を切断し、終了処理に入る

"type": "switched" 後の WebSocket での "type": "ping" / "type": "pong" について

WebSocket から DataChannel に切り替わると、 WebSocket の "type": "ping" を送る間隔が 5 秒から 30 秒に引き延ばされます。 さらに Sora が "type": "pong" を期待しなくなります。

ラベル毎の DataChannel 機能説明

Sora 2021.1 の時点ではすべての DataChannel は順番あり、信頼性ありです。

label: signaling

順番

あり

信頼性

あり

圧縮

あり

  • "type": "re-offer"

    • WebSocket シグナリングのサーバーが送る "type": "update" と同様です

  • "type": "re-answer"

    • WebSocket シグナリングのクライアントが送る "type": "update" と同様です

  • "type": "disconnect"

    • WebSocket シグナリングの "type": "disconnect" と同様です

label: notify

順番

あり

信頼性

あり

圧縮

あり

  • "type": "notify"

    • WebSocket シグナリングのサーバーが送る "type": "notify" と同様です

label: push

順番

あり

信頼性

あり

圧縮

あり

  • "type": "push"

    • WebSocket シグナリングのサーバーが送る "type": "push" と同様です

label: e2ee

順番

あり

信頼性

あり

圧縮

なし

  • WebSocket シグナリングのクライアントやサーバーが送るバイナリメッセージと同様です

label: stats

順番

あり

信頼性

あり

圧縮

あり

DataChannel から新しく追加されたタイプです

今まで "type": "ping""type": "pong" 内部でやりとりしていた stats は DataChannel 経由では独立しました。

Sora から {"type": "req-stats"} が送られてきたら {"type": "stats", "reports": [{}, ...]}reports の中に "type": "pong" で入れていた統計情報を入れて送り返してください。

  • "type": "req-stats"

    • Sora からクライアントに stats 情報を要求します

  • "type": "stats"

    • クライアントから Sora に stats 情報を送ります

DataChannel 関連の設定

data_channel_stats_timer_interval

シグナリングを DataChannel 経由に切り替えた際に、 Sora からクライアントへ統計情報の要求を送る間隔の設定です。

デフォルトは 5 s です。

dcsctp_association_max_retrans

シグナリングを DataChannel 経由に切り替えた際に、 SCTP プロトコルのエンドポイントの障害を判定する最大再送回数の設定です。 ここで設定する数値を超えたときに、エンドポイントに障害があると判断し、 Sora は接続を破棄します。

デフォルトは 10 です。

dcsctp_heartbeat_interval

シグナリングを DataChannel 経由に切り替えた際に、 SCTP プロトコルのハートビートを送る間隔の設定です。

デフォルトは 30 s です。

エンドポイント障害検出

Sora では SCTP において再送した Data チャンクや HeartBeat チャンクを送って 10 回連続で 1 度も SACK チャンクか HeartBeatAck チャンクが返ってこない場合に、 エンドポイント障害が起きていると検出し、切断を行います。

この値は sora.confdcsctp_association_max_retrans で設定することが可能です。

© Copyright 2021, Shiguredo Inc Created using Sphinx 4.1.1