RTCPeerConnection P2P no Delphi

· Lançamentos

A partir do sgcWebSockets 2022.8.0, um novo componente foi adicionado à biblioteca sgcWebSockets: o TsgcRTCPeerConnection.

O TsgcRTCPeerConnection é um componente cliente que permite conectar peers usando P2P via UDP. O fluxo pode ser dividido em 4 etapas:




Para implementar essas etapas, o cliente utiliza os seguintes protocolos:

Sinalização 

Quando o cliente inicia, ele não sabe com quem vai se comunicar nem sobre o que vão se comunicar. A sinalização usa o SDP (Session Description Protocol), que contém detalhes como:

A sinalização utiliza o protocolo WebSocket para trocar os dados; funciona através de um subprotocolo e é implementada no componente TsgcWSPServer_RTCPeerConnection no lado do servidor.

O TsgcRTCPeerConnection já cria internamente um cliente WebSocket com o TsgcWSPClient_RTCPeerConnection anexado.

Para obter os IPs e portas, o cliente utiliza os protocolos STUN/TURN. Portanto, um servidor STUN/TURN também é necessário.

Links:

Conexão 

Assim que os 2 peers conhecem os candidatos e os SDPs, o cliente utiliza outro protocolo padrão chamado ICE.

ICE (Interactive Connection Establishment) permite o estabelecimento de uma conexão entre 2 peers. Os peers podem estar na mesma rede ou atrás de um NAT. O ICE é uma solução para estabelecer uma conexão direta sem um servidor central. Se a conexão não puder ser P2P, o ICE usará TURN para retransmitir os dados usando um servidor TURN.

Assim que o ICE encontra um candidato válido que pode conectar os 2 peers, o próximo passo é criptografar a comunicação.

Links:

Segurança 

 Após os peers se conectarem, a comunicação deve ser protegida. Isso é feito usando DTLS, que é um protocolo criptográfico usado para proteger a comunicação sobre UDP.

Assim que o handshake DTLS for processado com sucesso, outro protocolo é utilizado: o SRTP (Secure Real-Time Transport Protocol). Atualmente, o SRTP não está implementado.

Links:

Comunicação 

Assim que os 2 peers estão usando um protocolo seguro, a comunicação é feita usando 2 protocolos:

Atualmente esses protocolos não estão implementados, mas você pode enviar/receber dados usando DTLS sobre UDP.