sgcWebSockets 4.5.2부터 sgcWebSockets 라이브러리를 사용하여 직접 STUN/TURN 서버와 클라이언트를 만들 수 있어요.
STUN
Session Traversal Utilities for NAT(STUN)은 공개 주소를 알아내고 피어와의 직접 연결을 막는 라우터 제한 사항을 확인하는 프로토콜이에요.
클라이언트는 인터넷의 STUN 서버에 요청을 보내고, STUN 서버는 클라이언트의 공개 주소와 라우터 NAT 뒤에서 클라이언트에 접근할 수 있는지 여부를 응답해요.
TURN
NAT를 사용하는 일부 라우터는 '대칭 NAT'라는 제한을 적용해요. 이는 라우터가 이전에 연결했던 피어의 연결만 수락한다는 의미예요.
Traversal Using Relays around NAT(TURN)은 TURN 서버와 연결을 열고 모든 정보를 해당 서버를 통해 중계함으로써 대칭 NAT 제한을 우회하도록 설계되었어요. TURN 서버와 연결을 만들고 모든 피어에게 서버로 패킷을 보내도록 하면 서버가 이를 전달해요. 이는 당연히 오버헤드가 있으므로 다른 대안이 없을 때만 사용해요.
STUN/TURN 서버 구축
STUN/TURN Delphi 서버를 만드는 과정은 매우 간단해요. TsgcTURNServer를 생성하고 다음 속성을 설정하세요:
- Port: 기본값은 3478로, STUN/TURN 프로토콜의 일반 포트예요.
- STUNOptions: STUN 옵션을 설정할 수 있어요. 일반적으로 STUN 요청은 인증을 사용하지 않으므로 기본값으로 두면 돼요.
- TURNOptions. TURN 옵션을 설정할 수 있어요. 일반적으로 TURN 서버는 장기 인증 정보가 필요해요 (TURN이 NAT 뒤에 있는 피어 간 데이터 교환을 위해 중계 주소를 사용하므로 높은 리소스가 필요하기 때문이에요). 중계 주소의 IP 주소는 TURNOptions.Allocation.RelayIP에서 설정하세요.
TURN 클라이언트가 요청을 보낼 때 비밀번호를 설정하기 위해 OnSTUNRequestAuthorization 이벤트를 처리하세요.
마지막으로 Active 속성을 True로 설정하여 서버를 시작하세요.
STUN 요청은 인증이 필요하지 않고 TURN 요청은 장기 인증 정보가 필요한 샘플 설정을 아래에서 확인하세요.
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;
STUN/TURN 클라이언트 구축
새 Delphi STUN/TURN 클라이언트 만들기는 서버만큼 간단해요. TsgcTURNClient를 생성하고 다음 속성을 설정하세요:
- Host: STUN/TURN 서버가 실행 중인 DNS 이름 또는 IP 주소예요.
- Port: 포트예요. 기본값은 3478이에요.
- STUNOptions: STUN 옵션을 설정할 수 있어요. 일반적으로 STUN 요청은 인증을 사용하지 않으므로 기본값으로 두면 돼요.
- TURNOptions. TURN 옵션을 설정할 수 있어요. 일반적으로 TURN 서버는 장기 인증 정보가 필요해요 (TURN이 NAT 뒤에 있는 피어 간 데이터 교환을 위해 중계 주소를 사용하므로 높은 리소스가 필요하기 때문이에요).
IP 주소 할당
TURN 프로토콜은 NAT 뒤에 있는 피어 간 데이터 교환을 위해 중계 IP 주소를 사용할 수 있어요.
TURN 서버에 새 중계 IP 주소를 생성하려면 클라이언트가 먼저 Allocate 메서드를 호출해야 해요. 이 메서드는 TURN 서버에 새 중계 IP 주소 생성을 요청하고, TURN 서버가 새 중계 IP 주소를 만들 수 있으면 클라이언트가 성공 응답을 받아요. 클라이언트는 할당의 수명에 정의된 시간 동안 다른 피어와 통신할 수 있어요.
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;
만료를 피하기 위해 Refresh 메서드로 수명을 업데이트할 수 있어요. Lifetime은 만료까지의 초 수예요. 값이 0이면 할당이 삭제돼요.
oTURN.Refresh(600);
