ICE クライアント(Interactive Connectivity Establishment)

· コンポーネント

sgcWebSockets 2022.6 から、新しいコンポーネントとして RFC8445 を実装する ICE クライアントがライブラリに含まれました。ICE は WebRTC で使用されるプロトコルの 1 つです(STUN、TURN、WebSocket などはすでにサポートされています)。Interactive Connectivity Establishment(ICE)は、ピアツーピアネットワーキングにおいて 2 台のコンピューター同士ができるだけ直接通信する方法を見つけるためにコンピューターネットワーキングで使用される技術です。これは、Voice over Internet Protocol(VoIP)、ピアツーピア通信、ビデオ、インスタントメッセージングなどのインタラクティブメディアで最も一般的に使用されます。こうしたアプリケーションでは、中央サーバー経由の通信は遅く高コストですが、インターネット上のクライアントアプリケーション間の直接通信は、NAT(ネットワークアドレス変換)、ファイアウォール、その他のネットワーク障壁により非常に困難です。

候補の収集(Gathering Candidates) 

ICE は候補の収集を開始し、通常はローカル IP アドレス、STUN プロトコルを使用した反射アドレス、TURN プロトコルを使用したリレーアドレスを取得します。

収集を開始するには GatherCandidates メソッドを呼び出します。これにより内部タイマーが開始され、まずローカル IP アドレスを取得し、次に STUN サーバーに接続して反射 IP アドレスを取得し、最後に TURN サーバーに接続してリレー IP アドレスを取得します。

新しい候補が取得されるたびに OnICECandidate イベントが非同期に呼び出されます。候補の収集中にエラーが発生した場合、OnICECandidateError イベントがトリガーされます。 

oICE := TsgcICEClient.Create(nil);
oTURN := TsgcTURNClient.Create(nil);
oTURN.Host := 'www.esegece.com';
oTURN.Port := 3478;
oTURN.TURNOptions.Authentication.Credentials := stauLongTermCredential;
oTURN.TURNOptions.Authentication.Username := 'sgc';
oTURN.TURNOptions.Authentication.Password := 'secret';
oICE.GatherCandidates();
procedure OnICECandidate(Sender: TObject; const aCandidate: TsgcICE_Candidate);
begin
  DoLog('[#Candidate] ' + aCandidate.AsString);
end; 

候補のペアリング(Pairing Candidates) 

候補(ローカルとリモート)が取得され、SDP 記述が設定されると、ICE 呼び出し元クライアントはデータを交換可能なものを見つけるため、すべてのペア候補の処理を開始できます。このプロセスを開始するには ProcessCandidates メソッドを呼び出します。

ProcessCandidates メソッドは STUN バインディングパケットを送信して、すべてのペア候補を評価します。他のピアからの応答として STUN バインディングパケットを受信した場合、それら 2 つのピア間で接続が可能であることを意味し、ペアが指名されます。

ペアリングが 成功 すると、OnICECandidatePairNominated イベントが非同期にトリガーされます。ペアリングに エラー が発生した場合、または タイムアウト後に接続できない 場合、OnICECandidatePairFailed イベントがトリガーされます。