ICE(Interractive Connectiveity Establishment)
P2Pコネクション確立するためのフレームワーク、メッセージングプロトコル
メッセージングとしてはkey/valueなプレーンテキスト
大まかな流れ
相手に伝えるべき自身のICE candidateを列挙
STUN,TURNを使えるならここで実際の接続IPを調査
自身の全ICE candidateをSDPでシグナリングサーバーに送る
シグナリングサーバーから接続相手のICE candidateをSDP経由で受信
自身と相手のICE candidateを使って接続チェック
実際に通信できる組み合わせを見つけたらP2P通信開始
最終的にICE candidateという通信できる可能性のあるIPは複数提示する
IPアドレス/プロトコル(UDP/TCP),port number, コンポーネント、タイプ、優先度、ベース、ファウンデーション
クライアントは提示されたICE candidateをひとつひとつ試して通信できるかを確認する
シグナリングサーバーのSDPの中でice candidate:のパラメータとして送信
接続チェック
相手と自分のICE candidateのすべての組み合わせを試して実際に通信可能な通信方式を探索する
ICE type
タイプごとの優先度がそれぞれある。なるべく内内の低コスト、また実現可能性の高い通信の組み合わせを優先
Host I/Fに紐づいているIP, port
Srflx STUNサーバから確認されたNAT越えの外部IP , port
Relay TURN中継のためのTURNサーバーのIP, port
STUN/TURNについては通信者同士同じものを利用する必要あり
STUN/TURNについてはあらかじめクライアントコード側で使うものを指定しておくか、シグナリングサーバー等かから別途教えるのもあり
ICEでNAT traversalのためにNetwork状況の情報収集の方法、STUN,TURNのどちらを使うかの仕組み
体感20%くらいはTURNじゃないと繋がらなかったらしい。
ICEで実際のP2P通信するための通信先を決定できる