웹 브라우저간 플러그인 도움 없이 서로 통신할 수 있도록 설계된 API이다.
주요 브라우저에서 자바스크립트 API로 제공된다.
브라우저 뿐만 아니라 다양한 플랫폼에서 사용가능하다. 실제로 Android 및 iOS에서 WebRTC 기능을 제공하는 기본 라이브러리가 존재한다.
browser - server - browser 가 아닌 browser-browser 직접 연결방식이다.
브라우저끼리 직접 연결한다고 server가 필요없는것은 아니다. 네트워크를 찾거나, 세션관리, 미디어와 관련된 메타데이터 교환도 해야하며, 사용자 방화벽 문제나 공용IP주소가 없거나, 라우터가 피어간 직접 연결을 막는 경우 피어간 연결이 되지 않을 수 있다. 다음과 같은 문제들을 해결하기 위해 서버가 필요하다.
위와 같은 문제가 발생하더라도 피어간 연결 위해 사용하는 기술이다. ICE는 STUN과 TURN서버를 사용한다.
STUN이란 피어의 공용주소를 알아내고, 피어간 직접 연결을 막는 라우터의 제한 사항을 알아내는 프로토콜을 말한다.
클라이언트는 STUN서버에 요청을 보내고 STUN서버는 클라이언트의 공용 IP주소와. 라우터의 NAT 뒤에서 액세스 가능한지 여부를 반환해 준다.
개인 디바이스에 공용 IP주소를 제공하는데 사용된다. 라우터는 공용 IP주소를 가지고 있고 이와 연결된 모든 디바이스는 개인 IP주소를 가진다. 요청 이후에는 개인 IP주소에서 유일한 포트를 가진 공용 IP주소로 변환된다. 유일한 포트를 가진 공용IP를 가지면 각 디바이스는 유일한 공용IP 없이도 인터넷 상에서 검색이 가능하다.
하지만 일부 라우터들은
디바이스와 네트워크 연결을 막는 경우도 있다.
즉, STUN서버에서 공용 IP주소를 알아내도 연결이 불가능할 수 있다는 뜻이다. 이때 TURN을 사용한다.
TURN은 Symmetric NAT(이전에 연결했던 피어들과의 연결만 허락하는 것)의 제약조건을 우회하기 위해 사용된다. 클라이언트들은 TURN서버에 패킷을 보내고, TURN서버는 이 패킷들을 포워딩한다. 당연히 오버헤드가 발생한다. 따라서 다른 방법이 없을때만 사용한다.
SFU,MCU 서버를 구현할때도 ICE가 필요한가?
https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Protocols
https://www.baeldung.com/webrtc
https://doublem.org/webrtc-story-02/