ICE의 개요
ICE(Interactive Connectivity Establishment)는 WebRTC 프로토콜의 핵심 구성 요소로, P2P(Peer-to-Peer) 통신에서 엔드포인트 간의 네트워크 경로를 탐색하고 최적의 경로를 선택하는 메커니즘이다. WebRTC는 다양한 네트워크 환경에서 안정적이고 실시간으로 미디어 스트림을 전송하는 것을 목표로 하기 때문에, ICE는 이러한 요구를 충족시키기 위해 다양한 네트워크 조건에서 작동할 수 있도록 설계되었다.
ICE의 구성 요소
ICE는 크게 두 가지 주요 구성 요소로 나뉜다: ICE 후보자(Candidates)와 ICE 프로세스이다.
ICE 후보자 (Candidates)
ICE 후보자는 엔드포인트가 통신에 사용할 수 있는 다양한 네트워크 경로를 나타낸다. ICE 후보자는 로컬 IP 주소, 공용 IP 주소, 그리고 TURN 서버를 통해 할당된 릴레이 IP 주소를 포함할 수 있다. 이 후보자들은 각각 다음과 같은 유형으로 나뉜다:
-
호스트 후보자 (Host Candidates): 이들은 로컬 네트워크 인터페이스에서 직접 가져온 IP 주소와 포트 쌍을 말한다. 주로 LAN이나 직접 연결된 네트워크에서 사용된다.
-
서버 반사 후보자 (Server Reflexive Candidates): 이들은 STUN(Session Traversal Utilities for NAT) 서버를 통해 외부에 공개된 공용 IP 주소이다. 이 후보자는 NAT(Network Address Translation) 환경에서 주로 사용된다.
-
릴레이 후보자 (Relay Candidates): 이들은 TURN(Traversal Using Relays around NAT) 서버를 통해 생성된 IP 주소이다. NAT 또는 방화벽이 엄격하여 다른 후보자를 사용할 수 없는 경우, 이 릴레이 후보자가 사용된다.
ICE 프로세스
ICE 프로세스는 후보자들 간의 최적의 경로를 선택하는 과정으로, ICE Gathering, ICE Connectivity Checks, ICE Nomination의 세 단계로 나뉜다.
-
ICE Gathering: 이 단계에서는 ICE 에이전트가 모든 가능한 ICE 후보자를 수집한다. 후보자들은 로컬 네트워크 인터페이스, STUN 서버, 그리고 TURN 서버로부터 순차적으로 수집된다. 각 후보자는 우선순위가 매겨지며, 이는 연결 가능성 및 예상 성능에 따라 결정된다.
-
ICE Connectivity Checks: 후보자 페어(candidate pair) 간에 연결 테스트를 수행하여 실제로 연결이 가능한지를 확인한다. 각 후보자 페어는 우선순위에 따라 순차적으로 테스트되며, 연결이 성공한 페어는 가능한 경로로 간주된다.
-
ICE Nomination: 연결 테스트를 통해 성공한 후보자 페어 중에서 최적의 경로를 선택하는 과정이다. 선택된 경로는 이후 통신에 사용된다. 이 과정에서는 신호 지연, 대역폭, 패킷 손실률 등을 고려하여 가장 효율적인 경로를 선택한다.
ICE의 확장 및 최적화
ICE는 기본적으로 Full ICE와 Trickle ICE라는 두 가지 모드를 지원한다.
-
Full ICE: 모든 후보자가 수집된 후에 연결 테스트를 시작하는 방식이다. 이 방법은 안정적이지만 초기 연결 설정 시간이 길어질 수 있다.
-
Trickle ICE: 후보자가 수집되는 대로 즉시 연결 테스트를 시작하는 방식이다. 초기 연결 설정 시간을 줄일 수 있으나, 구현의 복잡성이 증가할 수 있다.
또한, ICE는 다양한 NAT 및 방화벽 환경에서의 최적화를 지원한다. 예를 들어, ICE Lite 모드는 서버 측에서만 제한된 ICE 기능을 사용하는 경량화된 버전으로, 클라이언트가 대부분의 ICE 프로세스를 처리하도록 한다.
관련 자료: - RFC 5245, Interactive Connectivity Establishment (ICE): A Framework for NAT Traversal for Offer/Answer Protocols - RFC 8445, Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal - Google WebRTC 프로젝트 문서