WebRTC の接続確立:ICE・STUN・TURN の原理
NAT の内側どうしでも P2P 接続が張れる理由を理解できます。候補収集・STUN による外部アドレス発見・TURN 中継・ICE の接続性チェックまで原理で押さえます。
- 1.ICE は各端末がローカル・サーバーリフレクシブ(STUN)・リレー(TURN)の候補アドレスを集め、候補ペアごとに STUN Binding 要求で双方向の到達性を実測して使える経路を選ぶ枠組み。
- 2.STUN は外側から見た自分の IP/ポートを教えるだけの軽量サーバーで、対称 NAT のように宛先ごとにマッピングが変わる環境では穴あけが成立せず失敗する。
- 3.TURN は中継サーバーを経由してパケットを転送する最終手段で、直接経路が張れない場合の確実なフォールバックだが帯域コストを中継側が負担する。
なぜ「接続確立」が難しいのか
WebRTC は、サーバーを介さずブラウザ間で音声・映像・データを直接やり取りすることを目指します。ところが現実のクライアントはほぼ全員が NAT の内側にいて、外から到達可能なグローバルアドレスを持ちません。両端が NAT の内側だと、互いに相手の「外から見えるアドレス」を知らず、しかも内側からの発信にしか NAT が穴を開けないため、単純には着信できません。NAT の基本動作は /network/nat/ を参照してください。
この問題を解くのが ICE(Interactive Connectivity Establishment) です。ICE は単一の手法ではなく、複数の候補アドレスを集めて総当たりで到達性を試し、実際に通る経路を選ぶ 枠組み です。その部品として、外部アドレスを発見する STUN と、直接が無理なときに中継する TURN を使います。
ICE が試すのは「データ経路」だけで、最初に互いの候補リストや SDP を交換する経路(シグナリング)は ICE の対象外です。シグナリングは WebSocket など別チャネルでアプリが用意します。候補は集まり次第ペアで非同期に送り合う Trickle ICE が一般的で、全候補が揃うのを待たず接続を早めます。
候補(candidate)の収集
各端末は、自分が到達されうるアドレスを 候補 として種類ごとに集めます。候補は タイプ・IP・ポート・プロトコル・優先度 を持つレコードです。
| 候補タイプ | アドレスの出どころ | 成立条件・特徴 |
|---|---|---|
| host | 端末の NIC が持つローカル IP/ポート | 同一 LAN なら最速。NAT を跨ぐと無効 |
| srflx(サーバーリフレクシブ) | STUN サーバーが見た NAT 外側のマッピング | 錐型 NAT で穴あけが成立すれば直接 P2P |
| prflx(ピアリフレクシブ) | 接続チェック中に相手から観測された新規マッピング | 事前収集に現れない経路を実行時に発見 |
| relay(リレー) | TURN サーバー上に確保した中継アドレス | ほぼ確実に到達。中継コストが掛かる |
host 候補は OS にアドレスを問えば即座に分かります。srflx と relay は外部サーバーへ問い合わせて初めて判明します。集めた候補は相手へ送り、双方の候補を 総当たりでペア化 します。
STUN:外から見た自分を知る
STUN(Session Traversal Utilities for NAT) の本質は単純です。クライアントが STUN サーバーへ Binding Request を送ると、サーバーは受信パケットの 送信元 IP/ポート、すなわち NAT が外向きに割り当てたマッピングを XOR-MAPPED-ADDRESS として返します。これが srflx 候補になります。
Client (192.168.0.10:54000)
--[NAT が 203.0.113.7:60012 へ書換]--> STUN Server
STUN Server --> "あなたは 203.0.113.7:60012 に見えています"
=> srflx 候補 = 203.0.113.7:60012
ここで決定的に効くのが NAT のマッピング方式 です。発信元の内部アドレスが同じなら宛先が違っても同じ外側ポートを使い回す NAT(エンドポイント独立マッピング、いわゆる錐型)では、STUN で得たポートに相手が直接パケットを送れば穴を通れます。一方、宛先ごとに別のマッピングを切る対称 NAT では、STUN サーバー宛のマッピングと相手宛のマッピングが食い違い、STUN で得たアドレスへ相手が送っても届きません。
両端が対称 NAT だと、相手へ向けた瞬間に予測不能な新ポートが切られ、srflx 候補が役に立ちません。この場合の穴あけ(ホールパンチング)は原理的に成立せず、後述の TURN 中継へフォールバックします。CGN(キャリアグレード NAT)配下も同様に直接経路が取りにくい環境です。
TURN:直接が無理なら中継する
TURN(Traversal Using Relays around NAT) は STUN の拡張で、サーバー自身が パケットを中継 します。クライアントは TURN サーバーに Allocate を要求して中継用アドレス(リレー候補)を確保し、以降の通信はすべてこのサーバーを経由します。両端とも自分から TURN への外向き接続なので、どんな NAT 配下でも到達でき、最後の砦 として機能します。
Peer A <--(A→TURN の外向き)--> TURN Server <--(B→TURN の外向き)--> Peer B
すべて TURN を中継。A も B も「自分から外へ出る」だけなので NAT を問わない
代償は、メディアの全帯域が中継サーバーを通ること、つまり 運用側がトラフィックコストを負担 することです。だからこそ ICE は TURN を最優先にはせず、直接経路を試し尽くしてから中継へ落とす設計になっています。なお TURN over TLS(TCP/443)にすると、Web 通信に紛れて厳しいファイアウォールも越えやすくなります。
TURN は STUN を内包するため、coturn などの実装は STUN/TURN を1つで提供します。stun: URL と turn: URL を同じホストで配ることが多く、RTCPeerConnection の iceServers には両方を併記して、まず STUN、ダメなら TURN という縮退を ICE 自身に任せます。
ICE:候補ペアの接続性チェックと選定
候補が出揃うと、ICE は自分の候補と相手の候補を掛け合わせた 候補ペア を作り、優先度の高い順に並べた チェックリスト を構成します。host×host が最優先、relay を含むペアが最劣後です。
各ペアの到達性は、メディアと同じ経路で STUN Binding Request を相手へ直接送る ことで実測します。要求が相手に届き、相手からの応答が返って初めてそのペアは双方向に通ると確定します。この双方向確認の過程で、事前リストになかったアドレス(実行時に観測された prflx 候補)も拾えます。
ICE では一方が controlling、他方が controlled の役割を持ちます。両者が並行してチェックを進めますが、最終的にどのペアを使うかは controlling 側が USE-CANDIDATE フラグ付きの要求で 指名(nomination) して確定させます。複数ペアが通っても、優先度最上位の通ったペアが昇格して採用される仕組みです。
1. 全候補ペアを priority 降順でチェックリスト化
2. 各ペアで双方向に STUN Binding を撃ち、応答が返れば「succeeded」
3. controlling 側が最優先の succeeded ペアを USE-CANDIDATE で nominate
4. 選定ペアでメディアが流れ始める(接続確立)
候補優先度は priority = (2^24)×type + (2^16)×local + (256 − component) で算出され、type の重み(host > prflx > srflx > relay)が桁で支配します。つまり ICE は「直接経路を尽くしてから中継」を優先度の数式そのもので保証します。順序の暗記より「type が最上位ビットを握る」と理解するのが要点です。
確立後の維持と再接続
採用ペアでも、ICE は consent freshness として定期的に STUN Binding を送り続け、経路がまだ生きているか確認します。NAT のマッピングが無通信でタイムアウトするのを防ぐ keepalive も兼ねます。ネットワークが切り替わった(Wi-Fi からモバイル等)場合は ICE restart で候補収集からやり直し、メディアを止めずに経路を張り替えます。
WebRTC のメディアは UDP 上の SRTP で運ばれるのが基本で、UDP の素の挙動は /network/tcp-udp/ を参照してください。TURN を TCP/TLS に切り替える縮退は、UDP が塞がれた企業網でも到達性を保つための実務上の保険です。VPN を併用する場合の経路の見え方は /network/vpn/ も合わせて押さえると、なぜ候補が増減するかを理解しやすくなります。STUN・TURN・ICE は別々の技術ではなく、「候補を集める/外側を知る/中継する/実測して選ぶ」という一連の役割分担で、NAT 越えという難問を確率の高い順に解いていく総合解だと捉えると全体像が掴めます。
ネットワーク Article
WebRTC の接続確立:ICE・STUN・TURN の原理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
WebRTC
比較で見る軸
難易度: advanced / カテゴリ: ネットワーク / タグ数: 6
導入後に効く点
STUN は外側から見た自分の IP/ポートを教えるだけの軽量サーバーで、対称 NAT のように宛先ごとにマッピングが変わる環境では穴あけが成立せず失敗する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ネットワーク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「WebRTC / ICE」に近いか確認する。
- 強みである「ICE は各端末がローカル・サーバーリフレクシブ(STUN)・リレー(TURN)の候補アドレスを集め、候補ペアごとに STUN Binding 要求で双方向の到達性を実測して使える経路を選ぶ枠組み。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。