Vanaf sgcWebSockets 4.5.2 kun je je eigen STUN/TURN-server en -clients bouwen met de sgcWebSockets-bibliotheek.
STUN
Session Traversal Utilities for NAT (STUN) (een afkorting binnen een afkorting) is een protocol om je publieke adres te ontdekken en eventuele beperkingen in je router te bepalen die een directe verbinding met een peer zouden verhinderen.
De client stuurt een request naar een STUN-server op het internet die antwoordt met het publieke adres van de client en of de client al dan niet bereikbaar is achter de NAT van de router.
TURN
Sommige routers met NAT hanteren een beperking genaamd 'Symmetric NAT'. Dit betekent dat de router alleen verbindingen accepteert van peers waarmee je eerder verbonden bent geweest.
Traversal Using Relays around NAT (TURN) is bedoeld om de Symmetric-NAT-beperking te omzeilen door een verbinding te openen met een TURN-server en alle informatie via die server te relayen. Je maakt verbinding met een TURN-server en vertelt alle peers om pakketten naar de server te sturen, die deze vervolgens naar jou doorstuurt. Dit gaat uiteraard gepaard met enige overhead, dus wordt het alleen gebruikt als er geen alternatieven zijn.
Een STUN/TURN-server bouwen
Het proces om een STUN/TURN Delphi-server te maken is heel eenvoudig: maak een TsgcTURNServer aan en configureer de volgende eigenschappen:
- Port: standaard is dit 3478, de standaardpoort voor het STUN/TURN-protocol.
- STUNOptions: hier configureer je de STUN-opties. Meestal gebruiken STUN-requests geen authenticatie, dus kun je dit op de standaardwaarden laten staan.
- TURNOptions. hier configureer je de TURN-opties. Meestal vereisen TURN-servers long-term-credentials (omdat TURN gebruikmaakt van een Relay-adres om data uit te wisselen tussen peers achter NATs en dit zware resources vraagt). Hier configureer je het IP-adres van het gerelayde adres, in TURNOptions.Allocation.RelayIP.
Handel het event OnSTUNRequestAuthorization af om het wachtwoord in te stellen wanneer een TURN-client een request stuurt.
Tot slot stel je de eigenschap Active op True in om de server te starten.
Hieronder een voorbeeldconfiguratie waarbij STUN-requests geen autorisatie vereisen en TURN-requests long-term-credentials vereisen.
oTURN := TsgcTURNServer.Create(nil);
oTURN.Port := 3478;
oTURN.STUNOptions.Authentication.Enabled := False;
oTURN.TURNOptions.Authentication.Enabled := True;
oTURN.TURNOptions.Authentication.LongTermCredentials.Enabled := True;
oTURN.TURNOptions.Authentication.LongTermCredentials.Realm := 'sgcWebSockets';
oTURN.TURNOptions.Authentication.LongTermCredentials.StaleNonce := 600;
oTURN.Active := True;
procedure OnSTUNRequestAuthorization(Sender: TObject; const aRequest: TsgcSTUN_Message; const aUsername, aRealm: string; var Password: string);
begin
if (aUsername = 'my-user') and (aRealm = 'sgcWebSockets') then
Password := 'my-password';
end;
Een STUN/TURN-client bouwen
Een nieuwe Delphi STUN/TURN-client maken is net zo eenvoudig als een server. Maak een TsgcTURNClient aan en configureer de volgende eigenschappen:
- Host: de DNS-naam of het IP-adres waar de STUN/TURN-server draait.
- Port: de poort, standaard 3478.
- STUNOptions: hier configureer je de STUN-opties. Meestal gebruiken STUN-requests geen authenticatie, dus kun je dit op de standaardwaarden laten staan.
- TURNOptions. hier configureer je de TURN-opties. Meestal vereisen TURN-servers long-term-credentials (omdat TURN gebruikmaakt van een Relay-adres om data uit te wisselen tussen peers achter NATs en dit zware resources vraagt).
IP-adres alloceren
Het TURN-protocol maakt het mogelijk om een gerelayd IP-adres te gebruiken om data uit te wisselen tussen peers die zich achter NATs bevinden.
Om een nieuw gerelayd IP-adres op een TURN-server aan te maken, moet de client eerst de methode Allocate aanroepen. Deze methode stuurt een request naar de TURN-server om een nieuw gerelayd IP-adres aan te maken. Als de TURN-server een nieuw gerelayd IP-adres kan aanmaken, ontvangt de client een succesvol antwoord. De client kan communiceren met andere peers gedurende de tijd die is gedefinieerd in de lifetime van de allocation.
oTURN := TsgcTURNClient.Create(nil);
oTURN.Host := 'turn.sgcwebsockets.com';
oTURN.Port := 3478;
oTURN.Allocate();
procedure OnTURNAllocate(Sender: TObject; const aSocket: TsgcSocketConnection; const
aMessage: TsgcSTUN_Message; const aAllocation: TsgcTURN_ResponseAllocation);
begin
DoLog('Relayed IP: ' + aAllocation.RelayedIP + '. Relayed Port: ' + IntToStr(aAllocation.RelayedPort));
end;
procedure OnSTUNResponseError(Sender: TObject; const aMessage: TsgcSTUN_Message;
const aError: TsgcSTUN_ResponseError);
begin
DoLog('Error: ' + IntToStr(aError.Code) + ' ' + aError.Reason);
end;
De lifetime kan worden bijgewerkt om vervaltijd te voorkomen met de methode Refresh. De lifetime is het aantal seconden tot verloop. Als de waarde nul is, wordt de allocation verwijderd.
oTURN.Refresh(600);
