WebRTC (Web Real-Time Communication)는 웹 브라우저 간에 플러그인의 도움 없이 서로 통신할 수 있도록 설계된 API입니다. W3C에서 제시된 초안이며, 음성 통화, 영상 통화, P2P 파일 공유 등으로 활용될 수 있습니다. WebRTC로 구성된 서비스는 Discord가 있습니다.
[일반적인 미디어 통신] : 서버를 거쳐 클라이언트에게 전송하는 방식
[ WebRTC의 기본적인 동작과정]
Websocket을 이용하려면 직접적으로 IP를 연결하는 방식을 사용합니다. 그래서 방화벽이 존재하거나 허브를(또는 라우터를) 사용하는 NAT환경에서는 연결이 불가합니다.
중간에 NAT이 존재하여 벽이 있다고 생각하면 됩니다.
[번외] NAT이란?
NAT(Network Address Translators) 네트워크 주소 변환을 말합니다. 즉, IP패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP주소 등을 재기록하면서 라우터를 통해 네트워느 트래픽을 주고 받는 기술입니다.
쉽게말해 우리가 인터넷을 쓸때 공적인 영역(공인 네트워크)과 사적인 영역(사설 네트워크)을 나누어서 쓰게되는데, 그 공적인 영역과 사적인 영역의 경계에서 인테넷 주소를 주고 받으면서 네트워크 트래픽을 주고받게 되는데, 그 역할이 바로 NAT입니다.
NAT은 IPv4의 주소 부족 문제를 해결하기 위한 방법으로 고려되었고, 주로 비공인(사설, local) 네트워크 주소를 사용하는 망에서 외부의 공인망(public, 인터넷)과의 통신을 위해서 네트워크 주소를 변환해줍니다.
즉, 인터넷의 공인IP주소를 절약할수 있고 인터넷 공공망에 연결되는 사용자들의 고유한 사설망을 침입자로부터 보호 할 수 있다는 점에서 사용합니다.
그림과 같이 중간에 방화벽이 존재하거나 NAT 환경에 놓여 있는 경우에는 각 Peer에 대한 직접적인 시그널링이 불가능합니다. 따라서 방화벽을 통과시켜주거나 Private IP를 Public IP로 바꿔주는 STUN서버 또는 TURN서버를 사용한다고 합니다.
2. STUN서버
STUN(Session Traversal Uilities for NAT)는 NAT환경에서 Private IP를 별도로 가지고 있기 때문에 Peer to Peer(이하 P2P) 통신이 불가능 합니다. 따라서 클라이언트는 자신의 Public IP를 확인하기 위해 STUN 서버로 요청을 보내고 서버로 부터 자신의 Public IP를 받습니다. 그래서 이때부터 클라이언트는 자신이 받은 Public IP를 이용하여 시그널링을 할때 받은 그 정보를 이용해서 시그널링을 하게 됩니다.
하지만 이 STUN으로 모든걸 해결할 수는 없습니다. 두 명의 Client가 같은 네트워크에 존재하고 있을때는 STUN으로는 해결이 되지 않습니다.
3. TURN 서버
TURN(Traversal Using Relays around NAT)서버는 클라이언트들이 통신할 때 Public 망에 존재하는 TURN 서버를 경유하여 통신하게 됩니다.
클라이언트는 자신의 Private IP가 포함된 TURN 메세지를 TURN서버로 보냅니다. 그러면 TURN 서버는 메세지에 포함된 Network Layer IP 주소와 Transport Layer의 UDP 포트 넘버와의 차이를 확인하고 클라이언트의 Public IP로 응답하게 됩니다. 이때 NAT은 NAT 매핑테이블에 기록되어 있는 정보에 따라서 내부 네트워크에 있는 클라이언트의 Private IP 로 메세지를 전송합니다.
1. WebRTC?
WebRTC (Web Real-Time Communication)는 웹 브라우저 간에 플러그인의 도움 없이 서로 통신할 수 있도록 설계된 API입니다. W3C에서 제시된 초안이며, 음성 통화, 영상 통화, P2P 파일 공유 등으로 활용될 수 있습니다. WebRTC로 구성된 서비스는 Discord가 있습니다.
[일반적인 미디어 통신] : 서버를 거쳐 클라이언트에게 전송하는 방식
[ WebRTC의 기본적인 동작과정]
Websocket을 이용하려면 직접적으로 IP를 연결하는 방식을 사용합니다. 그래서 방화벽이 존재하거나 허브를(또는 라우터를) 사용하는 NAT환경에서는 연결이 불가합니다.
중간에 NAT이 존재하여 벽이 있다고 생각하면 됩니다.
[번외] NAT이란?
NAT(Network Address Translators) 네트워크 주소 변환을 말합니다. 즉, IP패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP주소 등을 재기록하면서 라우터를 통해 네트워느 트래픽을 주고 받는 기술입니다.
쉽게말해 우리가 인터넷을 쓸때 공적인 영역(공인 네트워크)과 사적인 영역(사설 네트워크)을 나누어서 쓰게되는데, 그 공적인 영역과 사적인 영역의 경계에서 인테넷 주소를 주고 받으면서 네트워크 트래픽을 주고받게 되는데, 그 역할이 바로 NAT입니다.
NAT은 IPv4의 주소 부족 문제를 해결하기 위한 방법으로 고려되었고, 주로 비공인(사설, local) 네트워크 주소를 사용하는 망에서 외부의 공인망(public, 인터넷)과의 통신을 위해서 네트워크 주소를 변환해줍니다.
즉, 인터넷의 공인IP주소를 절약할수 있고 인터넷 공공망에 연결되는 사용자들의 고유한 사설망을 침입자로부터 보호 할 수 있다는 점에서 사용합니다.
그림과 같이 중간에 방화벽이 존재하거나 NAT 환경에 놓여 있는 경우에는 각 Peer에 대한 직접적인 시그널링이 불가능합니다. 따라서 방화벽을 통과시켜주거나 Private IP를 Public IP로 바꿔주는 STUN서버 또는 TURN서버를 사용한다고 합니다.
2. STUN서버
STUN(Session Traversal Uilities for NAT)는 NAT환경에서 Private IP를 별도로 가지고 있기 때문에 Peer to Peer(이하 P2P) 통신이 불가능 합니다. 따라서 클라이언트는 자신의 Public IP를 확인하기 위해 STUN 서버로 요청을 보내고 서버로 부터 자신의 Public IP를 받습니다. 그래서 이때부터 클라이언트는 자신이 받은 Public IP를 이용하여 시그널링을 할때 받은 그 정보를 이용해서 시그널링을 하게 됩니다.
하지만 이 STUN으로 모든걸 해결할 수는 없습니다. 두 명의 Client가 같은 네트워크에 존재하고 있을때는 STUN으로는 해결이 되지 않습니다.
3. TURN 서버
TURN(Traversal Using Relays around NAT)서버는 클라이언트들이 통신할 때 Public 망에 존재하는 TURN 서버를 경유하여 통신하게 됩니다.
클라이언트는 자신의 Private IP가 포함된 TURN 메세지를 TURN서버로 보냅니다. 그러면 TURN 서버는 메세지에 포함된 Network Layer IP 주소와 Transport Layer의 UDP 포트 넘버와의 차이를 확인하고 클라이언트의 Public IP로 응답하게 됩니다. 이때 NAT은 NAT 매핑테이블에 기록되어 있는 정보에 따라서 내부 네트워크에 있는 클라이언트의 Private IP 로 메세지를 전송합니다.
TURN 서버는 ICE의 일부로 사용될 수 있도록 디자인 되었습니다.
[번외] 3. ICE(Interactive Connectivity Establishment)
ICE는 Client가 모든 통신 가능한 주소를 식별하는 것을 의미하는데 클라이언트는 STUN 메세지를 TURN 서버로 요청 및 응답과정에서 다음 3가지의 주소를 확인 하게 됩니다.
◾Relayed Address : TURN 서버가 패킷 릴레이를 위해 할당하는 주소 ◾Server Reflexive Address : NAT 가 매핑한 클라이언트의 공인망(Public IP, Port) ◾Local Address : 클라이언트의 사설주소(Private IP, Port)
따라서, STUN 서버는 Server Reflexive Address 만을 응답하지만 TURN 서버는 Relayed Address와 Server Reflexive Address 를 모두 응답합니다.
4. STUN 서버랑 TURN서버의 차이
TURN서버는 STUN서버의 개념을 포함하고 있는 Super Set이며 STUN서버 처럼 단순히 라우팅 테이블을 통해서 Private IP를 Public IP를 연결하는데에 그치지 않습니다.
WebRTC를 예로 들면 미디어 데이터를 1:1로 보내준다고 했을때 그 모든 데이터는 TURN 서버를 Relay 서버로 하여 데이터를 원하는 Peer에게 전달해주게 됩니다.
하지만, 만약 1:N 통신으로 스트리밍하는 서비스에서 중간에 Media 서버를 두어 중계하지 않으면 모든 Peer가 매쉬 구조로 연결되게 되어 각 Peer에 엄청난 부담을 주게 되고 네트워크 자원도 너무 많이 사용하게 됩니다.
따라서, 이것을 해결하는 MCU방식과 SFU방식이 있습니다.
TURN 서버 구축 깃허브 https://github.com/coturn/coturn