WebRTC
WebRTC(Web Real-Time Communication)は、ブラウザ間 でピアツーピア接続 を確立 し、音声 ・映像 ・データをリアルタイムで交換 する JavaScript API。
概要
- ブラウザ標準 サポート、プラグイン不要
- ピアツーピア(P2P)接続 、低遅延
- 音声 ・映像 ・データ転送 に対応
- Signaling Server で接続 を調整
WebRTC vs WebSocket

| 特性 | WebRTC | WebSocket |
|---|---|---|
| 接続 モード | P2P | Client-Server |
| 転送 プロトコル | UDP(主 に) | TCP |
| 遅延 | 極 めて低 い | 低 い |
| 用途 | リアルタイム音声 映像 | リアルタイムメッセージ |
WebRTC が WebSocket を必要 とする理由
- UDP はデータを検証 しない、重要 なデータの転送 には不向 き
- WebRTC には内蔵 の Signaling 機能 がない
- 初期 接続 調整 に WebSocket が必要
コアフロー

接続確立フロー
- 双方 の Peer が Signaling Server に接続
PeerAが自身 のSDPを取得 しsetLocalDescriptionを呼 び出 すPeerAがSDPを Signaling Server に送信- Signaling Server が
PeerAのSDPをPeerBに送信 PeerBがsetRemoteDescriptionでPeerAのSDPを設定PeerBが自身 のSDPを取得 しsetLocalDescriptionを呼 び出 すPeerBがSDPを Signaling Server に送信- Signaling Server が
PeerBのSDPをPeerAに送信 PeerAがsetRemoteDescriptionでPeerBのSDPを設定PeerAが STUN Server に public IP を問 い合 わせ- STUN Server が public IP を返答
PeerAが TURN Server に relay 情報 を問 い合 わせ(STUN 失敗 時 )- TURN Server が relay 情報 を返答
PeerAが ICE Candidates を Signaling Server に送信- Signaling Server が
PeerAの ICE Candidates をPeerBに送信 PeerBがsetRemoteIceCandidateで設定PeerBが手順 10-16 を繰 り返 す- P2P 通信 路 の確立 完了
Signaling
Signaling は通信 セッションの設定 ・制御 ・終了 のプロセス。
三大機能
- Session Control Information - セッション制御 情報
- Exchange IP and Port - IP と Port 情報 の交換
- Exchange Codecs - コーデックとメディアタイプの交換
NAT トラバーサル技術
STUN(Session Traversal Utilities for NAT)
- パブリック IP と Port の発見 に使用
- 軽量 プロトコル
- Google が無料 STUN Server を提供
TURN(Traversal Using Relay NAT)
- STUN 失敗 時 に使用
- リレーサーバー経由 でデータを転送
- TCP/UDP で NAT やファイアウォールを越 える
ICE(Interactive Connectivity Establishment)
ICE は STUN、TURN などの NAT 穿通 技術 を統合 するフレームワーク。
{
"sdpMLineIndex": 0,
"sdpMid": "",
"candidate": "a=candidate:2999745851 1 udp 2113937151 192.168.56.1 51411 typ host generation 0"
}ICE は複数 の ICE Candidates を収集 し、最適 な接続 を見 つけるまで試行 。
Trickle ICE
従来 の方式 ではすべての ICE Candidates の収集 完了 を待 つ必要 があった:

Trickle ICE は収集 しながら送信 でき、接続 を高速化 :

ストリーミングメディア概念
flowchart LR
VcC[音声採集]
VdC[映像採集]
VcEc[音声エンコード]
VdEc[映像エンコード]
Enc[パッケージ化]
Network[ネットワーク転送]
DeEnc[アンパッケージ]
Dc[デコード]
Output[出力デバイス]
VcC --> VcEc --> Enc
VdC --> VdEc --> Enc
Enc --> Network --> DeEnc --> Dc --> Output
OSI レイヤー対応
| レイヤー | プロトコル |
|---|---|
| 3 (Network) | IP |
| 4 (Transport) | TCP, UDP, SCTP |
| 4 (Transport) | ICE, STUN, TURN |
| 6 (Presentation) | TLS, DTLS |
| 7 (Application) | HTTP, SRTP |
WebRTC API
Media Capture
navigator.mediaDevices.getUserMedia()- 音声 映像 ストリームを取得MediaStream- メディアストリームインターフェースMediaStreamTrack- 単一 トラック(音声 または映像 )MediaRecorder- マルチメディアデータの録画
Peer Connection
RTCPeerConnection- P2P 接続 の確立 と管理setLocalDescription()- ローカル SDP の設定setRemoteDescription()- リモート SDP の設定addIceCandidate()- ICE Candidate の追加
Data Channel
RTCDataChannel- 双方向 データチャネルの確立 、任意 のデータを送信
ネットワークアーキテクチャ
| アーキテクチャ | 説明 |
|---|---|
| Mesh Network | 各 ノードが直接 相互 接続 |
| MCU(Multipoint Conferencing Unit) | 中央 サーバーでストリームを合成 |
| SFU(Selective Forwarding Unit) | 選択的 に転送 、合成 しない |