WebRTC 를 통해 다른 웹 브라우저에 P2P(개인간) 연결을 손쉽고 빠르게 할 수 있습니다. 일반적으로 통신을 배우려 한다면 NAT, 데이터손실, 연결 끊기 등 다양한 문제를 처리해야 되는데 WebRTC를 사용하면 이런 기능을 브라우져에서 기본적으로 제공하게 됩니다.
WebRTC API는 미디어 캡춰, 음성 및 영상의 인/디코딩 처리, 전송/세션 레이어관리를 지원합니다.
미디어 캡춰 : 사용자의 카메라와 마이크 권한 획득 후 스트림 처리
음성 및 영상의 인/디코딩 처리 : 영상을 프레임단위로, 음성을 작은 단위로 나눠 압축/복원 하는 코덱 지원(H.264, iSAC, Ipus, VP8 등)
전송 레이어 : 패킷 교환, 정렬, 손실 및 다른 유저에게 접속하는 것을 WebRTC API를 통해 손쉽게 관리
세션 관리 : 접속 관리, 연결, 조직화 등을 관리(signaling 이라 부름)하며 RTCDataChannel API를 통해 처리
1.2 WebRTC의 활용
실시간 마켓팅
실시간 광고
백오피스 통신(CRM, ERP, SCM, FFM)
채용 괸리
소셜 네트워킹
데이팅 서비스
온라인 의료 상담
금융 서비스
감시
멀티 게임
실시간 방송
이러닝
2. WebRTC 아키텍처
복잡함
여러 구성이 있긴 하지만 (개인 - 서버 - 개인 형태로 연결) 이구성을 통해 개발해보기로 함. (중간에 ICE + STUN / TURN은 일단 배제)
접속 => 연결관리(세션관리, 응답, 스트리밍관리, ICE 후보관리) => 이벤트 처리
2.1 RTCPeerConnection
WebRTC API의 진입점
개인간 연결 초기화할 때 유용
2.2 MediaStream
getUserMedia API
음성 및 영상 스트림에 접속권한 부여
사용자 기기(카메라, 마이크) 선택 정보 관리
스트림(영상,음성) 전송 중 보안레벨 지원
2.3 RTCDataChannel
개인간의 미디어 스트림 전송 채널 관리
2.4 요약
RTCPeerConnection : 접속 관리
MediaStream : 사용자 기기관리 및 보안
RTCDataChannel : 데이터 처리, 채널링
3. 환경구성
3.1 정적 웹서버 설치
nodejs 설치
node-static 설치 sudo npm install -g node-static
실행 static 명령어가 실행된 기준 해당 디렉토리가 static 하게 웹호스팅 된다
3.2 WebRTC 프로토콜
실시간 데이터 통신은 두 사용자간 빠른 속도로 대화하는 것이다. 고품질 유지를 위해서는 초당 약 30~60회 음성/영상 데이터가 교환이 필요하다. 그래서 중요한건 최신 데이터(프레임)를 상대에게 보내는 것이 중요
3.3 라우팅 기술
STUN (Session Traversal Utilities for NAT) : 세션 순회 유틸
STUN 서버를 통해 사용자 식별(IP정보) 후 사용자 간의 연결을 도움.
실운영(production) 환경에서는 자체 STUN 및 TURN을 배포해야합니다.
TURN (Traversal Using Relays around NAT) : 릴레이를 사용한 순회
STUN 을 허용하지 않는 네트워크에서는 TURN을 활용하여 사용자 식별
하지만, 왠만한 곳에서 TURN 없이 STUN 으로만 사용자 식별이 가능함.
ICE (Interactive Connectivity Establishment) : 대화 형 연결 설정
ICE는 STUN 서버를 사용하여(연결 실패 시 TURN 사용) 연결된 사용자정보를 클아이언트 응용 프로그램에 알린 후 연결을 설정합니다.
3.4 데이터 전송
WebRTC에서는 SCTP 프로토콜을 통해 DataChannel 개체로 감싸서 데이터를 보내는 API를 제공합니다. (SCTP 프로토콜 : UDP의 높은 성능과 신뢰성이 포함된 프로토콜)