Delphi STUN/TURN Server and Client (4/4)

· Komponenten

Ab sgcWebSockets 4.5.2 kannst du mit der sgcWebSockets-Bibliothek deinen eigenen STUN/TURN Server und Clients bauen.

STUN

Session Traversal Utilities for NAT (STUN) (Akronym innerhalb eines Akronyms) ist ein Protokoll, um deine öffentliche Adresse zu ermitteln und etwaige Einschränkungen in deinem Router festzustellen, die eine direkte Verbindung mit einem Peer verhindern würden.

Der Client sendet eine Anfrage an einen STUN-Server im Internet, der mit der öffentlichen Adresse des Clients antwortet und mitteilt, ob der Client hinter dem NAT des Routers erreichbar ist.

TURN

Manche Router mit NAT setzen eine Einschränkung namens 'Symmetric NAT' ein. Das bedeutet, dass der Router nur Verbindungen von Peers akzeptiert, mit denen du dich zuvor verbunden hast.

Traversal Using Relays around NAT (TURN) ist dazu gedacht, die Einschränkung des Symmetric NAT zu umgehen, indem eine Verbindung mit einem TURN-Server geöffnet und alle Informationen über diesen Server weitergeleitet werden. Du baust eine Verbindung mit einem TURN-Server auf und teilst allen Peers mit, Pakete an den Server zu senden, die dann an dich weitergeleitet werden. Dies bringt natürlich einen gewissen Overhead mit sich, weshalb es nur eingesetzt wird, wenn es keine anderen Alternativen gibt.


Einen STUN/TURN-Server bauen 

Der Prozess zur Erstellung eines STUN/TURN Delphi Servers ist sehr einfach: erstelle einen TsgcTURNServer und konfiguriere die folgenden Eigenschaften:

Verarbeite das Ereignis OnSTUNRequestAuthorization, um das Passwort festzulegen, wenn ein TURN-Client eine Anfrage sendet.

Setze schließlich die Eigenschaft Active auf True, um den Server zu starten.

Unten findest du eine Beispielkonfiguration, in der STUN-Anfragen keine Autorisierung erfordern und TURN-Anfragen Long-Term-Credentials voraussetzen.

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; 

Einen STUN/TURN-Client bauen 

Einen neuen Delphi STUN/TURN-Client zu erstellen ist genauso einfach wie einen Server. Erstelle einfach einen TsgcTURNClient und konfiguriere die folgenden Eigenschaften:


IP-Adresse zuweisen

Das TURN-Protokoll erlaubt die Verwendung einer Relayed-IP-Adresse, um Daten zwischen Peers auszutauschen, die hinter NATs liegen.

Um eine neue Relayed-IP-Adresse auf einem TURN-Server zu erstellen, muss der Client zuerst die Methode Allocate aufrufen. Diese Methode sendet eine Anfrage an den TURN-Server zur Erstellung einer neuen Relayed-IP-Adresse. Kann der TURN-Server eine neue Relayed-IP-Adresse erstellen, erhält der Client eine erfolgreiche Antwort. Der Client kann während der in der Lifetime der Allocation definierten Zeit mit anderen Peers kommunizieren.

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; 

Die Lifetime kann mit der Methode Refresh aktualisiert werden, um ein Ablaufen zu vermeiden. Die Lifetime ist die Anzahl der Sekunden bis zum Ablauf. Ist der Wert null, wird die Allocation gelöscht.

oTURN.Refresh(600); 

TURN Server 

});

Kompilierte TURN Server / Client Demo