[WebRTC 00] WebRTC란? 개념 | 동작방식 | STUN & TURN | ICE | 설명
Tech/WebRTC

[WebRTC 00] WebRTC란? 개념 | 동작방식 | STUN & TURN | ICE | 설명

반응형

WebRTC

 

WebRTC란?

WebRTC (Web Real-Time Communication)는 웹 브라우저 간에 플러그인의 도움 없이 서로 통신할 수 있도록 설계된 JavaScript API입니다. 피어간에 전송되는 비디오, 음성 및 일반 데이터를 지원하므로 개발자는 강력한 음성 및 비디오 통신 솔루션을 구축할 수 있습니다. Android 및 iOS 애플리케이션과 같은 기본 클라이언트의 경우 동일한 기능을 제공하는 라이브러리를 사용할 수 있으며, WebRTC 프로젝트는 오픈 소스 이며 Apple, Google, Microsoft 및 Mozilla 등이 지원합니다.

요약하자면 webRTC는 데이터를 P2P로 실시간 전송이 가능한 JavaScript API 입니다.

전체적인 흐름과 개념은 여기를 클릭하면 영상으로 이해하기 좋게 설명되어 있습니다 : )

 

 

개요

webRTC의 동작 방식을 알아보기 전에, 일반적으로 서버-클라이언트 통신에서 데이터가 어떻게 이동하는지를 알아보겠습니다.

클라이언트가 어떠한 데이터를 얻고자 웹사이트에 접속할 때, 우리는 해당 웹사이트의 주소(도메인 혹은 public IP) 주소를 입력하고 이동합니다. www.naver.com 이나 125.209.222.141 로 입력하면 해당 사이트에 접속이 가능하고, 서버 컴퓨터와 통신하며 데이터를 CRUD 하는 것이 가능합니다.

그런데 webRTC는 중간에 특정 서버를 두는 것이 아닌 peer to peer로 클라이언트와 클라이언트 간의 데이터 송수신 및 접근을 하는 것입니다. 그렇다면 peer에게 어떻게 접근할 수 있을까요?

내가 아닌, 다른 클라이언트 컴퓨터에 접근하는 방법을 생각해봅시다. 위에서 언급한 것처럼 주소를 통해 접속하고 싶은데, 개인 클라이언트에서 도메인 주소가 있을까요? 우리에는 www.naver.com 같은 주소가 없습니다. 하지만 IP주소는 있죠! 하지만 이때 우리가 가지고 있는 IP주소를 다른 사람이 입력한다고, 내 컴퓨터에 접근이 가능할까요?

여기에서 검색하시면 내 IP 주소를 쉽게 알 수 있습니다. 이때 여기 나오는 IP주소를 친구에게 알려준다고 해서 친구가 나랑 통신이 가능한 것은 아닙니다. 왜냐하면 이 IP는 privaite IP이기 때문입니다. 서로 통신을 하려면 public IP가 필요합니다.

그럼 내 클라이언트의 공용 IP주소는 어떻게 알 수 있으며, 내가 상대방과 통신하고자 함을 알리고, 내 비디오(혹은 전달하려는 다른 데이터)의 정보나, 규격 등을 어떻게 알리고/알 수 있을까요?

여기에서 webRTC의 중요한 부분인 signaling이 등장합니다.

 

 

Signaling

시그널링은 통신 조정의 프로세스입니다. WebRTC 애플리케이션이 'call'을 초기화하기 위해서 클라이언트는 다음과 같은 정보의 교환을 필요로 합니다.

  • 통신을 열고 닫는 데 사용되는 세션 컨트롤 메시지들.
  • 에러 메시지들.
  • 코덱이나 코덱 설정, 대역폭, 미디어 타입 같은 미디어 메타데이터.
  • 보안 연결을 수립하기 위해 사용되는 키 데이터.
  • 밖에서 보이는 것처럼 호스트의 IP 주소와 포트와 같은 네트워크 데이터.

이 시그널링 프로세스는 클라이언트에서 메시지를 앞/뒤로 전달하기 위한 방법을 필요로 합니다. 그 메커니즘은 WebRTC API에 의해 구현되지 않습니다. 여러분이 직접 구축하여야 합니다.

 

 

STUN / TURN

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이 해줄 수 있는 것은 없습니다. 어떤 방화벽인 이전에 통신하지 않았던 peer와는 연결을 허락하지 않는 경우도 있는데, 이것이 이에 해당합니다.

이럴 경우 TURN을 이용해야 한다.

 
TURN

TURN은 Traversal Using Relays around NAT의 약자로, Peer 간 직접 통신이 실패할 경우 종단점들 사이에 데이터 릴레이를 수행하는 TURN 서버들을 사용합니다. 사실상 TURN을 사용하면, P2P라고 보기는 어렵습니다.

TURN 은 Peer 들간의 미디어 스트리밍을 릴레이 하기 위해 사용됩니다. TURN은 공용 주소들을 가지고 있으며 미디어를 릴레이 하기 때문에 네트워크와 컴퓨팅 자원이 소모될 수 있습니다.

img

 

 

ICE

ICE는 Interactive Connectivity Establishment의 약자로, 클라이언트의 모든 통신 가능한 주소의 후보군을 찾아, 식별하는 것입니다. 통신 가능한 후보군에는 아래의 3가지가 있습니다.

  • Local Adress : 클라이언트의 사설 주소(Host Candidate), 랜과 무선랜 등 다수의 인터페이스가 있으면 모든 주소가 후보가 됨
  • Server Reflexive Address(Server Reflexive Candidate) : NAT 장비가 매핑한 클라이언트의 공인망 주소로 STUN에 의해 판단한다.
  • Relayed Address(Relayed Candidate) : TURN서버가 패킷 릴레이를 위해 할당하는 주소

ICE는 위 3가지의 접속 가능한 경로를 모두 수집하고, 해당 경로들에 각각 패킷을 송수신해서 가장 빠른(품질이 우수한) 것을 사용하는 것입니다.

 

 

설계

WebRTC의 주요 구성 요소는 여러 자바스크립트 API를 포함하고 있다:

  • getUserMedia: 오디오와 비디오 미디어를 가져온다. (예: 장치의 카메라와 마이크로폰에 접근하여)
  • RTCPeerConnection: 피어 간 오디오, 비디오 통신을 활성화한다. 신호 처리, 코덱 관리, P2P 통신, 보안, 대역폭 관리를 수행한다.
  • RTCDataChannel: 피어 간 양방향 임의 데이터 통신을 허용한다. 웹소켓과 동일한 API를 사용하며 매우 낮은 레이턴시를 보인다.

또, WebRTC API는 통계 함수를 포함한다:

  • getStats: 웹 애플리케이션에 WebRTC 세션에 관한 통계 집합의 검색을 허용한다. 이 통계 데이터는 별도의 W3C 문서에 기술되어 있다.

더 많은 연결 및 설정 관리 인터페이스는 여기에서 확인할 수 있습니다.

 

 

참고 자료

반응형