STUN(Session Traversal Utilities for NAT)은 IP 네트워크에서 실시간 오디오 비디오에 사용되는 IETF 프로토콜이에요. STUN은 서버-클라이언트 프로토콜로, STUN 서버는 일반적으로 UDP와 TCP 모두에서 작동하며 포트 3478을 수신해요.
STUN 프로토콜의 주요 목적은 NAT 뒤에서 실행되는 기기가 공개 IP와 NAT 유형을 알 수 있도록 하는 거예요.
STUN은 NAT 뒤에 있는 피어 간 통신 메커니즘을 제공해요. 피어들은 STUN 서버에 요청을 보내 공개 IP 주소와 포트를 알아내요. 클라이언트에서 서버로 보내는 바인딩 요청은 NAT가 할당한 IP와 포트 바인딩을 결정하는 데 사용돼요. STUN 클라이언트가 STUN 서버에 바인딩 요청을 보내면 서버가 클라이언트가 사용하는 출발지 IP와 포트를 확인하여 이 정보를 클라이언트에 반환해요.
STUN 서버
TsgcSTUNServer는 STUN 프로토콜을 구현하고 STUN 클라이언트의 바인딩 요청을 처리할 수 있는 서버예요.
STUN 서버는 인증 여부에 상관없이 설정할 수 있으며, 지문 속성 확인, 대체 서버 전송 등을 할 수 있어요.
기본 사용법
STUN 서버는 보통 UDP 포트 3478에서 실행되며 인증이 필요하지 않아요. STUN 서버를 설정하려면 수신 포트(기본 3478)를 설정하고 서버를 시작하세요.
서버 설정
- Port: 수신 서버 포트예요. 예: 3478
Active = True 속성을 설정하여 STUN 서버를 시작하세요.
새 Delphi STUN 서버를 시작하는 방법을 보여주는 다음 Delphi 코드를 확인하세요.
oSTUN := TsgcSTUNServer.Create(nil); oSTUN.Port := 3478; oSTUN.Active := True;
장기 인증 정보
STUN 서버는 보통 인증 없이 설정되므로 모든 STUN 클라이언트가 바인딩 요청을 보내고 인증 없이 서버 응답을 받을 수 있어요.
sgcWebSockets STUN 서버는 장기 인증 정보를 지원하므로 장기 인증 정보가 있는 바인딩 요청만 허용하도록 TsgcSTUNServer를 설정할 수 있어요.
설정하려면 STUNOptions.Authorization 속성에 접근하여 활성화하세요.
그런 다음 LongTermCredentials 속성에 접근하여 활성화하세요. 기본적으로 이 인증 유형은 Realm 문자열과 10분(= 600초)의 기본 StaleNonce 값으로 이미 설정돼 있어요.
장기 인증 정보가 활성화된 새 Delphi STUN 서버를 만드는 방법을 보여주는 다음 Delphi 코드를 확인하세요.
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 클라이언트
TsgcSTUNClient는 STUN 프로토콜을 구현하고 STUN 서버에 바인딩 요청을 보낼 수 있는 클라이언트예요.
컴포넌트는 UDP와 TCP를 전송으로 사용할 수 있으며, UDP를 전송으로 사용할 때 응답이 짧은 시간 내에 도착하지 않으면 요청을 재전송하는 재전송 메커니즘을 구현해요.
기본 사용법
STUN 서버는 보통 UDP 포트 3478에서 실행되며 인증이 필요하지 않아요. STUN 바인딩 요청을 보내려면 클라이언트가 연결할 위치를 알 수 있도록 서버 속성을 입력하고 컴포넌트가 서버 응답을 받을 이벤트를 처리하세요.
서버 설정
- Host: 서버의 IP 또는 DNS 이름이에요. 예: stun.sgcwebsockets.com
- Port: 수신 서버 포트예요. 예: 3478
STUN 서버에 바인딩 요청을 보내려면 SendRequest 메서드를 호출하세요.
이벤트 처리
- 서버가 성공 응답을 반환하면 OnSTUNResponseSuccess 이벤트가 호출되고 aBinding 객체를 읽어 바인딩 정보에 접근할 수 있어요.
- 서버가 오류를 반환하면 OnSTUNResponseError 이벤트가 호출되고 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;
