Cliente ICE (Interactive Connectivity Establishment)

· Componentes

Desde sgcWebSockets 2022.6 se incluye un nuevo componente en la biblioteca: el cliente ICE que implementa la RFC8445. ICE es uno de los protocolos usados en WebRTC (junto con STUN, TURN, WebSockets... que ya son compatibles). Interactive Connectivity Establishment (ICE) es una técnica usada en redes de ordenadores para encontrar formas de que dos ordenadores se comuniquen entre sí lo más directamente posible en redes peer-to-peer. Se usa principalmente para medios interactivos como Voice over Internet Protocol (VoIP), comunicaciones peer-to-peer, vídeo y mensajería instantánea. En tales aplicaciones, comunicarse a través de un servidor central sería lento y costoso, pero la comunicación directa entre aplicaciones cliente en Internet es muy complicada debido a los traductores de direcciones de red (NATs), firewalls y otras barreras de red.

Recolección de candidatos 

ICE comienza recolectando candidatos; normalmente obtendrá direcciones IP locales, dirección reflexiva usando el protocolo STUN y dirección relayed usando el protocolo TURN.

Para iniciar la recolección llama al método GatherCandidates; esto iniciará un temporizador interno que primero obtendrá las direcciones IP locales, luego se conectará al servidor STUN para obtener la dirección IP reflexiva y finalmente se conectará al servidor TURN para obtener la dirección IP relayed.

Cada vez que se obtiene un nuevo candidato, el evento OnICECandidate se llamará de forma asíncrona; si hay algún error al recolectar los candidatos, el evento OnICECandidateError se lanzará. 

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; 

Emparejamiento de candidatos 

Una vez obtenidos los candidatos (local y remoto) y establecidas las descripciones SDP, el cliente ICE iniciador puede empezar a procesar todos los pares de candidatos para encontrar aquellos que pueden intercambiar datos. Para iniciar este proceso, llama al método ProcessCandidates.

El método ProcessCandidates evalúa todos los pares de candidatos enviando un paquete STUN binding; si el paquete STUN binding se recibe como respuesta del otro peer, significa que la conexión es posible entre esos 2 peers, por lo que el par es nominado.

Cuando el emparejamiento es satisfactorio, el evento OnICECandidatePairNominated se lanza de forma asíncrona. Si el emparejamiento tiene un error o no puede conectar tras un timeout, el evento OnICECandidatePairFailed se lanza.