WebRTC : RTCPeerConnection
RTCPeerConnection ๊ฐ์
RTCPeerConnection์ WebRTC(Web Real-Time Communication)์ ํต์ฌ ๊ตฌ์ฑ ์์ ์ค ํ๋๋ก, ์น ๋ธ๋ผ์ฐ์ ๊ฐ์ ์ค์๊ฐ ๋ฏธ๋์ด ์คํธ๋ฆผ(์: ๋น๋์ค, ์ค๋์ค)๊ณผ ๋ฐ์ดํฐ ์ฑ๋์ ์ค์ ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ API๋ฅผ ์ ๊ณตํ๋ค. WebRTC์ ์ ๋ฐ์ ์ธ ๋ชฉ์ ์ด ์น ๋ธ๋ผ์ฐ์ ๊ฐ์ P2P ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด๋ผ๋ฉด, RTCPeerConnection์ ์ด๋ฌํ P2P ์ฐ๊ฒฐ์ ์ค์ง์ ์ผ๋ก ๊ตฌ์ฑํ๊ณ ๊ด๋ฆฌํ๋ ์ญํ ์ ์ํํ๋ค. RTCPeerConnection์ WebRTC์ ์ค์ ๋คํธ์ํฌ ํต์ ๋ถ๋ถ์ ๋ด๋นํ๋ฉฐ, ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ์ต์ ์ ์ฐ๊ฒฐ์ ์ ์งํ๊ธฐ ์ํด ๋ณต์กํ ์๊ทธ๋๋ง๊ณผ ๋คํธ์ํฌ ์ฒ๋ฆฌ๋ฅผ ํฌํจํ๊ณ ์๋ค.
RTCPeerConnection์ ๊ตฌ์กฐ์ ๊ตฌ์ฑ ์์
RTCPeerConnection์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์์ ํ์ ์์คํ ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ด๋ค์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ญํ ์ ํตํด P2P ์ฐ๊ฒฐ์ ์ค์ ๊ณผ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ค.
ICE (Interactive Connectivity Establishment)
RTCPeerConnection์ ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฅ ์ค ํ๋๋ ๋ค์ํ ๋คํธ์ํฌ ํ๊ฒฝ์์ ์ฐ๊ฒฐ์ ์ค์ ํ ์ ์๋๋ก ํ๋ ICE(Interactive Connectivity Establishment) ํ๋กํ ์ฝ์ ๊ตฌํ์ด๋ค. ICE๋ NAT(Network Address Translation) ๋ฐ ๋ฐฉํ๋ฒฝ์ ์ฐํํ์ฌ ๋ ํผ์ด ๊ฐ์ ์ฐ๊ฒฐ์ ์ค์ ํ๋ ๋ฐ ํ์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
Candidate Gathering: ICE๋ ๋ก์ปฌ, ์๋ฒ ๊ธฐ๋ฐ(STUN/TURN ์๋ฒ๋ฅผ ํตํ) ๋ฐ ํผ์ด ์ฐ๊ฒฐ ํ๋ณด๊ตฐ์ ์์งํ๋ค. ์ด ํ๋ณด๋ค์ ๋ค์ํ ๋คํธ์ํฌ ๊ฒฝ๋ก๋ฅผ ํตํด ์ฐ๊ฒฐ์ ์๋ํ ์ ์๊ฒ ํ๋ค.
Connectivity Checks: ์์ง๋ ํ๋ณด๊ตฐ์ ์ฌ์ฉํ์ฌ ์ค์ ๋ก ์ฐ๊ฒฐ ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ธฐ ์ํ ์ฐ๊ฒฐ์ฑ ํ ์คํธ๋ฅผ ์ํํ๋ค. ์ด ๊ณผ์ ์์ ์ต์ ์ ๊ฒฝ๋ก๊ฐ ์ ํ๋๋ค.
ICE Candidate: ICE Candidate๋ ํผ์ด ๊ฐ์ ์ฐ๊ฒฐ์ ์ค์ ํ๊ธฐ ์ํ ๋คํธ์ํฌ ๊ฒฝ๋ก์ ์ ๋ณด์ด๋ค. RTCPeerConnection์ ์ด๋ค์ ์์งํ๊ณ ํ ์คํธํ์ฌ ์ต์ ์ ๊ฒฝ๋ก๋ฅผ ๊ฒฐ์ ํ๋ค.
SDP (Session Description Protocol)
SDP(Session Description Protocol)๋ ๋ฉํฐ๋ฏธ๋์ด ํต์ ์ธ์ ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ธฐ์ ํ๊ธฐ ์ํ ํ๋กํ ์ฝ์ด๋ค. RTCPeerConnection์์ SDP๋ ํผ์ด ๊ฐ์ ์ฐ๊ฒฐ์ ์ค์ ํ๊ธฐ ์ํด ํ์์ ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ๋ฏธ๋์ด ์คํธ๋ฆผ์ ํ์, ์ฝ๋ฑ, ๋คํธ์ํฌ ์ ๋ณด ๋ฑ์ด ํฌํจ๋๋ค.
SDP Offer/Answer ๋ชจ๋ธ: RTCPeerConnection์ "Offer/Answer" ๋ชจ๋ธ์ ํตํด ๋ ํผ์ด ๊ฐ์ ํ์ ๊ณผ์ ์ ์งํํ๋ค. ํ ํผ์ด๊ฐ ์ฐ๊ฒฐ์ ์ ์ํ๋ฉด(Offer), ๋ค๋ฅธ ํผ์ด๊ฐ ์ด์ ๋ํ ์๋ต์ ์ ๊ณตํ๋ค(Answer). ์ด ๊ณผ์ ์์ ๊ฐ ํผ์ด๋ ์ฐ๊ฒฐํ ๋ฏธ๋์ด ์คํธ๋ฆผ์ ํ์๊ณผ ์กฐ๊ฑด์ ํ์ํ๊ฒ ๋๋ค.
Codec Negotiation: SDP๋ฅผ ํตํด ์๋ก ์ฌ์ฉํ ์ฝ๋ฑ์ ํ์ํ๊ฒ ๋๋ค. ์ด๋ ๋ ํผ์ด๊ฐ ๋์ผํ ์ฝ๋ฑ์ผ๋ก ๋ฏธ๋์ด๋ฅผ ์ ์กํ๊ณ ์์ ํ ์ ์๋๋ก ๋ณด์ฅํ๋ค.
Signaling
RTCPeerConnection์ ํผ์ด ๊ฐ์ ์ง์ ์ ์ธ ํต์ ์ ์ค์ ํ๊ธฐ ์ ์ ์๊ทธ๋๋ง(Signaling) ๊ณผ์ ์ ํ์๋ก ํ๋ค. ์ด ์๊ทธ๋๋ง์ ๋ณดํต WebSocket์ด๋ ๋ค๋ฅธ ์ปค๋ฎค๋์ผ์ด์ ์ฑ๋์ ํตํด ์ด๋ฃจ์ด์ง๋ฉฐ, ์๊ทธ๋๋ง ์๋ฒ๋ RTCPeerConnection์ด ์๋ก์ ๋คํธ์ํฌ ์ํ๋ฅผ ๊ตํํ๊ณ , ICE ํ๋ณด๊ตฐ์ ๊ณต์ ํ๋ฉฐ, SDP ์คํผ์ ์๋ต์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ๋๋๋ค.
Signaling Server์ ์ญํ : ์๊ทธ๋๋ง ์๋ฒ๋ ํผ์ด ๊ฐ์ ์ด๊ธฐ ํต์ ์ ์ค๊ณํ๊ณ , ํ์ํ ์ ๋ณด๋ฅผ ๊ตํํ๋ ์ค๊ฐ ๋จ๊ณ์์ ์ค์ํ ์ญํ ์ ํ๋ค. RTCPeerConnection ์์ฒด๋ ์๊ทธ๋๋ง ๋ฐฉ๋ฒ์ด๋ ์๋ฒ ๊ตฌํ์ ๋ํด ๊ด์ฌํ์ง ์์ง๋ง, ์๊ทธ๋๋ง์ด ์์ผ๋ฉด P2P ์ฐ๊ฒฐ์ ์ค์ ํ ์ ์๋ค.
Signal Exchange: ์๊ทธ๋๋ง ์๋ฒ๋ฅผ ํตํด ํผ์ด๋ค์ ์๋ก์ SDP์ ICE ํ๋ณด๋ฅผ ๊ตํํ๋ค. ์ด ์ ๋ณด๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๊ตํ๋๋ฉด, ํผ์ด ๊ฐ์ ์ง์ ์ ์ธ P2P ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํด์ง๋ค.
RTCPeerConnection์ ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ์ ์ด
RTCPeerConnection์ ์ค์ ๋ฏธ๋์ด ์คํธ๋ฆผ๊ณผ ๋ฐ์ดํฐ ์ฑ๋์ ๊ด๋ฆฌํ๊ณ ์ ์ดํ๋ ์ค์ํ ์ญํ ์ ํ๋ค. ์ฌ๊ธฐ์๋ ๋ฏธ๋์ด ์ ์ก์ ์์๊ณผ ์ค์ง, ๋์ญํญ ๊ด๋ฆฌ, ์ค๋ฅ ์ฒ๋ฆฌ ๋ฑ์ด ํฌํจ๋๋ค.
Media Streams ๊ด๋ฆฌ
RTCPeerConnection์ ๋น๋์ค ๋ฐ ์ค๋์ค ์คํธ๋ฆผ์ ์ ์กํ๊ณ ์์ ํ ์ ์๋ค. ๊ฐ ๋ฏธ๋์ด ์คํธ๋ฆผ์ ํธ๋(track)์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ด๋ฌํ ํธ๋๋ค์ ๊ฐ๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ด๋ ์ ์๋ค.
AddTrack์ RemoveTrack: RTCPeerConnection์ addTrack๊ณผ removeTrack ๋ฉ์๋๋ฅผ ํตํด ๋ฏธ๋์ด ์คํธ๋ฆผ์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ํผ์ด์๊ฒ ์ ์ก๋๋ ๋ฏธ๋์ด๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
Bandwidth Management: RTCPeerConnection์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋คํธ์ํฌ ๋์ญํญ์ ๋ชจ๋ํฐ๋งํ๊ณ ๊ด๋ฆฌํ์ฌ, ์คํธ๋ฆผ์ ํ์ง์ ์ต์ ํํ๋ค. ์ด๋ฅผ ํตํด ๋คํธ์ํฌ ์ํ์ ๋ฐ๋ผ ์ ์ ํ ํ์ง๋ก ๋ฏธ๋์ด๋ฅผ ์ ์กํ ์ ์๊ฒ ๋๋ค.
DataChannel ๊ด๋ฆฌ
RTCPeerConnection์ ๋ฏธ๋์ด ์คํธ๋ฆผ๋ฟ๋ง ์๋๋ผ, ๋ฐ์ดํฐ ์ฑ๋์ ํตํด ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ(ํ ์คํธ, ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ๋ฑ)๋ฅผ ์ ์กํ ์ ์๋ค.
DataChannel ์์ฑ: createDataChannel ๋ฉ์๋๋ฅผ ํตํด ๋ฐ์ดํฐ ์ฑ๋์ ์์ฑํ ์ ์๋ค. ์ด ์ฑ๋์ ์ ์ด์ค ๋ฐฉ์์ผ๋ก ์ด์๋๋ฉฐ, ๋ฎ์ ์ง์ฐ๊ณผ ๋์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๋ค.
Message Handling: ๋ฐ์ดํฐ ์ฑ๋์ ๋ฉ์์ง ๊ธฐ๋ฐ์ผ๋ก ์ด์๋๋ฉฐ, onmessage ์ด๋ฒคํธ๋ฅผ ํตํด ์์ ๋ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
์ฐ๊ฒฐ ์ํ ๋ชจ๋ํฐ๋ง๊ณผ ์ค๋ฅ ์ฒ๋ฆฌ
RTCPeerConnection์ ์ฐ๊ฒฐ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ ์ฐ๊ฒฐ ์ํ๋ฅผ ์ฌ์กฐ์ ํ๊ฑฐ๋ ์ฌํ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Connection State: RTCPeerConnection์ ๋ค์ํ ์ฐ๊ฒฐ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค. ์ฐ๊ฒฐ ์ํ๊ฐ ๋ณํํ ๋๋ง๋ค oniceconnectionstatechange ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉฐ, ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ์ฐ๊ฒฐ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ๋์ํ ์ ์๋ค.
Error Handling: ์ฐ๊ฒฐ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ๋ค์ํ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ค. ์๋ฅผ ๋ค์ด, ICE ์ฐ๊ฒฐ ์คํจ, ์๊ทธ๋๋ง ์ค๋ฅ ๋ฑ์ด ์์ ์ ์๋ค. ์ด๋ฌํ ์ค๋ฅ๋ ์ฐ๊ฒฐ์ ์ฌ์๋ ๋๋ ์ฌํ์์ ํตํด ํด๊ฒฐ๋ ์ ์๋ค.
RTCPeerConnection์ ์ต์ ํ ๊ธฐ๋ฒ
RTCPeerConnection์ ์ฑ๋ฅ์ ์ฐ๊ฒฐ ์์ ์ฑ๊ณผ ํจ์จ์ฑ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก, ๋ค์ํ ์ต์ ํ ๊ธฐ๋ฒ์ด ์ ์ฉ๋๋ค.
Connection Time Optimization
์ฐ๊ฒฐ ์ค์ ์๊ฐ์ ์ต์ํํ๊ธฐ ์ํ ์ฌ๋ฌ ๊ฐ์ง ์ต์ ํ ๊ธฐ๋ฒ์ด ์๋ค. ์๋ฅผ ๋ค์ด, ICE ํ๋ณด ์์ง์ ๋น๋๊ธฐ์ ์ผ๋ก ์ํํ๊ฑฐ๋, ์ด๊ธฐ ์ฐ๊ฒฐ์์ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ ํ๋ณด๊ตฐ์ ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ๋ ๋ฐฉ์ ๋ฑ์ด ์๋ค.
Bandwidth Adaptation
๋์ญํญ ์ ์ ๊ธฐ๋ฒ์ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ค์๊ฐ์ผ๋ก ์ ์ก ์๋์ ์คํธ๋ฆผ ํ์ง์ ์กฐ์ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด๋ฅผ ํตํด ๋๊น ์๋ ๋ฏธ๋์ด ์ ์ก์ด ๊ฐ๋ฅํด์ง๋ค.
Codec Selection and Adaptation
์ฝ๋ฑ ์ ํ์ ๋ฏธ๋์ด ์ ์ก ํ์ง์ ์ค์ํ ์์์ด๋ค. RTCPeerConnection์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋ฑ ๋ชฉ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ์ต์ ์ ์ฝ๋ฑ์ ์ ํํ๊ณ , ํ์ ์ ๋์ ์ผ๋ก ์ฝ๋ฑ์ ์ ํํ ์ ์๋ค.
๊ด๋ จ ์๋ฃ:
WebRTC 1.0: Real-time Communication Between Browsers, W3C, https://www.w3.org/TR/webrtc/
Justin Uberti, Cullen Jennings, Eric Rescorla, WebRTC API: Real-Time Communication for the Open Web, Google Developers, https://developers.google.com/web/updates/2018/12/webrtc
Philipp Hancke, Demystifying WebRTC's RTCPeerConnection, webrtchacks.com, https://webrtchacks.com/sdp-anatomy/
Last updated