UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

WebRTCの現状 - STUN/TURN・シグナリングサーバーについて

Sam Dutton

2013/12/4

WebRTCでP2Pができるようになる・・

でも・・

WebRTCにもやはりサーバーが必要なんだ。それは

  • クライアント同士が通信できるようにメタデータを交換しないといけないから

  • ネットワークのアドレス変換(NAT)とファイアーウォールに対応するために

この記事ではシグナリングをどのように行うのか、そしてSTUN/TURNサーバーを実際に利用した時のネットワークの奇妙な振る舞いについて説明したいと考えている。おまけにWebRTCを利用したアプリケーションが複数人との接続をどのように扱い、VoIPやPSTNのようなサービスとどのような関係があるのかを解説することしたいと思う。

もしWebRTCの基礎について知識の無い場合は、WebRTCの始め方を事前に読むことをお勧めしたい。

シグナリングとは?

シグナリングとは通信処理を設定する手続きのこと。つまりWebRTCを利用するアプリケーションが通信相手と情報を交換するための準備をすることだ。その内容は

  • 通信を開始・終了するためのセッションコントロールメッセージ
  • エラーメッセージを表示
  • メディアのメタデータ、たとえばコーデックやコーデック設定、帯域やメディア形式など
  • セキュアな通信を確立するために鍵情報
  • WANから見た時のホストのIPアドレスやポート番号情報

シグナリング処理にはメッセージを交換するための方法が必要で、そのメカニズムはWebRTCのAPIには実装されていない。このアプローチはJSEP(JavaScript Session Establishment Protocol)で概要が定められている。

WebRTCの思想の背景にあるのはメディアプレーンをコントロールして十分に特定することだ、しかしシグナリングプレーンをアプリケーションからできるだけ離しておきたい。この理論的根拠は異なるアプリケーションは異なるプロトコルを利用することが望ましいかもしれない。ということだ。たとえば、SIPやJingleの通話シグナリングプロトコルや他の特定のアプリケーション、あるいは新規の利用法に対応するためだ。このアプローチで交換される重要な情報はマルチメディアセッションの詳細で、その内容はメディアプレーンを確立するために必要な通信やメディア設定情報を特定するものである。

JSEPの設計はブラウザが状態を保つことを避けるようにしている。つまり、signaling state machineとして機能するように定義している。これは問題を起こすかもしれない。たとえばシグナリングデータはページが再読み込みされるたびに情報を失われてしまうだろう。その代わり、シグナリングの状態はサーバーに保存される。

f:id:mochizuki_p:20160908105618p:plain

JSEPはピア間の要求と答えの交換を必要としている。つまり、上で挙げたメディアのメタデータのことだ。要求と答えはSDP(Session Description Protocol format)で交換される。その内容の例を以下に挙げる。

1/8