라이브 방송 구현을 위해...
그냥 OBS 써야되나 했는데 앱으로 확장 생각하면 WebRTC를 쓰는게 맞다..
1. WebRTC
WebRTC란, 웹 브라우저 환경, Android, IOS 애플리케이션에서도 사용 가능한 비디오, 음성 및 일반 데이터가 피어 간 실시간으로 전송되도록 지원하는 오픈소스이다.
공개 웹 표준으로 구현되며, 모든 주요 브라우저에서 일반 Javascript API로 제공한다.
2. 기술 및 프로토콜
1) ICE (Interactive Connectivity Establishment)
- 브라우저가 peer을 통한 연결이 가능하도록 해주는 프레임워크로, 두 단말이 통신할 수 있는 최적의 경로를 찾아줌
- peer간 단순 연결 시 작동하지 않는 이유
- 연결을 시도하는 방화벽을 통과해야 함
- 단말에 Public IP가 없다면 유일한 주소값을 할당해야 함
- 라우터가 peer간의 직접 연결을 허용하지 않는 경우
- 위의 경우 방화벽을 통과시켜주거나 private IP를 public IP로 바꾸는 STUN, TURN 서버를 사용한다.
2) NAT(Network Address Transilation, 네트워크 주소 변환)
- private IP를 쓰고 있는 각각의 단말들에 Public IP Address를 할당하여 외부 인터넷에 접속할 수 있게 해줌
- 라우터는 공개 IP 주소를 갖고있고, 모든 단말들은 라우터에 연결되어있으며, Private IP Address를 가짐
- 클라이언트에서 요청 시 private IP가 데이터를 요청했다는 것을 기록 > private IP는 외부에서 접근할 수 없으므로 NAT가 public IP로 변환하여 접근 가능하도록 함
3) STUN(Session Traversal Utilities for NAT) 서버
- NAT를 통해 public IP를 알아냄 + peer 간의 직접 연결을 막는 등의 라우터 제한을 결정
- 클라이언트의 Public Address와 클라이언트가 접근 가능한지 여부를 STUN 서버에 요청하여 알아냄
- 몇몇 라우터들은 Symmetric NAT를 사용(peer들이 이전에 연결한 적 있는 연결들만 허용함) > STUN 서버에 의해 공개 IP 주소를 발견하여도 모두 연결이 가능한 것은 아님 > TURN 사용
4) TURN(Traversal Using Relays around NAT) 서버
- STUN의 확장으로, 각 Peer들이 Private IP 안에서 통신할 수 있도록 함
- Peer들이 직접 통신하는 것이 아니라, 릴레이 역할을 하는 TURN 서버를 사용하여 공유 > Symmetric NAT 제한 우회 가능
- 오버헤드가 발생하니까, 최후의 수단(?)으로 사용하자...
5) SDP(Session Description Protocol)
- 해상도, 형식, 코덱, 암호화 등 멀티미디어 컨텐츠의 연결을 설명하기 위한 표준
- 두 peer가 다른 한쪽이 데이터가 전송되고 있다는 것을 알게 해줌
- 프로토콜은 아님.. 컨텐츠에 대한 메타데이터 설명
3. WebRTC를 위해 구현할 수 있는 서버 종류
1) Signaling 서버 (P2P / Mesh)
- peer 간의 offer, answer라는 세션 정보 signal만을 중계함
- 처음 WebRTC가 peer간의 정보를 중계할 때에만 서버에 부하가 발생하며, 연결 완료 후에는 서버에 별도 부하 없음
- 1:1 연결에 적합하나, 1:N, N:M 연결에서는 클라이언트의 과부하가 급격하게 증가함
2) SFU(Selective Forwarding Unit) 서버
- 종단 간 미디어 트래픽을 중계하는 중앙 서버 방식으로, 클라이언트 peer간 연결이 아닌 서버와 클라이언트 간의 peer를 연결함
- 1:1, 1:N, N:M 등 모든 연결 형식에서 클라이언트는 서버에게만 자신의 영상 데이터를 보내면 됨 (uplink가 1개)
- 대신 상대방의 수만큼 데이터를 받는 peer를 유지해야 함 (downlink는 N개)
- P2P보다는 느리지만 비슷한 수준의 실시간성 유지
- 클라이언트가 받는 부하는 줄어들지만, 서버 비용은 많이 듦
- 1:N 형식 또는 소규모 N:M 형식의 실시간 스트리밍에 적합
3) MCU(Multi-point Control Unit) 서버
- 다수의 송출 미디어를 중앙 서버에서 혼합 또는 가공하여 수신측으로 전달하는 중앙 서버 방식
- 클라이언트 peer간 연결이 아닌, 서버와 클라이언트 간의 peer을 연결, uplink, downlink 모두 1개
- 근데, 다수의 peer로부터 받은 video와 audio 데이터를 하나의 데이터로 편집해서 한명에게 보내는 식이라서 실시간성 저해, 비용이 많이 듦
- N:M 구조에 사용 가능 (적합하다고는 안했음)
'TIL' 카테고리의 다른 글
TIL 240725 - 에러 처리 (Referencing column ... in foreign key constraint ... are incompatible.) (0) | 2024.07.25 |
---|---|
TIL 240724 - WebRTC 구현하기 - 1:1 P2P 연결 (1) (1) | 2024.07.24 |
TIL 240722 - 에러 해결 "warning: adding embedded git repository" (0) | 2024.07.22 |
TIL 240719 - Redis (0) | 2024.07.19 |
TIL 240718 - Lexorank (0) | 2024.07.18 |