최대한 알기 쉽게 요약 !
- WebRTC를 통해 화상통화 + 채팅 + 게임 + 파일전송등을 손쉽게 할 수 있음.
- 대표적인 예 카톡영상통신, 행아웃 등 생각하면 됨
- P2P(개인간 통신)이 기본이지만 쫌 머리쓰면 다자 통신도 가능(서버 추가구성 필요)
1. WebRTC 미리보기
1.1 기본 체계
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의 높은 성능과 신뢰성이 포함된 프로토콜)