Klient ICE (Interactive Connectivity Establishment)

· Komponenty

Od sgcWebSockets 2022.6 do biblioteki został dodany nowy komponent — klient ICE implementujący RFC8445. ICE jest jednym z protokołów używanych w WebRTC (razem z STUN, TURN, WebSockets... które są już obsługiwane). Interactive Connectivity Establishment (ICE) to technika sieciowa służąca do znalezienia jak najbardziej bezpośredniej drogi komunikacji między dwoma komputerami w sieci peer-to-peer. Najczęściej stosowana jest w mediach interaktywnych, takich jak Voice over Internet Protocol (VoIP), komunikacja peer-to-peer, wideo i komunikatory. W takich zastosowaniach komunikacja przez centralny serwer byłaby wolna i kosztowna, ale bezpośrednia komunikacja między aplikacjami klientów w Internecie jest bardzo trudna ze względu na translatory adresów sieciowych (NAT), zapory sieciowe i inne bariery sieciowe.

Gathering Candidates 

ICE rozpoczyna zbieranie kandydatów — zazwyczaj uzyska lokalne adresy IP, adres refleksyjny za pomocą protokołu STUN i adres przekaźnikowy za pomocą protokołu TURN.

Aby rozpocząć zbieranie, wywołaj metodę GatherCandidates — uruchomi ona wewnętrzny timer, który najpierw pobierze lokalne adresy IP, następnie połączy się z serwerem STUN, aby uzyskać refleksyjny adres IP, a na końcu połączy się z serwerem TURN, aby uzyskać przekaźnikowy adres IP.

Every time a new candidate is obtained, the event OnICECandidate will be called asynchronously, if there is any error while gathering the candidates, the event OnICECandidateError will be triggered. 

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 

Po uzyskaniu kandydatów (lokalnych i zdalnych) i ustawieniu opisów SDP klient ICE inicjujący może rozpocząć przetwarzanie wszystkich par kandydatów w celu znalezienia tych, które mogą wymieniać dane. Aby rozpocząć ten proces, wywołaj metodę ProcessCandidates.

Metoda ProcessCandidates ocenia wszystkie pary kandydatów, wysyłając pakiet STUN binding. Jeśli pakiet STUN binding zostanie odebrany jako odpowiedź od drugiego peera, oznacza to, że połączenie między tymi 2 peerami jest możliwe, a para jest nominowana.

Gdy parowanie zakończy się sukcesem, zdarzenie OnICECandidatePairNominated jest wyzwalane asynchronicznie. Jeśli parowanie zakończy się błędem lub nie uda się nawiązać połączenia po upływie limitu czasu, wyzwalane jest zdarzenie OnICECandidatePairFailed.