반응형

 VoIP 도 그러하지만, WebRTC 역시 Peer 간 연결을 위해서 NAT 환경에 대한 고려가 필요하다. 이를 위해서 IETF에서 표준을 정의한 것이 바로 STUN과 TURN, 그리고 ICE 이다.


1. NAT에 대하여

NAT는 외부망과 분리하고 공인망과 내부망의 IP:Port 를 매핑해주는 것이다. 다음 그림을 보면..

 192.168.100.3:3855 에 대해서 NAT는 외부에 145.12.131.7:6282 로 매핑해서 전달한다. 외부에서 보면 145.12.131.7:6282로 접속하면 되는 것처럼 보이지만 NAT종류에 따라서 달라진다.


1.1 Full Cone NAT

 클라이언트와 한번 매핑하면 다른 곳에서도 해당 포트로 접속 가능함


1.2 Restricted Cone NAT

클라이언트와 한번 매핑했지만, 클라이언트가 접속했던 서버만 접속 가능하며, 서버1에서는 해당 포트로 다른 소켓을 열어 접속 가능함(분류 기준은 IP임)


1.3 Port Restricted Cone NAT

클라이언트와 한번 매핑하면 클라이언트가 접속했던 서버만 클라이언트에 접속 가능하며 포트도 매핑되어 있어서 서버1에서 다른 소켓을 열 경우 접속 불가함


1.4 Symmetric NAT


Port Restricted Cone NAT의 모든 특성에 클라이언트가 같은 포트에 다시 소켓을 열어도 NAT쪽 포트가 달라질수 있음


 P2P IP 연결에 있어서 NAT 환경에 따라 제약이 발생할 수 있으며(NAT가 Trolling 한다고 함), 접속하는 IP:Port가 클라이언트에 세팅된것과 다를 수 있다. 따라서 NAT 환경에서 P2P를 가능하게 하기 위해서는(Holepunching) STUN, TURN, ICE 프로토콜등이 필요하다.




2. STUN에 대하여

 STUN 은 Session Traversal Utilities for NAT 의 약자이다. STUN 은 IETF RFC 5389에 정의된 네트워크 프로토콜/패킷 포맷으로, 네트워크 환경에 대한 Discovery 를 위한 것이다. 메신저들끼리 통신하기 위하여 STUN 패킷을 이용한다. STUN은 IP 종단을 연결하기 위해서


 1) 어떤 종단이 NAT/Firewall 뒤에 있는지를 판단하게 해준다.

 2) 어떤 종단에 대한 Public IP Address를 결정하고 NAT/FIrewall의 유형에 대해서 알려준다.


 2)번의 정보를 가지고 P2P IP 연결을 위한 정보를 제공해주는 것이다. STUN은 P2P IP 연결을 위한 정보를 제공하주기만 할 뿐이며, 어떤 종단의 환경이 P2P IP 연결이 불가능할 경우에는 연결을 위해서 STUN이 해줄수 있는 것은 없다. 이럴 경우 TURN을 이용해야 한다.


 STUN은 Public 관점에서 종단에 Access 가능한 IP:Port를 발견하는 작업인 것이다.

 

 STUN은 다음을 테스트하여 방화벽 종류를 결정한다.


 대부분 WebRTC 호출은 STUN을 이용한 연결을 성공적으로 만들어 낸다고 한다. 


3. TURN에 대하여

 TURN은 Traversal Using Relays around NAT의 약자이다. Peer간 직접 통신이 실패할 경우 종단점들 사이에 데이터 릴레이를 수행하는 TURN 서버들을 사용한다. TURN 은 Peer 들간의 미디어 스트리밍을 릴레이하기 위해 사용된다. TURN은 공용 주소들을 가지고 있으며 미디어를 릴레이 하기 때문에 네트워크와 컴퓨팅 자원이 소모될 수 있다.



TURN의 동작은 Simple 하다.

TURN Client는 TURN 서버를 이용하고자 할때 Allocate Request를 보내고, Allocation이 성공하면 TURN Server는 해당 Client에 할당된 Relayed Transport Address를 포함한 응답을 보낸다.  위 그림에서 보면 192.0.2.15:50000 번이 해당 응답으로 전달되고, TURN Client는 통신하고자 하는 Peer에게 이 주소를 전달한다. 그리고 Turn CLient에 접속하고자 하는 Peer는 이 Address:Port 로 Turn Server에 접근하여 TURN Client와 P2P 연결이 맺어지는 것이다.


 자세한 Flow와 프로토콜은 RFC5766 을 확인하면 된다.


4. ICE(Interactive Connectivity Establishment)

 ICE 는 클라이언트의 모든 통신 가능한 주소를 식별하는 것이다. 이를 위해서 다음 3가지를 활용한다.

 - Local Address : 클라이언트의 사설 주소(Host Candidate), 랜과 무선랜 등 다수 인터페이스가 있으면 모든 주소가 후보가 됨

 - Server Reflexive Address : NAT 장비가 매핑한 클라이언트의 공인망 주소로 STUN에 의해 판단한다.(Server Reflexive Candidate)

 - Relayed Address : TURN서버가 패킷 릴레이를 위해 할당하는 주소(Relayed Candidate)


이 3가지 주소로 다음 그림과 같은 연결이 가능하다.


ICE는 우선 연결 가능한 접속 경로들를 수집하고, 해당 경로에 패킷을 송수신해서 각 경로에서 품질이 우수한 것을 사용하는 것이다. 접속 Candidate에 대해서 SDP 로 전달하는데 다음은 그 예이다.


 여기서 보면 candidate에 Host의 local address, srfix(Server Reflex) Address, Relay Address가 기술되어 있고 이 접속 경로들로 상호 패킷들이 오가면서 RTT, 전송 속도, 안정성 등을 판단해서 미디어 연결을 한다.  다음의 그림처럼 Candidate List에 대해서 확인을 하고

이중 하나를 연결한다.


5. 참고자료

- http://sparcs.kaist.ac.kr/seminar/attachment/pipoket-20160505-0.pdf

- http://www.nexpert.net/424

- http://hacks.mozilla.or.kr/2013/08/webrtc-and-the-ocean-of-acronyms/

- https://www.viagenie.ca/publications/2008-08-cluecon-stun-turn-ice.pdf

- http://www.ietf.org/rfc/rfc5766.txt

- https://en.wikipedia.org/wiki/STUN

반응형
Posted by alias
,