1. WebRTC์ LiveKit์ ๊ด๊ณ
- WebRTC๋ ๋ธ๋ผ์ฐ์ ๋ฐ ์ฑ์์ ์ค์๊ฐ ์ค๋์ค ๋น๋์ค ๋ฐ์ดํฐ ํต์ ์ ์ํ ํ์ค ๊ธฐ์ ์ด๋ค. WebRTC ๊ณต์ ์ฌ์ดํธ: webrtc.org
- LiveKit์ WebRTC๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฉํฐ ์ ์ ์ค์๊ฐ ์ฑ์ ๋ง๋ค๊ธฐ ์ํ ํ๋ซํผ์ด๋ค. LiveKit ์๋ฒ๋ WebRTC ๊ธฐ๋ฐ SFU๋ก ๋์ํ๋ค.
- LiveKit ์๊ฐ: Intro to LiveKit
- LiveKit SFU ๋ด๋ถ: LiveKit SFU
์ฆ, LiveKit์ WebRTC๋ฅผ ๋์ฒดํ๊ธฐ๋ณด๋ค WebRTC ์์ ๋ฃธ ๋ชจ๋ธ, ๊ถํ, ๊ตฌ๋ ์ ์ด, ํ์ฅ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ ์ด์ด์ ๊ฐ๊น๋ค.
2. ์ SFU๊ฐ ํ์ํ๊ฐ
2.1 ์์ WebRTC P2P ๋ฉ์์ ํ๊ณ
N๋ช ์ด ๋ชจ๋ P2P๋ก ์ง์ ์ฐ๊ฒฐํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ฐ ํด๋ผ์ด์ธํธ๋ N-1๊ฐ์ ์ฐ๊ฒฐ์ ์ ์งํด์ผ ํด์ ์ ๋ก๋ ๋์ญํญ๊ณผ CPU ๋ถ๋ด์ด ์ปค์ง๋ค.
A โโ B
A โโ C
A โโ D
B โโ C
...
2.2 LiveKit์ ๋ฐฉ์
- ๊ฐ ํด๋ผ์ด์ธํธ๋ SFU๋ก ํ ๋ฒ๋ง ์ ๋ก๋
- SFU๊ฐ ๋ค๋ฅธ ์ฐธ๊ฐ์์๊ฒ ํธ๋์ ์ ํ์ ์ผ๋ก ์ ๋ฌ
- ๋คํธ์ํฌ ์ํ์ ๋ฐ๋ผ ํ์ง ๋ ์ด์ด๋ฅผ ์กฐ์ ํ ์ ์๋๋ก Simulcast ๋ฑ์ ์ง์ํ๋ค
- LiveKit ๊ณ ๊ธ ๋ฏธ๋์ด: Codecs and more
A
โโ
SFU
โโ โโ โโ
B C D
3. WebRTC ํต์ฌ ๊ตฌ์ฑ ์์
3.1 RTCPeerConnection
- RTCPeerConnection์ ๋ก์ปฌ ํผ์ด์์ ์๊ฒฉ ํผ์ด์์ WebRTC ์ฐ๊ฒฐ์ ํํํ๋ ํต์ฌ API๋ค.
- webrtc.org ๊ฐ์ด๋: Getting started with peer connections
- MDN: RTCPeerConnection
์ค์ํ ๊ฐ๋ :
- ์ฐ๊ฒฐ์ ๋ ผ๋ฆฌ์ ์ผ๋ก A์ B ์ฌ์ด์ ์ฑ๋ฆฝํ์ง๋ง, ๊ฐ์ฒด ์ธ์คํด์ค๋ ๊ฐ ํผ์ด์ ํ๋์ฉ ์กด์ฌํ๋ค
- RTCPeerConnection A, RTCPeerConnection B๊ฐ ๊ฐ๊ฐ ์์ผ๋ฉฐ signaling์ผ๋ก SDP์ ICE ํ๋ณด๋ฅผ ๊ตํํด ์ฐ๊ฒฐ์ ์ฑ๋ฆฝ์ํจ๋ค
- webrtc.org: Peer connections
3.2 MediaStream๊ณผ MediaStreamTrack
- ์นด๋ฉ๋ผ ๋ง์ดํฌ ์ ๋ ฅ์ ๋ณดํต getUserMedia๋ก ์ป๊ณ , ๊ฒฐ๊ณผ๋ MediaStream์ด๋ค
- ์ค์ ๋ก ์ ์ก์ ์ฌ์ฉ๋๋ ๋จ์๋ MediaStreamTrack์ด๋ฉฐ, ํธ๋์ addTrack๋ก RTCPeerConnection์ ๋ถ์ฌ ์ ์กํ๋ค
3.3 RTCDataChannel
- RTCDataChannel์ ์์ ๋ฐ์ดํฐ ์ ์ก์ ์ํ ์ฑ๋์ด๋ค
- ๋ฐ์ดํฐ ์ฑ๋ ์ถ๊ฐ ํ๋ฆ: MDN Using WebRTC data channels
- webrtc.org: Data channels
4. ๊ตฌ์กฐ์ ์ฐ๊ฒฐ ํ๋ฆ์ ํ ์ฅ์ผ๋ก
์๋ ๋ค์ด์ด๊ทธ๋จ์ ๋ค์์ ํ ๋ฒ์ ํํํ๋ค.
- ๊ฐ ํผ์ด ๋ด๋ถ์ RTCPeerConnection๊ณผ ๋ฏธ๋์ด ํธ๋, ๋ฐ์ดํฐ ์ฑ๋์ด ์ฐ๊ฒฐ๋๋ ๊ตฌ์กฐ
- RTCPeerConnection A์ B ์ฌ์ด์์ signaling, ICE, DTLS, ๋ฏธ๋์ด, ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ๋ ํ๋ฆ
- ์์๋ก A๊ฐ B๋ก audio video๋ฅผ ๋ณด๋ด๊ณ B๊ฐ A๋ก file์ ๋ณด๋ธ๋ค๊ณ ๊ฐ์
flowchart LR Signaling server for SDP and ICE exchange SIG[Signaling server SDP and ICE exchange] Between PeerConnections PCA <-->|ICE connectivity checks| PCB PCA <-->|DTLS handshake| PCB Peer B mirrored, App at far right subgraph PeerB[Peer B] direction LR PCB[RTCPeerConnection B] AT_B[MediaStreamTrack audio] VT_B[MediaStreamTrack video] MSB[MediaStream] DCB[RTCDataChannel] AppB[App] PCB -->|ontrack| AT_B PCB -->|ontrack| VT_B AT_B --> MSB VT_B --> MSB MSB --> AppB PCB -->|ondatachannel| DCB DCB <-->|file send and onmessage| AppB end
๋ค์ด์ด๊ทธ๋จ์์ ์ด๋ฒคํธ๊ฐ ์๋ฏธํ๋ ๊ฒ
ontrack์ ์๊ฒฉ์์ ๋ค์ด์จ ํธ๋์ด RTCPeerConnection์ ์ถ๊ฐ๋ ๋ค ๋ฐ์ํ๋ ์ด๋ฒคํธ๋คondatachannel์ ์๊ฒฉ ํผ์ด๊ฐcreateDataChannel๋ก ๋ง๋ ์ฑ๋์ด ์ฐ๊ฒฐ์ ์ถ๊ฐ๋ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ค
5. ์ฐ๊ฒฐ์ด ์ฑ๋ฆฝ๋๋ ์์
์ด ์น์ ์ ์ ๋ค์ด์ด๊ทธ๋จ์ ์๊ฐ ํ๋ฆ์ผ๋ก ์์ฝํ๋ค.
- SDP ํ์
- offer๋ฅผ ๋ง๋ค๊ณ local description์ ์ค์ ํ ๋ค signaling์ผ๋ก ์ ๋ฌ
- ์๋๋ remote description์ผ๋ก ์ ์ฉํ๊ณ answer๋ฅผ ๋ง๋ค์ด ๋ค์ ์ ๋ฌ
- webrtc.org: Getting started with peer connections
- ICE ํ๋ณด ๊ตํ
- ICE ํ๋ณด๋
icecandidate์ด๋ฒคํธ๋ก ์์ฑ๋๋ฉฐ signaling์ผ๋ก ์ ๋ฌํ๋ค - ์๋๋ ํ๋ณด๋ฅผ ๋ฐ์ addIceCandidate๋ก ์ ์ฉํ๋ค
- webrtc.org: Getting started with peer connections
- ICE connectivity checks์ DTLS
- ICE๊ฐ ํ๋ณด ์์ ๊ฒ์ฌํ๊ณ ์ต์ ๊ฒฝ๋ก๋ฅผ ์ ํํ๋ค. ICE๋ STUN๊ณผ TURN์ ์ฌ์ฉํ๋ค
- RFC: RFC 8445 ICE
- ์ดํ DTLS ํธ๋์ ฐ์ดํฌ๋ก ๋ณด์ ์ฐ๊ฒฐ์ ์ฑ๋ฆฝํ๋ค. DataChannel์ DTLS๋ก ๋ณดํธ๋๋ค
6. ์์ 3๊ฐ ํ๋ฆ
6.1 A์์ B๋ก audio ์ ๋ฌ
- A๋ ๋ง์ดํฌ ํธ๋์
addTrack์ผ๋ก RTCPeerConnection A์ ์ถ๊ฐํ๋ค - ์ฐ๊ฒฐ์ด ์ฑ๋ฆฝ๋๋ฉด B์ RTCPeerConnection B์์
ontrack์ผ๋ก audio ํธ๋์ ๋ฐ๋๋ค - MDN: track event
6.2 A์์ B๋ก video ์ ๋ฌ
- A๋ ์นด๋ฉ๋ผ ํธ๋์
addTrack์ผ๋ก ์ถ๊ฐํ๋ค - B๋ ๋์ผํ๊ฒ
ontrack์ผ๋ก video ํธ๋์ ์์ ํ๋ค - MDN: track event
6.3 B์์ A๋ก file ์ ๋ฌ
- ํ์ผ ์ ์ก์ RTCDataChannel์ ์ฌ์ฉํ๋ค. ํ์ผ์ chunk๋ก ๋๋
send๋ก ์ ์กํ๊ณ ์๋๋message๋ก ์์ ํ๋ค - ์์ ์ธก ๋ฐ์ดํฐ ์ฑ๋์ RTCPeerConnection์
ondatachannel์ด๋ฒคํธ๋ก ์ ๋ฌ๋๋ค - MDN: Using WebRTC data channels
- webrtc.org: Data channels
7. ICE STUN TURN ๊ฐ๋ ๊ณผ ์์
7.1 ๊ฐ๋ ์์ฝ
- ICE๋ NAT ํ๊ฒฝ์์ ํต์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ธฐ ์ํด ํ๋ณด๋ฅผ ์์งํ๊ณ ๊ฒ์ฌํด ๊ฒฝ๋ก๋ฅผ ์ ํํ๋ ์ ์ฐจ๋ค. ICE๋ STUN๊ณผ TURN์ ์ฌ์ฉํ๋ค
- RFC: RFC 8445 ICE
- STUN์ NAT ๋ค์ ์๋ํฌ์ธํธ๊ฐ ์ธ๋ถ์์ ๊ด์ธก๋๋ ์ฃผ์ ์ ๋ณด๋ฅผ ์ป๊ฑฐ๋ ์ฐ๊ฒฐ์ฑ ๊ฒ์ฌ๋ฅผ ๋๋ ํ๋กํ ์ฝ์ด๋ค
- RFC: RFC 8489 STUN
- TURN์ ์ง์ ์ฐ๊ฒฐ์ด ๋ถ๊ฐ๋ฅํ ๋ ๋ฆด๋ ์ด ์๋ฒ๋ฅผ ํตํด ํจํท์ ์ ๋ฌํ๋ ํ๋กํ ์ฝ์ด๋ค
- RFC: RFC 8656 TURN
7.2 ์์๋ก ์ดํดํ๊ธฐ
- ๊ฐ์ LAN ํ๊ฒฝ
- host ํ๋ณด๋ง์ผ๋ก๋ ์ฐ๊ฒฐ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค
- ์๋ก ๋ค๋ฅธ ์ง ํ๊ฒฝ
- STUN์ ์ด์ฉํด ์ธ๋ถ์์ ๋ณด์ด๋ ์ฃผ์ ํ๋ณด๋ฅผ ์ป๊ณ ์ง์ ์ฐ๊ฒฐ์ ์๋ํ ์ ์๋ค
- ์๊ฒฉํ ๋ฐฉํ๋ฒฝ ๋๋ ๋์นญ NAT ํ๊ฒฝ
- ์ง์ ์ฐ๊ฒฐ์ด ์คํจํ๋ฉด TURN ๋ฆด๋ ์ด ํ๋ณด๋ฅผ ํตํด ํต์ ํ๋ค
8. LiveKit ํต์ฌ ๊ฐ๋
LiveKit ๊ธฐ๋ณธ ๋ชจ๋ธ์ Room Participant Track์ด๋ค.
- LiveKit: Rooms, participants, and tracks overview
- LiveKit: Subscribing to tracks
Token์ด ํ์ํ ์ด์
LiveKit SDK๊ฐ ์๋ฒ์ ์ฐ๊ฒฐํ๋ ค๋ฉด access token์ด ํ์ํ๋ฉฐ, ํ ํฐ์๋ ์ฐธ๊ฐ์ identity, room ์ด๋ฆ, publish subscribe ๊ถํ ๋ฑ์ด ํฌํจ๋๋ค. ํ ํฐ์ JWT ๊ธฐ๋ฐ์ด๋ฉฐ API secret์ผ๋ก ์๋ช ๋๋ค.
- LiveKit: Tokens overview
- LiveKit: Authentication overview
์ฐธ๊ณ ๋ฌธ์
WebRTC
- WebRTC ๊ณต์: https://webrtc.org/
- webrtc.org Peer connections: https://webrtc.org/getting-started/peer-connections
- webrtc.org Data channels: https://webrtc.org/getting-started/data-channels
- W3C WebRTC 1.0: https://www.w3.org/TR/webrtc/
MDN Web APIs
- RTCPeerConnection: https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection
- RTCPeerConnection addTrack: https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/addTrack
- RTCPeerConnection track event: https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/track_event
- Using WebRTC data channels: https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Using_data_channels
- MediaStream: https://developer.mozilla.org/en-US/docs/Web/API/MediaStream
- MediaStreamTrack: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack
- getUserMedia: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
ICE STUN TURN RFC
- ICE: https://www.rfc-editor.org/rfc/rfc8445
- STUN: https://www.rfc-editor.org/rfc/rfc8489.html
- TURN: https://www.rfc-editor.org/info/rfc8656
LiveKit
- Intro: https://docs.livekit.io/intro/
- Room Participant Track overview: https://docs.livekit.io/intro/basics/rooms-participants-tracks/
- Subscribing to tracks: https://docs.livekit.io/transport/media/subscribe/
- Advanced media: https://docs.livekit.io/transport/media/advanced/
- Tokens: https://docs.livekit.io/frontends/authentication/tokens/
- Authentication: https://docs.livekit.io/frontends/authentication/
- LiveKit SFU internals: https://docs.livekit.io/reference/internals/livekit-sfu/