ネットワーク学習帳

ネットワークに関して学んだことを記録していきます。継続こそが力なり。

WebRTC

WebRTCの歴史

  • ブラウザ上でReal Time Communicationを実現するために作られたフレームワーク
  • SIPを作ったJonathan Rosenbergが、SIPの失敗を元に考えた思想がベースになっている。端末-サーバ間やサーバ同士の通信プロトコルをガチガチに固めすぎて柔軟性が無く、策定にも時間がかかり、関連RFCも100を超えたためSIP対応と謳っていても「どこまでのSIPをサポートしていますか?」と聞く有様だったので、どんな環境でも通信できるHTTPを使ってアプリをダウンロードし、アプリの実装でシグナリングプロトコルを決められるようにしたのがWebRTCの思想。
  • GoogleとEricssonが主導して標準化と実装を進め、OpenSourceとして公開されている。
  • パソコン/Android版のChromeFirefoxOperaで実装されている。ずっと未サポートだったIEも2014年10月に ORTC API for WebRTC の実装を表明した。

 

WebRTCの構成要素(≒APIの種類)

  • Media Stream
     カメラ・マイクなどの入力デバイスからストリームを取得する。
  • RTC Peer Connetion
     NAT/Firewallを超えてP2Pを実現する。
  • RTC Data Channel
     P2Pで汎用データをトランスポートする。

 

WebRTCのアーキテクチャ

f:id:wingbeats:20150106235214p:plain

参考:http://www.webrtc.org/architecture 

WebRTCのプロトコルスタック

f:id:wingbeats:20150106235351p:plain

 

DTLS/SRTP/SCTP について

 DTLS (Datagram Transport Layer Security)

  • UDPでは許容されているパケットロスがTLSでは許容されていない。これを防ぐために内部でシーケンス番号とフラグメントオフセット、タイムアウト、再送の仕組みを提供している。TCPに近い仕組み。

  • WebRTCではUDP通信の暗号化のために公開鍵をサーバから取得するので、UDPのパケットロスによって公開鍵の取得を失敗しないためという目的もある。

SRTP (Secure Realtime Transport Protocol)

  • 映像音声をリアルタイムに送受信するプロトコルRTPはUDPにタイムスタンプ、シーケンス番号を不可しただけだが、SRTPではペイロード部を暗号化する。暗号化に使う鍵はDTLSで取得する。

SCTP (Stream Control Transmission Protocol)

  • 元はVoIP用に開発されたプロトコル。高次の信頼性と速度が求められていたこともあり、TCPUDPで差がある到達保証、順序保証、フロー/輻輳制御、マルチストリームを両方サポートしている(選べる)。

 

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)

TURN (Traversal Using Relay NAT)

  • 多段NAT等のSTUNで解決できない経路の場合は、TURNサーバがUDPパケットをRelayする。
  • サーバに負荷がかかり、オーバーヘッドも大きくなるため、P2Pのメリットが無くなる。