[WebRTC] STUN & TURN ?

Pink Chun·2022년 11월 18일
3
post-thumbnail

1. WebRTC ?

WebRTC (Web Real-Time Communication)는 웹 브라우저 간에 플러그인의 도움 없이 서로 통신할 수 있도록 설계된 API이다. W3C에서 제시된 초안이며, 음성 통화, 영상 통화, P2P 파일 공유 등으로 활용될 수 있다.

간단하게 이야기 해서 웹브라우저간에 Adobe Flash나 ActiveX와 같은 별도의 플러그인 없이 서로 통신할 수 있도록 만든 기술이며 이것을 이용해서 음성,영상 통화 등 여러가지를 할 수 있다. 우리가 알만한 회사중에 WebRTC로 구성된 서비스는 Discord가 있다.

[서버를 거쳐서 클라이언트에게 전송하는 방식]

[ WebRTC의 기본적인 동작과정]

Websocket을 이용하려면 직접적으로 IP를 연결하는 방식을 사용한다. 그래서 방화벽이 존재하거나 허브를(또는 라우터를) 사용하는 NAT환경에서는 연결이 불가능하다.

중간에 NAT이 존재하여 벽이 있다고 생각하면 된다.


[번외] NAT이란?
NAT(Network Address Translators) 네트워크 주소 변환을 말한다. 즉, IP패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP주소 등을 재기록하면서 라우터를 통해 네트워느 트래픽을 주고 받는 기술이다.

즉, 쉽게말해 우리가 인터넷을 쓸때 공적인 영역(공인 네트워크)과 사적인 영역(사설 네트워크)을 나누어서 쓰게되는데, 그 공적인 영역과 사적인 영역의 경계에서 인테넷 주소를 주고 받으면서 네트워크 트래픽을 주고받게 되는데, 그 역할이 바로 NAT이다.

원래 각 기기당 IP주소하나만 받아서 사용하게 된다. 예를 들어 셋톱박스나 인터넷 설치하러 기사님이 오시면 그 공유기 랜선에 IP가 있는것이다.

노트북, 아이패드, 핸드폰으로 인터넷에 접속을 할 수 있다. 공유기를 설치하면 기기당 1개의 IP가 필요한데, 한개의 랜선만 꽂혀 있어 1개의 IP를 받는다.

여기서 NAT을 사용하는 이유를 알 수 있다.
인터넷이 연동되는 기기가 많아지면서 IP주소가 전 세계적으로 유일하게 할당되는 것은 불가능해 지고있다. 그래서 사설 네트워크에 속한 여러개의 호스트가 하나의 공인IP 주소를 사용하여 인터넷에 접속한다.

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가 같은 네트워크에 존재하고 있을때는 이것으로는 해결이 되지 않는다. 또한, NAT 환경에서 Symmetirc NAT의 경우는 어플리케이션이 달라지면 NAT의 매핑테이블이 바뀔 수 있기 때문이다.


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의 일부로 사용될 수 있도록 디자인 되었다. 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 를 모두 응답한다.

Candidate라는 개념이 추가로 존재하는데 이것은 IP와 포트의 조합으로 표시된 주소이며 이제 이 확보된것을 통해서 연결을 해야한다.

◾Direct Connection : Host 같의 직접적인 미디어 송수신
◾Server Reflexive Connection : Server Reflexive Candidate를 이용한 미디어 송수신
◾TURN Relay Connection : Relay Candidate를 이용한 미디어 송수신

이제 이렇게 확보된 3개의 주소들의 우선순위를 정하여 SDP내에 포함시켜 전송한다.
Connection을 체크한 후 Connection이 완료되면 RTP 및 RTCP 패킷을 전송하여 통화가 가능하게 된다.

RTP란 실시간 전송 프로토콜(Real-time Transport Protocol, RTP)은 IP 네트워크 상에서 오디오와 비디오를 전달하기 위한 통신 프로토콜이다.


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방식이 있다.

결론적으로 Client와 Media 서버가 서로 Peer관계를 맺어 단순 송신 혹은 수신을 하게 된다. 그래서 TURN서버를 Relay 서버로 거칠 이유가 없기 때문에 이런 서비스에서는 TURN 서버는 단순히 STUN서버의 역할을 할 가능성이 크다고한다.


[TURN 서버 구축 깃허브] https://github.com/coturn/coturn

[참고 블로그] https://andonekwon.tistory.com/

profile
최룰루의 개발일지(코린이)

1개의 댓글

comment-user-thumbnail
2024년 3월 20일

좋은 공부하고 갑니다.

답글 달기