ICE Client (Interactive Connectivity Establishment)

· Composants

Depuis sgcWebSockets 2022.6, un nouveau composant est inclus dans la bibliothèque : le client ICE qui implémente la RFC 8445. ICE est l'un des protocoles utilisés dans WebRTC (avec STUN, TURN, WebSockets… déjà pris en charge). Interactive Connectivity Establishment (ICE) est une technique de mise en réseau utilisée pour trouver le moyen le plus direct pour deux ordinateurs de communiquer en peer-to-peer. Elle est le plus souvent utilisée pour les médias interactifs comme la voix sur IP (VoIP), les communications peer-to-peer, la vidéo et la messagerie instantanée. Dans ces applications, communiquer via un serveur central serait lent et coûteux, mais la communication directe entre applications clientes sur Internet est délicate à cause des NAT (network address translators), des firewalls et d'autres barrières réseau.

Collecte des candidats 

ICE commence par collecter les candidats : il obtient en général les adresses IP locales, l'adresse réflexive via le protocole STUN et l'adresse relayée via le protocole TURN.

Pour démarrer la collecte, appelle la méthode GatherCandidates : cela lance un timer interne qui obtient d'abord les adresses IP locales, se connecte ensuite au serveur STUN pour obtenir l'adresse IP réflexive, puis se connecte au serveur TURN pour obtenir l'adresse IP relayée.

Chaque fois qu'un nouveau candidat est obtenu, l'événement OnICECandidate est appelé de façon asynchrone. S'il y a une erreur pendant la collecte, l'événement OnICECandidateError est déclenché. 

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;

Appariement des candidats 

Une fois les candidats obtenus (locaux et distants) et les descriptions SDP définies, le client ICE appelant peut commencer à traiter toutes les paires de candidats pour trouver celles qui peuvent échanger des données. Pour lancer ce processus, appelle la méthode ProcessCandidates.

La méthode ProcessCandidates évalue toutes les paires de candidats en envoyant un paquet de binding STUN : si le paquet de binding STUN est reçu en réponse de l'autre pair, cela signifie que la connexion est possible entre ces 2 pairs, et la paire est nominée.

Quand l'appariement réussit, l'événement OnICECandidatePairNominated est déclenché de façon asynchrone. En cas d'erreur ou si la connexion ne peut pas s'établir après un timeout, l'événement OnICECandidatePairFailed est déclenché.