TURN은 NAT 또는 방화벽의 통과를 지원하는 프로토콜이며 TURN 서버는 relay 서버입니다.
STUN 기술로는 같은 NAT 내에 존재하거나 Symmetric NAT 을 사용하는 클라이언트 끼리의 통신을 지원할 수 없는 문제가 있기 때문에 이를 해결하기 위해 TURN을 사용합니다.
TURN은 RFC-5766에 정의되어 있습니다.
두 클라이언트(peer)가 서로 통신을 하려고 하는데 자신의 Public IP를 통해 상대방이 통신할 수 없을 때, TURN 서버를 사용하여 relay하는 방식으로 통신을 하게 됩니다.
직접 통신하지 않고 relay 함으로 인해 오버헤드 및 지연이 발생하지만 이 방법이 아니면 통신할 수 없으므로 어쩔 수 없을 경우 사용합니다.
클라이언트와 TURN 서버 간의 통신은 UDP를 이용하지만 STUN의 사용과 동일하게 TCP 및 TLS의 지원도 이루어지고 있습니다.
아래 그림에서 Peer A는 STUN 서버를 통해 본인의 Public IP를 가지고 오지만, Symmetric NAT를 사용하기 때문에 다른 클라이언트나 서버와 통신(=애플리케이션이 다른 경우)할 때에는 NAT Mapping Table(Private IP, Port)가 변경되기 때문에 STUN을 통해 바인딩한 정보를 사용할 수 없게 됩니다.
RFC-5766 문서의 Figure 1을 보면,
1. TURN Client 는 Private IP 10.1.1.2:49721 를 가지고 Public IP 192.0.2.1:7000 을 가집니다.
2. Peer A는 Private IP 192.168.100.2:49582 를 가지고 Public IP 192.0.2.150:32102 를 가집니다.
3. Peer B는 NAT를 사용하지 않으므로 Public IP 192.0.2.210:49191 을 가집니다.
4. TURN Client는 TURN Server의 알려진 주소 192.0.2.15:3478 로 TURN 메시지를 보냅니다.
클라이언트는 TURN Command를 통해 Relayed Transport Address가 포함된 ALLOCATION이라는 자료 구조를 설정합니다.
5. ALLOCATION이 생성되면 클라이언트는 TURN 서버의 relay를 통해 상대 peer로 데이터를 전송할 수 있게 됩니다.
Peer가 NAT 뒤에 있으면(192.168.100.2:49582) 클라이언트는 상대 peer의 Public IP(192.0.2.150:32102)를 지정하여 relay를 요청해야 합니다. (** 아마도 TURN을 사용하기 전 이미 STUN을 통해 Public IP를 획득하고, Symmetric NAT로 인해 직접 통신을 할 수 없는 환경이기 때문에 Public IP는 이미 알고있을 것입니다.)
클라이언트는 동시에 여러 개의 서버 ALLOCATION을 가질 수 있습니다.
Google에서 WebRTC 설명 시 정리해준 TURN 그림입니다.
Reference
- en.wikipedia.org/wiki/Traversal_Using_Relays_around_NAT
- developer.mozilla.org/ko/docs/Web/API/WebRTC_API/Protocols
'Acronym&Abbreviation' 카테고리의 다른 글
STUN (Session Traversal Utilities for NAT) (0) | 2021.03.17 |
---|---|
NAT (Network Address Translation) (0) | 2021.03.17 |