From sgcWebSockets 2022.8.0 a new component has been added to the sgcWebSockets library, the TsgcRTCPeerConnection.
TsgcRTCPeerConnection is een clientcomponent waarmee je peers kunt verbinden via P2P over UDP. De flow kan worden opgesplitst in 4 stappen:- Signaling
- Connecting
- Securing
- Communicating
Om deze stappen te implementeren gebruikt de client de volgende protocollen:
- WebSocket: dit protocol wordt gebruikt voor signaling; de clients wisselen het Session Description Protocol en de lokale, publieke en relayed IP-adressen uit.
- UDP: dit is het transportprotocol; de client gebruikt UDP om berichten tussen peers te versturen/ontvangen.
- DTLS: vergelijkbaar met TLS, is een encryptiespecificatie die de berichten tussen peers beveiligt, zodat derden de berichten niet kunnen lezen/schrijven.
- STUN: protocol om het publieke IP-adres te verkrijgen.
- TURN: protocol om het IP-adres door te geven wanneer peers zich achter NAT's bevinden.
- ICE: protocol om te vinden welke IP-adressen en poorten toegankelijk zijn tussen peers.
Signaling
Wanneer de client start, weet deze niet met wie er gecommuniceerd gaat worden en waarover. Signaling gebruikt het SDP (Session Description Protocol) dat details bevat zoals:
- IP's en poorten waarop de peer bereikbaar is
- Fingerprint van het certificaat dat wordt gebruikt om de communicatie te beveiligen.
- Gebruiker en wachtwoord.
- ...
De signaling gebruikt het WebSocket-protocol om de data uit te wisselen; dit werkt via een subprotocol en is geïmplementeerd in het component TsgcWSPServer_RTCPeerConnection aan de serverzijde.
TsgcRTCPeerConnection maakt intern al een WebSocket-client aan met TsgcWSPClient_RTCPeerConnection eraan gekoppeld.
Om de IP's en poorten te verkrijgen gebruikt de client de STUN/TURN-protocollen om deze informatie op te halen. Een STUN/TURN-server is dus ook vereist.
Links:
- RTCPeerConnection WebSocket Server
- RTCPeerConnection WebSocket Client
- RTCPeerConnection STUN TURN
- RTCPeerConnection Signaling
Connecting
Zodra de 2 peers de candidates en SDP's kennen, gebruikt de client een ander standaardprotocol genaamd ICE.
ICE (Interactive Connection Establishment) maakt het mogelijk een verbinding tot stand te brengen tussen 2 peers. De peers kunnen in hetzelfde netwerk of achter een NAT zitten... ICE is een oplossing om een directe verbinding te maken zonder centrale server. Als de verbinding niet P2P kan zijn, gebruikt ICE TURN om de data door te geven via een TURN-server.
Zodra ICE een geldige candidate vindt die de 2 peers kan verbinden, is de volgende stap het versleutelen van de communicatie
Links:
Securing
Nadat de peers verbonden zijn, moet de communicatie beveiligd zijn. Dit gebeurt met DTLS, een cryptografisch protocol om communicatie over UDP te beveiligen.
Zodra de DTLS-handshake succesvol is verwerkt, wordt een ander protocol gebruikt, SRTP (Secure Real-Time Transport Protocol); SRTP is momenteel niet geïmplementeerd.
Links:
Communicating
Zodra de 2 peers een beveiligd protocol gebruiken, gebeurt de communicatie via 2 protocollen:
- RTP: Real Time Transport Protocol: gebruikt om media versleuteld met SRTP uit te wisselen.
- SCTP: Stream Control Transmission Protocol, gebruikt om DataChannel-berichten versleuteld met DTLS te verzenden en ontvangen.
Momenteel zijn deze protocollen niet geïmplementeerd, maar je kunt data versturen/ontvangen via DTLS over UDP.
