Ab sgcWebSockets 2022.6 ist eine neue Komponente in der Bibliothek enthalten: der ICE-Client, der RFC8445 implementiert. ICE ist eines der Protokolle, die in WebRTC verwendet werden (zusammen mit STUN, TURN, WebSockets …, die bereits unterstützt werden). Interactive Connectivity Establishment (ICE) ist eine Technik in der Netzwerktechnik, um Wege zu finden, wie zwei Rechner in Peer-to-Peer-Netzwerken so direkt wie möglich miteinander kommunizieren können. Sie wird vor allem für interaktive Medien wie Voice over Internet Protocol (VoIP), Peer-to-Peer-Kommunikation, Video und Instant Messaging eingesetzt. In solchen Anwendungen wäre die Kommunikation über einen zentralen Server langsam und teuer, doch direkte Kommunikation zwischen Client-Anwendungen im Internet ist wegen Network Address Translators (NATs), Firewalls und anderen Netzwerkbarrieren sehr knifflig.
Kandidaten sammeln
ICE beginnt mit dem Sammeln von Kandidaten: üblicherweise lokale IP-Adressen, eine Reflexive-Adresse über das STUN-Protokoll und eine Relayed-Adresse über das TURN-Protokoll.
Um das Sammeln zu starten, rufe die Methode GatherCandidates auf. Damit startet ein interner Timer, der zuerst die lokalen IP-Adressen ermittelt, dann zum STUN-Server verbindet, um die Reflexive-IP-Adresse zu erhalten, und schließlich zum TURN-Server verbindet, um die Relayed-IP-Adresse zu bekommen.
Jedes Mal, wenn ein neuer Kandidat ermittelt wird, wird das Ereignis OnICECandidate asynchron ausgelöst. Tritt beim Sammeln der Kandidaten ein Fehler auf, wird das Ereignis OnICECandidateError ausgelöst.
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;
Kandidaten paaren
Sobald die Kandidaten (lokal und remote) ermittelt und die SDP-Beschreibungen gesetzt wurden, kann der ICE-Caller-Client damit beginnen, alle Kandidaten-Paare zu prüfen, um diejenigen zu finden, die Daten austauschen können. Um diesen Vorgang zu starten, rufe die Methode ProcessCandidates auf.
Die Methode ProcessCandidates wertet alle Kandidaten-Paare aus, indem sie ein STUN-Binding-Paket sendet. Wird das STUN-Binding-Paket als Antwort vom anderen Peer empfangen, ist eine Verbindung zwischen diesen beiden Peers möglich und das Paar wird nominiert.
Bei erfolgreicher Paarung wird das Ereignis OnICECandidatePairNominated asynchron ausgelöst. Tritt bei der Paarung ein Fehler auf oder kann nach einem Timeout keine Verbindung hergestellt werden, wird das Ereignis OnICECandidatePairFailed ausgelöst.
