STUN (Session Traversal Utilities for NAT) ist ein IETF-Protokoll, das für Echtzeit-Audio/-Video in IP-Netzen verwendet wird. STUN ist ein Server-Client-Protokoll; ein STUN-Server arbeitet üblicherweise sowohl über UDP als auch über TCP und horcht auf Port 3478.
Der Hauptzweck des STUN-Protokolls besteht darin, einem hinter einem NAT laufenden Gerät zu ermöglichen, seine öffentliche IP und den NAT-Typ zu ermitteln.
STUN bietet einen Mechanismus zur Kommunikation zwischen Peers hinter einem NAT. Die Peers senden eine Anfrage an einen STUN-Server, um die öffentliche IP-Adresse und den Port zu erfahren. Die vom Client an den Server gesendeten Binding-Anfragen werden verwendet, um die vom NAT zugewiesenen IP- und Port-Bindings zu bestimmen. Der STUN-Client sendet eine Binding-Anfrage an den STUN-Server, der Server untersucht die vom Client verwendete Quell-IP und den Port und gibt diese Informationen an den Client zurück.
STUN Server
TsgcSTUNServer ist der Server, der das STUN-Protokoll implementiert und Binding-Anfragen von STUN-Clients verarbeitet.
Der STUN-Server kann mit oder ohne Authentifizierung konfiguriert werden, kann das Fingerprint-Attribut verifizieren, einen alternativen Server senden und mehr.
Grundlegende Nutzung
Üblicherweise laufen STUN-Server auf UDP-Port 3478 und erfordern keine Authentifizierung. Setze daher zum Konfigurieren eines STUN-Servers den Listen-Port (Standard: 3478) und starte den Server.
Den Server konfigurieren
- Port: der Listen-Port des Servers, z. B.: 3478
Setze die Eigenschaft Active = True, um den STUN-Server zu starten.
Schau dir den folgenden Delphi-Code an, der zeigt, wie man einen neuen Delphi STUN Server.
oSTUN := TsgcSTUNServer.Create(nil); oSTUN.Port := 3478; oSTUN.Active := True;
Long-Term Credentials
Üblicherweise werden STUN-Server ohne Authentifizierung konfiguriert, sodass jeder STUN-Client eine Binding-Anfrage senden und ohne Authentifizierung eine Antwort vom Server erwarten kann.
Der sgcWebSockets-STUN-Server unterstützt Long-Term Credentials, sodass du TsgcSTUNServer so konfigurieren kannst, dass nur Binding-Anfragen mit Long-Term-Credential-Informationen zugelassen werden.
Greife zur Konfiguration auf die Eigenschaft STUNOptions.Authorization zu und aktiviere sie.
Greife dann auf die Eigenschaft LongTermCredentials zu und aktiviere sie. Standardmäßig ist diese Art von Autorisierung bereits mit einem Realm-String und einem StaleNonce-Standardwert von 10 Minuten (= 600 Sekunden) konfiguriert.
Schau dir den folgenden Delphi-Code an, der zeigt, wie man einen neuen Delphi STUN Server with Long-Credentials aktiviert.
oSTUN := TsgcSTUNServer.Create(nil);
oSTUN.Port := 3478;
oSTUN.STUNOptions.Authentication.Enabled := True;
oSTUN.STUNOptions.Authentication.LongTermCredentials.Enabled := True;
oSTUN.STUNOptions.Authentication.LongTermCredentials.Realm := 'sgcWebSockets';
oSTUN.STUNOptions.Authentication.LongTermCredentials.StaleNonce := 600;
oSTUN.Active := True;
procedure OnSTUNRequestAuthorization(Sender: TObject; const aRequest: TsgcSTUN_Message; const aUsername, aRealm: string; var Password: string);
begin
if aUsername = 'my-user' then
Password := 'my-password';
end;
STUN Client
TsgcSTUNClient ist der Client, der das STUN-Protokoll implementiert und ermöglicht es, Binding-Anfragen an STUN-Server zu senden.
Die Komponente erlaubt die Verwendung von UDP und TCP als Transport und implementiert bei UDP-Transport einen Retransmission-Mechanismus, um Anfragen erneut zu senden, wenn die Antwort nicht innerhalb kurzer Zeit eintrifft.
Grundlegende Nutzung
Üblicherweise laufen STUN-Server auf UDP-Port 3478 und erfordern keine Authentifizierung. Fülle daher zum Senden einer STUN-Binding-Anfrage die Server-Eigenschaften aus, damit der Client weiß, wohin er sich verbinden soll, und Behandle das events where the component will receive the response from server.
Den Server konfigurieren
- Host: die IP- oder DNS-Adresse des Servers, z. B.: stun.sgcwebsockets.com
- Port: der Listen-Port des Servers, z. B.: 3478
Rufe die Methode SendRequest auf, um eine Binding-Anfrage an den STUN-Server zu senden.
Behandle das events
- Wenn der Server eine erfolgreiche Antwort zurückgibt, wird das Ereignis OnSTUNResponseSuccess aufgerufen und du kannst über das aBinding-Objekt auf die Binding-Informationen zugreifen.
- Wenn der Server einen Fehler zurückgibt, wird das Ereignis OnSTUNResponseError aufgerufen und du kannst über das aError-Objekt auf Fehlercode und Grund zugreifen.
oSTUN := TsgcSTUNClient.Create(nil);
oSTUN.Host := 'stun.sgcwebsockets.com';
oSTUN.Port := 3478;
oSTUN.SendRequest;
procedure OnSTUNResponseSuccess(Sender: TObject; const aMessage: TsgcSTUN_Message; const aBinding: TsgcSTUN_ResponseBinding);
begin
DoLog('Remote IP: ' + aBinding.RemoteIP + '. Remote Port: ' + IntToStr(aBinding.RemotePort));
end;
procedure OnSTUNResponseError(Sender: TObject; const aMessage: TsgcSTUN_Message; const aError: TsgcSTUN_ResponseError);
begin
DoLog('Error: ' + IntToStr(aError.Code) + ' ' + aError.Reason);
end;
});
