WebRTC
WebRTCの歴史
- ブラウザ上でReal Time Communicationを実現するために作られたフレームワーク。
- SIPを作ったJonathan Rosenbergが、SIPの失敗を元に考えた思想がベースになっている。端末-サーバ間やサーバ同士の通信プロトコルをガチガチに固めすぎて柔軟性が無く、策定にも時間がかかり、関連RFCも100を超えたためSIP対応と謳っていても「どこまでのSIPをサポートしていますか?」と聞く有様だったので、どんな環境でも通信できるHTTPを使ってアプリをダウンロードし、アプリの実装でシグナリングプロトコルを決められるようにしたのがWebRTCの思想。
- GoogleとEricssonが主導して標準化と実装を進め、OpenSourceとして公開されている。
- パソコン/Android版のChrome、Firefox、Operaで実装されている。ずっと未サポートだったIEも2014年10月に ORTC API for WebRTC の実装を表明した。
WebRTCの構成要素(≒APIの種類)
- Media Stream
カメラ・マイクなどの入力デバイスからストリームを取得する。 - RTC Peer Connetion
NAT/Firewallを超えてP2Pを実現する。 - RTC Data Channel
P2Pで汎用データをトランスポートする。
WebRTCのアーキテクチャ
参考:http://www.webrtc.org/architecture
WebRTCのプロトコルスタック
DTLS/SRTP/SCTP について
DTLS (Datagram Transport Layer Security)
-
UDPでは許容されているパケットロスがTLSでは許容されていない。これを防ぐために内部でシーケンス番号とフラグメントオフセット、タイムアウト、再送の仕組みを提供している。TCPに近い仕組み。
-
WebRTCではUDP通信の暗号化のために公開鍵をサーバから取得するので、UDPのパケットロスによって公開鍵の取得を失敗しないためという目的もある。
SRTP (Secure Realtime Transport Protocol)
SCTP (Stream Control Transmission Protocol)
RTP Peer Connection
※ 前述の通り、以下のシグナリングはWebRTCのスコープ外です。
WebRTCのP2P接続ではアプリケーションが下記のトランスポートとプロトコルを選択して使うのが一般的という話です。
SDP (Session Description Protocol)
- P2Pで接続するメディアの種類(音声、映像)やメディアの形式(コーデック)、転送プロトコル、自身のIPアドレスやUDPポート番号等を記した文字列を、P2P接続するブラウザ同士で交換するセッション記述用プトロコル。
- 呼び出し元がシグナリングサーバを介してSDPをOfferし、呼ばれる側がシグナリングサーバを介してSDPをAnswerする。
- SDPは一部変わっただけでも全ての情報を送らなければならず、主に性能面が問題視されている。仕様が分かりづらいという面もあるらしい。SDPの情報の一部を送れるようにしたTrickle-ICEやSDPを使わないORTCが最近出てきている。
ICE (Interactive Connectivity Establishment)
- P2Pで接続するブラウザの通信経路を示した文字列(ICE Candiddate)を交換し、ネットワーク的に最短の通信経路上にP2P接続を確立する。
- まず同一NAT下にある可能性を考慮し、直接クライアント同士のP2P接続を試みる。
- 次に外部のSTUNサーバを用いて外部から見たIPアドレスとポートによるP2P接続を試みる。
- それでも接続できなかった場合はTURNサーバを経由した接続を試みる。
STUN (Simple Traversal of UDP through NATs)
- STUNサーバがNATで書き換えられたグローバルIPアドレスとポートを返す。
- 通信相手にグローバルIPアドレスとポートを伝える。
- Peer同士がそのアドレス宛に通信する。