본문 바로가기
Stove Dev Camp

WebRTC란? (시그널링 과정 feat. Kurento Media Server) (3)(작성중)

by AndoneKwon 2021. 2. 5.

이전 글 복습

NAT 환경 같은 경우에는 자신은 Private IP를 가지고 있어서 시그널링을 할 때 Peer to Peer로 통신을 할 수 있는 방법이 없다. 따라서 자신의 퍼블릭 IP를 알아내기 위해 STUN서버를 통해서 자신의 Public 아이피를 알아내어 그 정보를 통해서 시그널링을 하게 된다. (어차피 통신을 하기 위해 라우터를 거치면 라우터 테이블에 자신의 private IP가 맵핑되어 있다.)

 

하지만 이것도 제약사항이 있어 모든 데이터를 교환할때에 특정 서버를 거쳐서 그 서버에 저장된 테이블을 통해 보내주게 되는데, 이 방식을 TURN서버라고 한다. TURN 서버는 기본적으로 STUN 서버를 포함하고 있는 슈퍼셋의 개념이며 STUN에 비해서 더 네트워크 환경의 제약이 없다. 다만 턴서버에는 엄청난 단점이 있는데, 네트워크 리소스 비용이 굉장히 많이 발생한다. 왜냐면 STUN은 단순히 퍼블릭 IP를 알려주는데에 그치지만, TURN 서버는 모든 데이터가 거쳐가기 때문에 운영적인 리소스 비용과 단순히 네트워크 리소스 적인 비용이 많이 들어가게 된다. 그래서 일반적으로 WebRTC를 이용해서 서비스를 할때에는 TURN서버 까지 사용하는 경우는 별로 없다고 한다.

WebRTC 와 미디어  서버

WebRTC는 1번글에서 기본적으로  P2P 방식으로 동작이 된다. 그래서 만약에 N:M이나 1:N을 구현하기 위해서는 매시 구조를 가져가야 한다. 그림은 아래와 같다.

P2P 방식의 M:N 구조

그림을 보다시피 모든 피어간 연결이 필요하기 때문에 네트워크 리소스를 매우 많이 잡아먹고 각 클라이언트에 부담을 굉장히 많이 주게 된다. 따라서 중간에 중계를 해주는 서버가 하나 필요한데 이것이 바로 Media 서버이다.

 

미디어서버의를 통한 WebRTC의 두가지 종류

위에서 말한것 처럼 다자간에 대한 WebRTC 통신은 많은 제약사항을 가지고 있기 때문에 중간에 미디어서버를 통해 통신을 하게 되는데 두가지로 나뉜다.

SFU 방식

SFU 방식 그림

SFU 방식은 단순히 받은 데이터를 연결된 Peer들에게 뿌려준다. 중간 처리를 하지 않고 그대로 보내주기 때문에 서버에 부하가 상대적으로 적은 방식이다. WebRTC는 HTTPS를 반드시 통해야 하기 때문에 암호화, 복호화, 연결관리 등의 역할을 해준다.

 

MCU

MCU 방식 그림

MCU 방식은 중앙에서 비디오를 인코딩 등과 같은 전처리를 하여 피어에게 다시 전달 해 주는 역할을 한다. 즉, 중간에서 믹싱을 해준다. 따라서, 인코딩을 통해서 압축률을 좋게 하여 각 피어들에게 던져주면 네트워크 리소스 비용에서는 유리하나 중앙에서 처리해주는 서버의 CPU리소스를 많이 잡아먹는다는 단점이 있다.

 

Media 서버의 종류

그래서.. MCU 방식으로 내가 구현하기는 너무 무리가 있어서 기존에 있던 오픈소스들을 찾아봤다.

다양한 미디어 서버들

암튼 이런 다양한 미디어 서버들이 있는데 내가 선택한 Media 서버는 다음과 같다. 바로

Kurento Media 서버

Kurento Media 서버이다.

이걸 고르게된 이유는 여러가지가 있는데 우선 JAVA로 된 API를 지원하며 레퍼런스가 비교적 잘되어 있고 무엇보다 "무료"이다. 그리고 지원하는 다양한 기능들도 많이 선택했다. 설치하는 방법을 알아보자.

 

Kurento Media 설치방법

이상하게 나는 도커를 이용해서 설치를 하였을때는 잘 동작되지 않아 로컬에 있는 Ubuntu 서버에 설치하였다.  쿠렌토 미디어서버의 공식 문서를 참조하여 설치하였다.

 

1. 우선 gnupg를 다운받는다.(암호화 관련)

sudo apt-get update && sudo apt-get install --no-install-recommends --yes \ gnupg

2. Kurento Repository를 서버에 설정을 한다.(반드시 저대로 잘써줘야 하며 오타가 있어서 안된다.)

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5AFA7A83

# Get Ubuntu version definitions
source /etc/upstream-release/lsb-release 2>/dev/null || source /etc/lsb-release

# Add the repository to Apt
sudo tee "/etc/apt/sources.list.d/kurento.list" >/dev/null <<EOF
# Kurento Media Server - Release packages
deb [arch=amd64] http://ubuntu.openvidu.io/6.15.0 $DISTRIB_CODENAME kms6
EOF

 3. 그 후 apt-get install을 이용하여 설치한다.

sudo apt-get update && sudo apt-get install --no-install-recommends --yes \
    kurento-media-server

 

실행은 service 명령어를 이용해서 키고 끄면 된다. 구글 스턴서버에 뭔가 문제가 있어 본인은 coturn 서버를 설치하여 STUN 설정을 별도로 해주었지만 필수는 아니기 때문에 넘어간다.

 

그렇다면 이렇게 실행시킨 WebRTC Media서버는 어떤 과정을 통해서 서버와 Peer가 연결되는 과정을 거칠까?

 

서버와의 Signaling 과정