Od sgcWebSockets 4.5.2 możesz budować własne serwery i klienty STUN/TURN za pomocą biblioteki sgcWebSockets.
STUN
Session Traversal Utilities for NAT (STUN) to protokół służący do odkrywania publicznego adresu i określania ograniczeń routera, które mogłyby uniemożliwić bezpośrednie połączenie z peerem.
Klient wysyła żądanie do serwera STUN w Internecie, który odpowiada publicznym adresem klienta oraz informacją, czy klient jest dostępny za NAT routera.
TURN
Niektóre routery z NAT stosują ograniczenie zwane "Symmetric NAT", które oznacza, że router akceptuje połączenia tylko od peerów, z którymi wcześniej się łączyłeś.
Traversal Using Relays around NAT (TURN) ma na celu obejście tego ograniczenia przez nawiązanie połączenia z serwerem TURN i przekazywanie wszelkich informacji przez ten serwer. Tworzysz połączenie z serwerem TURN i każesz wszystkim peerom wysyłać pakiety do serwera, który następnie przekazuje je do ciebie. Wiąże się to oczywiście z pewnym narzutem, dlatego TURN jest stosowany tylko wtedy, gdy nie ma innych alternatyw.
Build a STUN/TURN Server
Tworzenie serwera STUN/TURN Delphi jest bardzo proste — wystarczy utworzyć TsgcTURNServer i skonfigurować następujące właściwości:
- Port: domyślnie 3478, standardowy port protokołu STUN/TURN.
- STUNOptions: tu konfigurujesz opcje STUN; żądania STUN zazwyczaj nie wymagają uwierzytelniania, więc możesz zostawić wartości domyślne.
- TURNOptions: tu konfigurujesz opcje TURN; serwery TURN zazwyczaj wymagają poświadczeń Long-Term (ponieważ TURN używa adresu przekaźnikowego do wymiany danych między peerami za NAT, co wymaga dużych zasobów). Tu możesz skonfigurować adres IP adresu przekaźnikowego we właściwości TURNOptions.Allocation.RelayIP.
Obsłuż zdarzenie OnSTUNRequestAuthorization, aby ustawić hasło, gdy klient TURN wysyła żądanie.
Na koniec ustaw właściwość Active na True, aby uruchomić serwer.
Poniżej znajdziesz przykładową konfigurację, w której żądania STUN nie wymagają autoryzacji, a żądania TURN wymagają poświadczeń Long-Term.
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;
Build a STUN/TURN Client
Tworzenie klienta STUN/TURN Delphi jest równie proste jak serwera. Wystarczy utworzyć TsgcTURNClient i skonfigurować następujące właściwości:
- Host: nazwa DNS lub adres IP serwera STUN/TURN.
- Port: port; domyślnie 3478.
- STUNOptions: tu konfigurujesz opcje STUN; żądania STUN zazwyczaj nie wymagają uwierzytelniania, więc możesz zostawić wartości domyślne.
- TURNOptions: tu konfigurujesz opcje TURN; serwery TURN zazwyczaj wymagają poświadczeń Long-Term (ponieważ TURN używa adresu przekaźnikowego do wymiany danych między peerami za NAT, co wymaga dużych zasobów).
Alokacja adresu IP
Protokół TURN umożliwia korzystanie z przekaźnikowego adresu IP do wymiany danych między peerami za NAT.
Aby utworzyć nowy przekaźnikowy adres IP na serwerze TURN, klient musi najpierw wywołać metodę Allocate, która wysyła żądanie do serwera TURN. Jeśli serwer TURN może utworzyć nowy przekaźnikowy adres IP, klient otrzyma pomyślną odpowiedź. Klient będzie mógł komunikować się z innymi peerami przez czas określony w czasie życia alokacji.
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;
Czas życia można przedłużyć, aby uniknąć wygaśnięcia, używając metody Refresh. Lifetime to liczba sekund do wygaśnięcia. Jeśli wartość wynosi zero, alokacja zostanie usunięta.
oTURN.Refresh(600);
