STUN (Session Traversal Utilities for NAT) to protokół IETF używany do komunikacji audio-wideo w czasie rzeczywistym w sieciach IP. STUN jest protokołem klient-serwer; serwer STUN zwykle działa zarówno na UDP, jak i TCP i nasłuchuje na porcie 3478.
Głównym celem protokołu STUN jest umożliwienie urządzeniu działającemu za NAT odkrycia swojego publicznego adresu IP i typu NAT.
STUN zapewnia mechanizm komunikacji między partnerami za NAT. Partnerzy wysyłają żądanie do serwera STUN, aby poznać publiczny adres IP i port. Żądania bindowania wysyłane od klienta do serwera służą do określenia powiązań IP i portów alokowanych przez NAT. Klient STUN wysyła żądanie Binding do serwera STUN, serwer analizuje źródłowy adres IP i port używany przez klienta i zwraca te informacje klientowi.
STUN Server
TsgcSTUNServer to serwer implementujący protokół STUN umożliwiający przetwarzanie żądań bindowania od klientów STUN.
Serwer STUN można skonfigurować z uwierzytelnianiem lub bez, może weryfikować atrybut Fingerprint, wysyłać alternatywny serwer i wiele więcej.
Podstawowe użycie
Serwery STUN zazwyczaj działają na UDP porcie 3478 i nie wymagają uwierzytelniania, więc aby skonfigurować serwer STUN, ustaw port nasłuchiwania (domyślnie 3478) i uruchom serwer.
Konfiguracja serwera
- Port: port nasłuchiwania serwera, przykład: 3478
Ustaw właściwość Active = True, aby uruchomić serwer STUN.
Sprawdź poniższy kod Delphi, który pokazuje jak uruchomić nowy serwer STUN w Delphi.
oSTUN := TsgcSTUNServer.Create(nil); oSTUN.Port := 3478; oSTUN.Active := True;
Długoterminowe poświadczenia
Zazwyczaj serwery STUN są konfigurowane bez uwierzytelniania, więc każdy klient STUN może wysłać żądanie bindowania i oczekiwać odpowiedzi od serwera bez uwierzytelniania.
Serwer STUN w sgcWebSockets obsługuje długoterminowe poświadczenia, więc możesz skonfigurować TsgcSTUNServer tak, by zezwalał tylko na żądania bindowania z informacjami o długoterminowych poświadczeniach.
Aby to skonfigurować, przejdź do właściwości STUNOptions.Authorization i włącz ją.
Następnie przejdź do właściwości LongTermCredentials i włącz ją. Domyślnie ten typ autoryzacji jest już skonfigurowany z ciągiem Realm i domyślną wartością StaleNonce wynoszącą 10 minut (= 600 sekund).
Sprawdź poniższy kod Delphi, który pokazuje jak utworzyć nowy serwer STUN w Delphi z włączonymi długoterminowymi poświadczeniami.
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;
Klient STUN
TsgcSTUNClient to klient implementujący protokół STUN umożliwiający wysyłanie żądań bindowania do serwerów STUN.
Komponent pozwala na korzystanie z UDP i TCP jako transportu; przy UDP implementuje mechanizm retransmisji ponownie wysyłający żądania, jeśli odpowiedź nie dotarła w krótkim czasie.
Podstawowe użycie
Serwery STUN zazwyczaj działają na UDP porcie 3478 i nie wymagają uwierzytelniania, więc aby wysłać żądanie bindowania STUN, wypełnij właściwości serwera i obsłuż zdarzenia, w których komponent odbierze odpowiedź od serwera.
Konfiguracja serwera
- Host: adres IP lub nazwa DNS serwera, przykład: stun.sgcwebsockets.com
- Port: port nasłuchiwania serwera, przykład: 3478
Wywołaj metodę SendRequest, aby wysłać żądanie bindowania do serwera STUN.
Obsługa zdarzeń
- Jeśli serwer zwróci pomyślną odpowiedź, zostanie wywołane zdarzenie OnSTUNResponseSuccess i będziesz mieć dostęp do informacji o bindowaniu przez obiekt aBinding.
- Jeśli serwer zwróci błąd, zostanie wywołane zdarzenie OnSTUNResponseError i będziesz mieć dostęp do kodu błędu i przyczyny przez obiekt aError.
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;
