Client ICE (Interactive Connectivity Establishment)

· Componenti

Da sgcWebSockets 2022.6 è incluso nella libreria un nuovo componente, il client ICE che implementa l'RFC8445. ICE è uno dei protocolli usati in WebRTC (insieme a STUN, TURN, WebSockets... che sono già supportati). Interactive Connectivity Establishment (ICE) è una tecnica usata nelle reti di calcolatori per trovare modi affinché due computer possano comunicare tra loro nel modo più diretto possibile in reti peer-to-peer. Questo è più comunemente usato per media interattivi come Voice over Internet Protocol (VoIP), comunicazioni peer-to-peer, video e messaggistica istantanea. In tali applicazioni, comunicare attraverso un server centrale sarebbe lento e costoso, ma la comunicazione diretta tra applicazioni client su Internet è molto complessa a causa dei network address translator (NAT), dei firewall e di altre barriere di rete.

Raccolta dei candidati 

ICE inizia raccogliendo i candidati, di solito otterrà gli indirizzi IP locali, l'indirizzo riflessivo usando il protocollo STUN e l'indirizzo relayed usando il protocollo TURN.

Per avviare la raccolta chiama il metodo GatherCandidates, questo avvierà un timer interno in cui prima otterrà gli indirizzi IP locali, poi si connetterà al server STUN per ottenere l'indirizzo IP riflessivo e infine si connetterà al server TURN per ottenere l'indirizzo IP relayed.

Ogni volta che viene ottenuto un nuovo candidato, l'evento OnICECandidate verrà chiamato in modo asincrono, se c'è un errore durante la raccolta dei candidati, verrà generato l'evento 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;

Accoppiamento dei candidati 

Una volta ottenuti i candidati (locali e remoti) e impostate le descrizioni SDP, il client ICE chiamante può iniziare a elaborare tutte le coppie di candidati per trovare quelle che possono scambiare dati. Per avviare questo processo, chiama il metodo ProcessCandidates.

Il metodo ProcessCandidates valuta tutte le coppie di candidati inviando un pacchetto di binding STUN, se il pacchetto di binding STUN viene ricevuto come risposta dall'altro peer, significa che la connessione è possibile tra questi 2 peer, quindi la coppia viene nominata.

Quando l'accoppiamento ha successo, l'evento OnICECandidatePairNominated viene generato in modo asincrono. Se l'accoppiamento ha un errore o non riesce a connettersi dopo un timeout, viene generato l'evento OnICECandidatePairFailed.