WebRTC
リアルタイム通信を実現するためのオープンフレームワーク
既存プロトコルを組み合わせて様々なリアルタイム通信をどう実現するかというフレームワークでしかない。
音声通信とかゲームのP2P通信とか、電話通信、ファイル交換、画面共有とかとか
NAT traversalどうするとか、圧縮どうするかとか、コーデックの対応をどうするとか
様々な目的に対して広く対応している
P2P通信のためのシグナリングをどうするか
シグナリングとはP2P相手先の通信情報を取得&コネクション確立する手続き
メッセージングプロトコルとしてはSDPを利用
通常はシグナリングサービスをインターネット上に立てることになる
シグナリングサーバーは実通信を中継しないし関与もしない。
通信相手と通信するための具体的な通信先(IP, port)情報とかをシグナリングサーバー経由交換するのみ
マッチングサーバーっぽくみえるが、やることは必要な通信相手とSDPを交換するだけのサーバー
ルーム機能や認証を行うマッチングサーバーはまた別の藻にしたほうがよい
シグナリングの具体的な実装はWebRTCでは規定していない。
SDP(+ICE)の情報を交換することのみ規定s
SDP自体はメッセージングのみ規定
通信部分にhttp,websocketを使うなどは自由。
送りあうjson の中にsdpのプレーンテキストを含めてもいいし、websocket送信でも何でもよい。
やり取りする情報には部屋情報や、ユーザー情報についての規定はない。
アプリケーション次第で送るべき情報は変わるため、標準的な実装も細かい仕様も規定されていない。
たとえば純粋なゲーム用途ならSDPにビデオ、音声コーデックまわりの情報は不要。
よくある実装例としてSDPに自身のIDと相手のID付与するのが一般的
ここらへんのIDが無いとサーバーに接続したユーザーにどのSDPを与えるか区別が区別できない
なんだかんだ共通の実装パターンはある気がするが、結局共通のシグナリングの仕様は存在しない
最低限おくるべきなのがSDPとICEというだけ。必要なら追加でおくればよい
シグナリング構成要素
SDP(Session Description Protocol)
webRTC agentとシグナリングサーバーでの情報交換プロトコル
詳細にはシグナリングサーバーで中継して必要となる通信相手との通信規定の情報を交換
どの相手にどういった情報を与えるかはシグナリングサーバーで制御
一番単純な実装だとSDPに送信元IDと送信先IDの情報を付与してSDPをシグナリングサーバーにおくる
シグナリングサーバーはsrc IDとdest IDと接続したユーザーIDを確認して、ユーザーに適切なSDPを与える
INI file ライク
code:SDP example
v=0
o=- 46117321 2 IN IP4 127.0.0.1
s=-
t=0 0
m=audio 49170 RTP/AVP 0
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=ice-ufrag:F7gI
a=ice-pwd:x9cml/YzichV2+XlhiMu8g
a=candidate:842163049 1 udp 2122260223 192.168.0.25 51782 typ host
交換情報
音声、映像を通信する際のそれぞれのコーデック、通信パラメータ情報
実際の接続先となるice canndidate,STUN,TURN情報もここで共有される
SDPを交換することで接続先、音声、映像通信する際のパラメータが互いに決定できる
プレーンなテキストフォーマットのメッセージングプロトコル
実態はSDPの要素の中の一つの情報として格納されている
SDPに含めずに別途送信してもよい。
WebRTC API
PeerConnectionという接続を確立
次の二つが一つのconnection上で構築されて利用可能
MediaStream
音声映像とうのストリームデータを流すための
ストリーム上にトラックという単位で複数のデータを流せる
一般的なWebRTCといったときはこのMediaStreamの機能を指すケースが多い。
RTP
DataChannel
バイナリーデータをながす。ゲームでの使うならは主にこれ。
SCTP。