WebRTC SFU DataChannel 対応 (2)

WebRTC API の DataChannel

WebRTC の DataChannel はプロトコルはなんとなく知っている程度だったので、1から勉強することにした。WebRTC API がリリースされてからすでに5年以上が経っているため情報は腐るほどあるだろうと思ったが、ほとんど情報はなかった。

まず WebRTC API での DataChannel の使い方を調べることにした。DataChannel の使い方はとてもシンプルなものだった。

サンプルコードは以下のものをそのまま利用している。

DataChannel は RTCPeerConnection で createDataChannel を利用することで RTCDataChannel を生成しそこに onopen や onmessage といったコールバックを設定するだけだ。あとは send と close といったメソッドを呼び出して簡単に利用することができる。

Offer 側で createDataChannel をやった場合は Answer では ondatachannel に event が上がってくるのでそこから event.channel で取り出してコールバックを設定するだけ。

とてもシンプルで使いやすい。DataChannel のすごいところは createDataChannel するたびに RTCDataChannel が生成できるところだ。つまり 1 本の RTCPeerConnection の中に複数の RTCDataChannel を保持できる。

複数のパイプラインを利用することができる。creatDataChannel する際の引数に渡す label で区別するようになる。

例えばこれは音声の解析結果、これは映像の解析結果などを分けることができる。HTTP/2 っぽい機能とでも言っておけばわかりやすいだろうか。

さらに DataChannel 特有のオプションを指定することができる。

  • ordered
  • maxRetransmits
  • maxPacketLifeTime

ordered はその名の通り、順番を保証する仕組み。そもそも UDP なので順番保証がされないのを SCTP 側で吸収して順番保証を実現する。ほぼほぼ TCP 。

maxRetransmits は最大の再送回数。何回まで再送するかを指定する。

maxPacketLifeTime は最大再送時間(ミリ秒)。3000 と指定すれば 3000 ミリ秒の間再送を試みる。

maxRetransmits と maxPacketLifeTime はそれぞれ独立している。

つまり以下の 6 通りが選択可能になる

  • 再送を保証し、順番も保証する
  • 再送を保証するが、順番は保証しない
  • 再送を指定した回数だけ保証し、順番を保証する
  • 再送を指定した回数だけ保証し、順番を保証しない
  • 再送を指定した時間だけ保証し、順番を保証する
  • 再送を指定した時間だけ保証し、順番を保証しない

TCP 互換なのが一番上の「再送を保証し、順番は保証する」になる。あとは要求によって選択していけばよい。

WebRTC API の DataChannel についてはこれがほぼ全て。

Written by

Erlang/OTP / 時雨堂 / WebRTC / E2EE

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store