sgcWebSockets 2022.6에서 RFC8445를 구현하는 새 컴포넌트인 ICE 클라이언트가 라이브러리에 추가됐어요. ICE는 WebRTC에서 사용되는 프로토콜 중 하나예요(이미 지원되는 STUN, TURN, WebSockets... 등과 함께). ICE(Interactive Connectivity Establishment)는 피어투피어 네트워킹에서 두 컴퓨터가 최대한 직접 통신할 수 있는 방법을 찾기 위해 사용되는 기술이에요. VoIP(Voice over Internet Protocol), 피어투피어 통신, 비디오, 인스턴트 메시징 같은 인터랙티브 미디어에 가장 많이 사용돼요. 이러한 애플리케이션에서 중앙 서버를 통한 통신은 느리고 비용이 많이 들지만, 인터넷을 통한 클라이언트 애플리케이션 간의 직접 통신은 NAT(네트워크 주소 변환), 방화벽 등의 네트워크 장벽 때문에 매우 까다로워요.
후보 수집
ICE는 후보 수집을 시작해요. 일반적으로 로컬 IP 주소, STUN 프로토콜을 사용한 반사 주소, TURN 프로토콜을 사용한 릴레이 주소를 얻어요.
수집을 시작하려면 GatherCandidates 메서드를 호출하세요. 내부 타이머가 시작되어 먼저 로컬 IP 주소를 얻고, STUN 서버에 연결해 반사 IP 주소를 얻고, 마지막으로 TURN 서버에 연결해 릴레이 IP 주소를 얻어요.
새 후보가 얻어질 때마다 OnICECandidate 이벤트가 비동기로 호출돼요. 후보 수집 중 오류가 발생하면 OnICECandidateError 이벤트가 발생해요.
oICE := TsgcICEClient.Create(nil);
oTURN := TsgcTURNClient.Create(nil);
oTURN.Host := 'www.esegece.com';
oTURN.Port := 3478;
oTURN.TURNOptions.Authentication.Credentials := stauLongTermCredential;
oTURN.TURNOptions.Authentication.Username := 'sgc';
oTURN.TURNOptions.Authentication.Password := 'secret';
oICE.GatherCandidates();
procedure OnICECandidate(Sender: TObject; const aCandidate: TsgcICE_Candidate);
begin
DoLog('[#Candidate] ' + aCandidate.AsString);
end;
후보 페어링
후보(로컬 및 원격)가 얻어지고 SDP 설명이 설정되면, ICE 발신자 클라이언트가 모든 쌍 후보를 처리해 데이터를 교환할 수 있는 것을 찾기 시작할 수 있어요. 이 프로세스를 시작하려면 ProcessCandidates 메서드를 호출하세요.
ProcessCandidates 메서드는 STUN 바인딩 패킷을 보내 모든 쌍 후보를 평가해요. 상대방으로부터 STUN 바인딩 패킷이 응답으로 수신되면 두 피어 간의 연결이 가능하다는 의미이므로 쌍이 지정돼요.
페어링이 성공하면 OnICECandidatePairNominated 이벤트가 비동기로 발생해요. 페어링에 오류가 있거나 타임아웃 후 연결할 수 없는 경우 OnICECandidatePairFailed 이벤트가 발생해요.
