NAT, ICE, STUN, TURN, SDP
Peer Connection에서의 핵심 개념들. 그들은 무엇인가?
공인 IP로만 되어 있으면 peer 연결이 수월할텐데, NAT 때문에 공인 IP와 사설 IP가 달라지게 된다.
이 때 서로 p2p 통신을 위해 ICE, STUN. TURN의 개념이 들어간다.
간단하게 설명하자면 STUN 서버를 이용해 NAT를 넘어 두 client 간의 연결을 시도하고,
NAT의 구조 때문에 실패할 경우 TURN 서버를 통해 데이터가 거쳐가도록 연결한다.
ICE는 두 client 간의 데이터 송수신 비용을 최소화 시키는 경로를 찾아주는 프레임워크이다.
아래 글들을 모두 읽으면서 정리했다.
https://www.html5rocks.com/ko/tutorials/webrtc/infrastructure/
http://sunsson.tistory.com/957
http://egloos.zum.com/sweeper/v/2431396
https://wiki.kldp.org/wiki.php/NAT
NAT
Network Address Translation의 약자로, 사설( 내부, Internal) IP를 routing이 되는 공인( Public ) IP로 변경해주는 것.
주의. 일반적인 가정집의 공유기는 NAT가 아니라 PAT 방식으로 작동한다.?
일반적으로 NAT는 주소변환을 하기 위하여 Packet의 다음사항을 조정한다.
- IP header의 IP address
- UDP header port
- TCP header port
필요성
- Public IP 개수 부족
- 보안 강화
변환 방법의 종류
Internal위치에서 OutputBound 시에 어떻게 External위치로 변환하는가에 대한 것이다.
공통적으로 Internal에서 UDP패킷을 보낼 때 NAT에서 internal ip와 port 및 목적지의 ip와 port를 저장한다.
Cone NAT :
목적지에 상관 없이 항상 NAT의 같은 ip: port에 매핑한다.?그러면 소켓 여러개 열면 어떻게 하나? 목적지가 같아도 연결이 여러개면 다른 port에 매핑해야하는거 아닌가?Full Cone
- NAT에 매핑된 Port에 데이터가 다시 들어오면 source의 ip및 address 상관 없이 다시 포워딩
Port Restricted Cone
- NAT에 매핑된 Port에 데이터가 다시 들어오면 source의 ip및 address가 모두 일치할 때 다시 포워딩
Restrict Cone
- NAT에 매핑된 Port에 데이터가 다시 들어오면 source의 ip가 일치한다면 다시 포워딩
Symmetric NAT : 목적지가 달라진다면(port만 바뀌어도), NAT의 다른 ip:port에 매핑한다.
구현 방법의 종류
Normal NAT (Port NAT)
- 각 Internal IP를 포트만 다르게 하여 하나의 Public IP에 연결한다.
- 방화벽이 포트 번호를 통해 경로를 정한다.
- 클라이언트에서 서버로 먼저 요청할 경우 유용함.
Reverse NAT (Static NAT or 1:1 Mapping)
- 서버에서 클라이언트에 먼저 요청할 경우, Normal로는 불가능하다. 포트는 방화벽에서 지정해주는 것이기 때문에 서버는 어느 포트로 보낼지 알지 못한다.
- 내부 네트워크 중 하나에 서버가 있는 경우, 방화벽에서 따로 설정을 해줘야한다. Public IP에 요청을 보내는 경우, 서버가 있는 Internal IP에 요청을 보내도록 설정한다. 방화벽은 송, 수신시 자동으로 IP를 변환한다.
Redirect NAT
- 내부 서버가 맛이 간 경우, 다른 공지 서버로 redirect 시켜주는 것이다.
Exclude NAT
- Normal NAT를 적용 받지 않고 방화벽을 지나도록 설정하는 것
- 방화벽과 라우터 사이에 서버가 있는 경우와 같이 특정한 경우
STUN
STUN (Session Traversal Utilities for NAT)
UDP Hole Punching 과정이라고 보면된다.
Client가 NAT 없이 공인 IP가 private IP로 할당되있으면 상관없지만, 대부분은 그렇지 않다.
STUN server는 각 client의 NAT 통과 전후의 IP를 기록하며, 상대방 client에게 이 정보를 전달해준다.
다음은 일반적인 케이스로, client와 server 사이에 하나의 NAT가 있는 client들의 연결 과정이다.
TURN
TURN (Traversal Using Relays around NAT, RFC 5766)
왠만한 NAT 환경일 경우는 연결이 성립한다(통계적으로 84%).
그런데, 둘 다 Symmetric NAT인 경우, 혹은 세팅한 모든 STUN, TURN server 들이 클라이언트 사이에 multilayer로 NAT 환경이 구성되어 있는 등, 연결에 실패할 가능성이 있다.
이 때, 공인 IP 자체로 돌아가는 TURN server를 통해 p2p인 것처럼 구현할 수 있다. STUN이 UDP라면, TURN은 TCP로 각 peer는 각자 연결된 TURN 서버에 데이터를 보낸다.
TURN 서버는 단지, 데이터가 온것을 반대쪽으로 뿌려주는 Relay 서버일 뿐이다.
TURN에 많은 client들이 몰릴 수록 데이터 이동량이 증가하면서 부담을 느끼므로 TURN 서버 부하에 많은 신경을 써야할 것이다.
ICE
ICE (Interactive Connectivity Establishment, RFC 5245 )
ICE는 NAT를 뚫고 연결 경로를 찾기 위한 Offer / Answer 모델 프레임워크이다.
Offer / Answer 은 SIP, SDP(미디어를 다루는데 주로 사용되는 프로토콜. 화상, 음성 등)에서 주로 사용된다.
다음과 같이 총 3가지 경로를 선택할 수 있다.
- NAT가 없는 네트워크. Direct Connection
- STUN으로 연결되는 경우. Server Reflexive Connection
- 위 2개로 연결되지 않는 경우. TURN Relay Connection
각 client들은 위 3가지 종류의 candidate들 중에 하나로 p2p 통신을 진행합니다.
SDP
Session Description Protocol (SDP) 는 커넥션의 멀티미디어 컨텐츠 규격(해상도, 포맷, 코덱, 압축 등등)의 표준이다. 이를 통해 피어들은 데이터가 송수신 될 때 서로의 정보들을 이해할 수 있다. 이 것은 본질적으로 미디어 컨텐츠 자체가 아니라, 컨텐츠를 표현하기 위한 메타데이터이다.