Android

WebRTC (1) - 웹RTC (스트리밍)

Jiwon_Loopy 2024. 9. 8. 18:06
반응형

출처 : Web.dev

WebRTC 란?


Web Real-Time-Communications의 약자로 음성, 영상, 미디어, 텍스트, 파일과 같은 데이터를 브라우저끼리 주고받을 수 있게 만든 기술입니다. 

별도의 플러그인이나, 소프트웨어가 없어도 P2P, 화상회의 및 데이터를 공유할 수 있도록 설계된 API 입니다.

최근 떠오르는 기술인 스트리밍 서비스에 많이 이용되고 있습니다.

 

 

 

통신 구조


WebRTC 기술은 P2P 통신에 최적화되어 있습니다.

 

 

 

P2P란?

 

중앙 서버를 두지않고, 각 단말들이 서로 동등한 입장에서 통신을 하는 네트워크를 일컫는 말입니다.

각 단말은 서버임과 동시에 클라이언트도 될 수 있습니다.

중앙 집중식 관리 시스템이 아닌, 상호 연결된 노드(피어)들이 서로 간 자원을 공유하는 것을 P2P네트워크라고 합니다.

 

 

 

P2P네트워크의 장단점

 

- 서버가 필요하지 않고, 각 노드들이 트래픽과 자원을 할당해 부하를 분산시켜줍니다.

- 노드가 증가하더라도 서비스를 유지할 수 있는 높은 확장성을 갖고 있습니다.

- 새로운 기능을 추가하거나 업데이트를 할 경우 관리가 어렵다.

- 네트워크 전송 시간 때문에 노드 간 정보 불일치, 성능 저하가 발생하기 쉽다.

 

 

 

데이터 교환을 도와주는 클래스


 

getUserMedia()

사용자의 카메라나 마이크와 같은 미디어 입력 장치에 접근할 수 있게 해주는 API입니다. 비디오 스트림이나 오디오 스트림을 가져올 수 있습니다.

 

 

MediaStream()

오디오나 비디오 트랙의 동기화된 스트림을 나타냅니다. getUserMedia()로 얻은 스트림이나 다른 소스에서 생성된 스트림을 포함할 수 있습니다.

카메라와 마이크 등의 데이터 스트림에 접근할 수 있습니다.

 

 

RTCPeerConnection()

피어 간의 WebRTC 연결을 설정하고 관리하는 인터페이스입니다. 이를 통해 오디오, 비디오, 데이터를 교환할 수 있습니다.

암호화 및 대역폭 관리 및 오디오, 비디오의 연결을 할 수 있습니다.

 

 

RTCDataChannel()

RTCPeerConnection을 통해 피어 간에 임의의 데이터를 주고받을 수 있게 해주는 채널입니다.

일반적인 데이터의 P2P 통신의 예 입니다.

 

 

 

보통 MediaStream, RTCPeerConnection, RTCDataChannel 을 이용해 데이터 교환이 이뤄지며, RTCPeerConnection 들이 적절하게 데이터를 교환할 수 있게 처리해주는 과정을 시그널링 이라고 합니다.두 명의 유저가 스트림을 주고받을 때 연결을 요청하는 부분을 콜러라고 하며, 연결을 받는 부분을 콜리라고 합니다.

 

콜러와 콜리가 통신을 하기 위해 중간 역할을 해 주는 서버가 필요하며, 서버를 통해 SessionDescription을 서로 주고 받아야 합니다.

 

 

관련 용어


Stun Server, Turn Server

 

WebRTC는 P2P통신을 위해 Peer들 간의 데이터 교환을 위해 IP가 필요한데, 방화벽과 같은 요소로 인해 Peer간의 연결이 쉽지 않습니다. 

서로간의 연결을 위한 정보를 공유하여 P2P 통신을 가능하게 하려면 Stun, Turn 서버가 필요합니다.

 

 

 

STUN (Session Traversal Utilities for NAT)

NAT는 비공개 로컬 네트워크 내에서 사용할 수 있는 IP 주소를 기기에 제공하지만 이 주소는 외부적으로 사용할 수 없습니다. 공개 주소가 없으면 WebRTC 피어는 통신할 방법이 없습니다. 이 문제를 해결하기 위해 WebRTC는 STUN을 제공합니다.

STUN이 수행하는 작업은 NAT뒤에서 실행되는 앱에서 수신되는 요청의 IP:포트 주소를 확인하고 해당 주소로 다시 응답을 보냅니다.

 

1. 클라이언트는 자신의 로컬 IP 주소와 포트를 STUN 서버에 보냅니다.

2. STUN 서버는 클라이언트의 요청을 받고 클라이언트가 외부에서 보이는 공용 IP 주소와 포트를 반환합니다.

3. 클라이언트는 이 정보를 바탕으로 상대방과 직접 P2P 연결을 시도할 수 있습니다.

출처 : web.dev

 

 

 

TURN (Traversal Using Relays around NAT)

일반적으로 P2P 연결이 불가능하거나, 어려운 경우 데이터를 중계하는 역할을 합니다. 클라이언트가 서로 직접 통신할 수 없을 때 TURN 서버를 통해 데이터를 주고받습니다. TURN은 피어 간에 오디오, 동영상, 데이터 스트리밍을 전달하는 데 사용되며, TURN 서버에는 공개 주소가 있으므로 피어가 방화벽이나 프록시 뒤에 있더라도 피어가 연결할 수 있습니다. 개념적으로는 간단한 작업인 스트림을 중계하지만, STUN 서버와 달리 본질적으로 많은 대역폭을 소비합니다. 즉, TURN 서버는 더 강력해야 합니다.

 

1. 클라이언트는 TURN 서버에 연결을 요청하고 TURN 서버는 양측 클라이언트로부터 데이터를 받아 전달합니다.

2. 즉, 클라이언트가 직접 상대방과 연결되지 못할 때 TURN 서버가 중간에서 데이터를 전달해주는 중계 역할을 합니다.

3. TURN 서버는 모든 트래픽을 중계하기 때문에 서버 부하가 높아질 수 있으며, STUN 보다 비용이 많이 들 수 있습니다.

출처 : web.dev

 

 

 

NAT(Network Address Translation)

NAT은 단말에 공개 IP주소를 할당하기 위해 사용됩니다. 라우터는 공개 IP 주소를 갖고있고, 모든 단말은 라우터에 연결되어 있습니다. 또한 비공개IP 주소를 갖고 있습니다. 요청은 단말의 비공개 주소로부터 라우터의 공개 주소와 유일한 포트를 기반으로 번역됩니다. 이러한 경유로 각각의 단말이 유일한 공갸 IP 없이 인터넷 상에 검색 될 수 있는 방법입니다.

하지만, 라우터 중 일부는 네트워크에 연결할 수 있는 제한을 갖고 있어, STUN의 공개 IP 주소가 있더라도 모두 연결할 수 있는 것은 아니므로, 이 경우 TURN 서버가 필요합니다.

 

 

SDP(Session Description Protocol)

세션 기술 프로토콜은 스트리밍 미디어의 초기화 인수를 기술하기 위한 포맷입니다. WebRTC를 이용하여 SDP 포맷에 맞춰 음성, 영상 데이터를 교환할 수 있습니다. 

해상도나 형식, 코덱, 암호화등의 멀티미디어 컨텐츠의 연결을 설명하기 위한 표준입니다.

 

SDP 예제

v=0
o=- 7614219274584779017 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
a=msid-semantic: WMS
m=audio 1 RTP/SAVPF 111 103 104 0 8 107 106 105 13 126
c=IN IP4 0.0.0.0
a=rtcp:1 IN IP4 0.0.0.0
a=ice-ufrag:W2TGCZw2NZHuwlnf
a=ice-pwd:xdQEccP40E+P0L5qTyzDgfmW
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=mid:audio
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:9c1AHz27dZ9xPI91YNfSlI67/EMkjHHIHORiClQe
a=rtpmap:111 opus/48000/2
…

 

ICE(Interactive Connectivity Establishment)

ICE는 부라우저가 Peer를 통한 연결이 가능하게 해 주는 프레임워크입니다. 피어 간 연결이 단순하게 연결하는 것으로 작동하지 않는 것에 대한 이유로는 방화벽을 통과해야 하고, 단말에 공개IP가 없다면 주소값을 할당해야 할 필요가 있으며, 라우터가 직접 연결을 허용하지 않을 때에는 데이터를 릴레이 해야 합니다.

ICE는 이러한 작업을 수행하기 위해 STUN, TURN을 이용합니다.

 

 

RTMP(Real Time Messaging Protocol)

RTMP는 오디오, 비디오 및 기타 데이터를 인터넷을 통해 스트리밍을 할 때 쓰입니다. 

어도비 플래시 플레이어와 서버 사이의 통신에 이용됩니다.

 

 

안드로이드에서 사용


 

  • WebRTC와 같은 P2P 기반 실시간 통신에서는 주로 STUN 서버로 먼저 공용 IP 주소를 알아내고, 연결이 어려울 경우 TURN 서버를 사용해 데이터를 중계하는 방식으로 동작합니다.
  • GlideDagger Hilt와는 다르게, 네트워크 통신을 직접적으로 처리해야 하는 경우라면 STUN과 TURN 서버 설정을 잘해야 안정적인 연결을 보장할 수 있습니다.
  • Google의 WebRTC 라이브러리에서는 STUN과 TURN 서버 설정을 코드에서 쉽게 적용할 수 있으며, 대부분의 안드로이드 실시간 통신 앱에서도 이런 서버 설정이 필수적입니다.

 

 

 

참고 사이트


https://medium.com/@hyun.sang/webrtc-webrtc%EB%9E%80-43df68cbe511

 

[WebRTC] WebRTC란?

제가 회사에서 열심히 공부하면서 개발하고 있는 WebRTC API에 대한 글을 써 볼려고 합니다.

medium.com

https://web.dev/articles/webrtc-infrastructure?hl=ko

 

WebRTC 앱에 필요한 백엔드 서비스 빌드  |  Articles  |  web.dev

이 페이지는 Cloud Translation API를 통해 번역되었습니다. WebRTC 앱에 필요한 백엔드 서비스 빌드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 참고: WebRTC는 P2P

web.dev

 

 

728x90
반응형