DataChannel 経由のシグナリング

警告

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

概要

DataChannel は WebRTC の機能の一つでデータの送受信を行える機能です。 Sora では WebRTC 接続確立後に、シグナリングを WebSocket 経由から DataChannel 経由に切り替えることが可能です。

目的

シグナリングを WebSocket 経由から DataChannel 経由へ切り替える機能を提供する理由として、 WebSocket は TCP ベースのため Head of Line Blocking が存在し、不安定な回線などでパケットが詰まってしまう事があるためです。 DataChannel は WebSocket とは異なり、パケットを並列でやりとりすることができるため、処理が詰まることなく、より安定した接続が維持できます。

SDK 対応状況

  • 最新版の JavaScript SDK

    • 対応済みです

  • 最新版の iOS SDK

    • 対応予定です

  • 最新版の Android SDK

    • 対応中です

  • 最新版の Unity SDK

    • 対応中です

注意

DataChannel 経由のシグナリングを有効にした場合、ラベルが違うメッセージは並列に処理されます。 そのため、ラベルをまたいだメッセージ間の順序は保証されなくなります。

例えばですが、マルチストリーム時の SDP 再交換である "type": "re-offer" によって上がる ontrack は、 参加通知 "type": "notify", "event_type": "connection.created" より先に発火することが多かったですが、 DataChannel 経由にした場合の順序は不定となります。

不明点がある場合はサポートまでお問い合わせください。

制限

  • Sora の DataChannel 機能では、クライアント側から DataChannel を作成することはできません。

    • Sora 側で用意した Label のみ利用できます

  • Sora の DataChannel 機能では、クライアント側からデータを送信するには特定の条件を満たす必要があります。

最大メッセージサイズ

DataChannel は送受信できるメッセージサイズがブラウザ毎に設定されています。

  • Chrome は 262,144 バイトに設定されています

  • Edge は 262,144 バイトに設定されています

  • Safari は 262,144 バイトに設定されています

  • Firefox は 1,073,741,823 バイトに設定されています

一つのメッセージのメッセージサイズは、これ以下のバイト数になるようにしてください。

SDP メッセージサイズ制限

DataChannel は送受信できるメッセージサイズがブラウザ毎に制限されているため、マルチストリーム利用時の SDP が最大メッセージサイズを超えた場合、挙動がおかしくなる場合があります。

現時点で 1 チャネルで多くのユーザでマルチストリームを利用する場合は DataChannel 経由でのシグナリングは利用しないようにしてください。

今後 SDP を再利用する仕組みを導入することでこの問題を解決していく予定です。

シグナリング切り替え

DTLS が確立したタイミングで、シグナリングでのやりとりを WebSocket 経由から DataChannel 経由に切り替えする仕組みです。

重要

切り替えが完了した場合でも Sora 側からは WebSocket を切断しません。

切り替えを有効にする

切り替えを有効にするには以下の 3 パターンがあります。

  • "type": "connect" 時に data_channel_signalingtrue にする

  • 認証成功時に data_channel_signalingtrue で払い出す

  • sora.confdefault_data_channel_signalingtrue にする

この設定以外は Sora SDK を利用している限り意識する必要はありません。

"type": "switched"

DataChannel へ完全に切り替わるタイミングで、 Sora は "type": "switched" を WebSocket 経由でクライアントへ送ります。

切り替わる前に WebSocket が閉じた場合、Sora はその接続が無効と判断して、接続を終了します。

WebSocket が閉じたことを無視する

Sora は、デフォルトでは接続の切断判定に WebSocket を利用しています。WebSocket が閉じると、Sora は接続が切断したと判断します。

ただし、WebSocket が閉じた場合でも、接続が切断したと判断しないようにしたい場面もあるため、ignore_disconnect_websocket という設定を用意しています。

この設定は sora.conf または "type": "connect" または認証成功時の払い出しで指定できます。

この設定を true にすることで、Sora は WebSocket が閉じてもその接続が切断したとは判断せずに、 WebRTC のやりとりを継続します。

注意

"type": "disconnect" を送らずに終了した場合、 DataChannel が切断に気付くまでは早くても 10 秒はかかります。

クライアント側の切断タイミング

もし ignore_disconnect_websockettrue にして WebSocket を切断したい場合は、かならず Sora から "type": "switched" を受け取った後にしてください。

ignore_disconnect_websockettrue の場合でも "type": "switched" を受け取る前に WebSocket を切断すると、 Sora はその接続が無効と判断して接続を終了します。

label 単位の圧縮

Sora では DataChannel 経由のメッセージを zlib/deflate で圧縮した送受信を要求する場合があります。 メッセージの圧縮や展開を要求する Label の情報は、 "type": "offer" 時に data_channels でクライアントに送ります。

詳細は 圧縮/展開 をご確認ください。

圧縮される Label

  • signaling

  • notify

  • push

  • stats

圧縮されない Label

  • e2ee

設定

deafult_data_channel_signaling

シグナリングを WebSocket から DataChannel 経由に切り替えるかどうかの設定です。 デフォルトは false です。

default_ignore_disconnect_websocket

シグナリングを DataChannel 経由に切り替えた際に、 WebSocket が閉じても、接続が切断したとみなさない設定です。

デフォルは false です。

label: signaling

WebRTC が確立する前の type: connect/offer/answer/candiate について DataChannel 経由のシグナリングでは利用できません。

"type": "ping""type": "pong" は DataChannel では利用しません。

"type": "re-offer"

重要

"type": "update" の代わりに Sora からは "type": "re-offer" が送られてきます。

マルチストリーム利用時に SDP 再交換を行う際、 Sora から送られてきます。

"type": "re-answer"

重要

"type": "update" の代わりに Sora へ "type": "re-answer" を送ります。

マルチストリーム利用時に SDP 再交換を行う際、 Sora へ送ります。

"type": "disconnect"

接続を切断する事を通知するために Sora へ送ります。

label: notify

"type": "notify" は label: notify に送られてきます。

中身は WebSocket 経由の値と変わりません。

label: push

"type": "push" は label: push に送られてきます。

中身は WebSocket 経由の値と変わりません。

© Copyright 2021, Shiguredo Inc Created using Sphinx 4.1.1