Skip to content

๐Ÿ’ฌ WebRTC๋ฅผ ์•Œ์•„๋ณด์ž

PARK NA HYUN edited this page Nov 15, 2024 · 2 revisions

ํ‚ค์›Œ๋“œ

P2P TCP UDP SRTP SCTP Signaling SDP STUN/TURN NAT Traversal ICE Trickle ICE Mesh SFU


WebRTC๋ž€?

webRTC

WebRTC(Web Real-Time Communications)์€ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ๋ณ„๋„์˜ ์†Œํ”„ํŠธ์›จ์–ด๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—†์ด ์Œ์„ฑ, ์˜์ƒ ๋ฏธ๋””์–ด, ํ…์ŠคํŠธ, ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ฃผ๋กœ P2P( Peer-to-Peer) ํ™”์ƒํšŒ์˜ ๋ฐ ๋ฐ์ดํ„ฐ ๊ณต์œ ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.


WebSocket๊ณผ ์ฐจ์ด์ 

WebSocket๊ณผ WebRTC ๋ชจ๋‘ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์ง€์›ํ•˜์ง€๋งŒ, ๊ทธ ์šฉ๋„์™€ ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค.

WebSocket

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. WebSocket์€ ํ…์ŠคํŠธ์™€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

WebSocket ์—ฐ๊ฒฐ์€ ์ฒ˜์Œ์— HTTP๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ์ด๋•Œ ํŠน๋ณ„ํ•œ ํ—ค๋”๋“ค์„ ํฌํ•จ์‹œ์ผœ ์ด ์—ฐ๊ฒฐ์„ WebSocket์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์˜์‚ฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. HTTP๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ handshake๋ฅผ ํ†ตํ•ด TCP ์—ฐ๊ฒฐ์ด ์ˆ˜๋ฆฝ๋œ๋‹ค.

TCP ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ๊ณผ ์ข…๋ฃŒ

์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ: 3-way handshake (์“ฐ๋ฆฌ ์›จ์ด ํ•ธ๋“œ์…ฐ์ดํฌ)

์„ธ ๊ฐœ์˜ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„ ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค.

ํ˜ธ์ŠคํŠธ A, B์˜ ์“ฐ๋ฆฌ ์›จ์ด ํ•ธ๋“œ์…ฐ์ดํฌ ๋‹จ๊ณ„

์†ก์ˆ˜์‹  ๋ฐฉํ–ฅ ์„ธ๊ทธ๋จผํŠธ ์„ธ๊ทธ๋จผํŠธ์— ํฌํ•จ๋œ ์ฃผ์š” ์ •๋ณด
A โ†’ B SYN ์„ธ๊ทธ๋จผํŠธ - ํ˜ธ์ŠคํŠธ A์˜ ์ดˆ๊ธฐ ์ˆœ์„œ ๋ฒˆํ˜ธ
- 1๋กœ ์„ค์ •๋œ SYN ๋น„ํŠธ
B โ†’ A SYN + ACK ์„ธ๊ทธ๋จผํŠธ - ํ˜ธ์ŠคํŠธ B์˜ ์ดˆ๊ธฐ ์ˆœ์„œ ๋ฒˆํ˜ธ
- ํ˜ธ์ŠคํŠธ A๊ฐ€ ์ „์†กํ•œ ์„ธ๊ทธ๋จผํŠธ์— ๋Œ€ํ•œ ํ™•์ธ ์‘๋‹ต ๋ฒˆํ˜ธ
- 1๋กœ ์„ค์ •๋œ SYN ๋น„ํŠธ
- 1๋กœ ์„ค์ •๋œ ACK ๋น„ํŠธ
A โ†’ B ACK ์„ธ๊ทธ๋จผํŠธ - ํ˜ธ์ŠคํŠธ A์˜ ๋‹ค์Œ ์ˆœ์„œ ๋ฒˆํ˜ธ
- ํ˜ธ์ŠคํŠธ B๊ฐ€ ์ „์†กํ•œ ์„ธ๊ทธ๋จผํŠธ์— ๋Œ€ํ•œ ํ™•์ธ ์‘๋‹ต ๋ฒˆํ˜ธ
- 1๋กœ ์„ค์ •๋œ ACK ๋น„ํŠธ

handshake๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, HTTP ํ”„๋กœํ† ์ฝœ์ด ์•„๋‹Œ WebSocket ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด ํ†ต์‹ ํ•˜๊ฒŒ ๋œ๋‹ค. TCP ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•„ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค. ํ•œ๋ฒˆ ์—ฐ๊ฒฐ์ด ์ˆ˜๋ฆฝ๋˜๋ฉด ์–‘์ชฝ์—์„œ ์ž์œ ๋กญ๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

WebRTC

์„œ๋ฒ„๋ฅผ ๊ฒฝ์œ ํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ์ง์ ‘ ํ†ต์‹ (P2P)์„ ์ง€์›ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ P2P๋กœ ์ง์ ‘ ์ „์†กํ•  ์ˆ˜ ์žˆ์–ด ์ง€์—ฐ ์‹œ๊ฐ„ ๋ฐ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ํ…์ŠคํŠธ/๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” WebSocket๊ณผ ๋‹ฌ๋ฆฌ ๋น„๋””์˜ค, ์˜ค๋””์˜ค ๋“ฑ ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ์„ ์ง€์›ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. getUserMedia(), RTCPeerConnection, RTCDataChannel ๋“ฑ์˜ API๋ฅผ ํ†ตํ•ด ์นด๋ฉ”๋ผ/๋งˆ์ดํฌ ์ ‘๊ทผ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์ „์†ก๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.


Mesh ๋ฐฉ์‹๊ณผ SFU ๋ฐฉ์‹

WebRTC์—์„œ ๋‹ค์ž๊ฐ„ ์—ฐ๊ฒฐ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

Mesh ๋ฐฉ์‹

๋ชจ๋“  ํ”ผ์–ด๊ฐ€ ๊ฐ ํ”ผ์–ด์™€ ์ง์ ‘ P2P ์—ฐ๊ฒฐ์„ ๋งบ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฐธ๊ฐ€์ž๊ฐ€ ์ ์„ ๋•Œ(4-5๋ช…๊นŒ์ง€)๋Š” ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง€์—ฐ์‹œ๊ฐ„์ด ์งง๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ์ฐธ๊ฐ€์ž๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก ํ•„์š”ํ•œ ์—ฐ๊ฒฐ ์ˆ˜๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜์—ฌ ๋„คํŠธ์›Œํฌ์™€ ๋””๋ฐ”์ด์Šค์— ํฐ ๋ถ€๋‹ด์„ ์ค€๋‹ค.

SFU ๋ฐฉ์‹

SFU(Selective Forwarding Unit) ๋ฐฉ์‹์€ ์ค‘์•™์— ๋ฏธ๋””์–ด ์„œ๋ฒ„๋ฅผ ๋‘๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์ŠคํŠธ๋ฆผ์„ ์ค‘๊ณ„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ฐ ์ฐธ๊ฐ€์ž๋Š” ์ž์‹ ์˜ ์ŠคํŠธ๋ฆผ์„ SFU ์„œ๋ฒ„์— ํ•œ ๋ฒˆ๋งŒ ์ „์†กํ•˜๊ณ , SFU๋Š” ์ด๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“  ์ฐธ๊ฐ€์ž์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค. ์ด ๋ฐฉ์‹์€ ํด๋ผ์ด์–ธํŠธ์˜ ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ๋Œ€๊ทœ๋ชจ ์—ฐ๊ฒฐ๋„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์„œ๋ฒ„ ์ธํ”„๋ผ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜๋ฉด์„œ ์ถ”๊ฐ€์ ์ธ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.


P2P ์—ฐ๊ฒฐ ์ ˆ์ฐจ

1. ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์„ค์ •
   - WebSocket ๋“ฑ์„ ํ†ตํ•œ ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„ ์—ฐ๊ฒฐ
   - ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ์„ธ์…˜ ์„ค์ •

2. ๋กœ์ปฌ ๋ฏธ๋””์–ด ํš๋“
   - getUserMedia() API๋ฅผ ํ†ตํ•œ ์นด๋ฉ”๋ผ/๋งˆ์ดํฌ ์ ‘๊ทผ
   - ๋ฏธ๋””์–ด ์ œ์•ฝ์กฐ๊ฑด ์„ค์ • (ํ•ด์ƒ๋„, ํ”„๋ ˆ์ž„๋ ˆ์ดํŠธ ๋“ฑ)

3. RTCPeerConnection ๊ฐ์ฒด ์ƒ์„ฑ
   - STUN/TURN ์„œ๋ฒ„ ์„ค์ •
   - ๋ฏธ๋””์–ด ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ ์ดˆ๊ธฐํ™”
   - ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก

4. SDP ๊ตํ™˜ (Offer/Answer)
   - Offer ์ƒ์„ฑ ๋ฐ ์ „์†ก (๋ฐœ์‹ ์ธก)
   - Answer ์ƒ์„ฑ ๋ฐ ์ „์†ก (์ˆ˜์‹ ์ธก)
   - ๋กœ์ปฌ/์›๊ฒฉ SDP ์„ค์ •

5. ICE Candidate ์ˆ˜์ง‘ ๋ฐ ๊ตํ™˜
   - ๋กœ์ปฌ candidate ์ˆ˜์ง‘
   - STUN ์„œ๋ฒ„๋ฅผ ํ†ตํ•œ ๊ณต์ธ ์ฃผ์†Œ ํ™•์ธ
   - Candidate ์ •๋ณด ๊ตํ™˜

6. P2P ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ
   - ICE ์—ฐ๊ฒฐ ํ™•์ธ
   - DTLS/SRTP ๋ณด์•ˆ ํ˜‘์ƒ
   - ๋ฏธ๋””์–ด/๋ฐ์ดํ„ฐ ์ฑ„๋„ ์„ค์ •

7. ์ŠคํŠธ๋ฆผ ์ „์†ก
   - ๋ฏธ๋””์–ด ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ
   - ๋„คํŠธ์›Œํฌ ์ƒํƒœ์— ๋”ฐ๋ฅธ ์ ์‘ํ˜• ๋น„ํŠธ๋ ˆ์ดํŠธ ์กฐ์ •

Signaling์ด๋ž€?

WebRTC ์—ฐ๊ฒฐ ์„ค์ • ๊ณผ์ •์—์„œ ํ”ผ์–ด ๊ฐ„ ์ดˆ๊ธฐ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๋Š” ์ ˆ์ฐจ์ด๋‹ค. WebRTC๋Š” ์‹œ๊ทธ๋„๋ง์„ ์œ„ํ•œ ๋ณ„๋„ ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•˜์ง€ ์•Š์•„ ์ฃผ๋กœ WebSocket์œผ๋กœ ๊ตฌํ˜„๋œ ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๊ฐ€ ์ด ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

์‹œ๊ทธ๋„๋ง์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ํ”ผ์–ด ๊ฐ„ ์„œ๋กœ์˜ ์ •๋ณด(์˜ˆ: IP์ฃผ์†Œ, ํฌํŠธ)๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. P2P ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์ดˆ๊ธฐ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„์˜ ์—ญํ• ์ด๋‹ค. ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž ์„ธ์…˜ ๊ด€๋ฆฌ, SDP ๊ตํ™˜, ICE candiate ์ „๋‹ฌ ๋“ฑ์„ ๋‹ด๋‹นํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž A๊ฐ€ ํ™”์ƒ ํ†ตํ™”๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด, ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž B์—๊ฒŒ A์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ณ  ์–‘์ชฝ์˜ SDP ์ •๋ณด์™€ ICE candidate๋ฅผ ์ค‘๊ฐœํ•œ๋‹ค. ์‹œ๊ทธ๋„๋ง ํ”„๋กœํ† ์ฝœ์€ WebRTC ํ‘œ์ค€์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ž์œ ๋กญ๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Signaling ๊ณผ์ •

1. ์‚ฌ์šฉ์ž ์—ฐ๊ฒฐ
   - WebSocket ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ
   - ์‚ฌ์šฉ์ž ์ธ์ฆ/์‹๋ณ„

2. ๋ฐฉ ์ƒ์„ฑ/์ฐธ์—ฌ
   - ๋ฐฉ ID ์ƒ์„ฑ/๊ณต์œ 
   - ์ฐธ์—ฌ์ž ๊ด€๋ฆฌ

3. SDP ๊ตํ™˜
   - Offer ์ƒ์„ฑ/์ „๋‹ฌ
   - Answer ์ƒ์„ฑ/์ „๋‹ฌ

4. Candidate ๊ตํ™˜
   - ICE candidate ์ˆ˜์ง‘
   - ์‹ค์‹œ๊ฐ„ ์ „๋‹ฌ

5. ์—ฐ๊ฒฐ ์ƒํƒœ ๊ด€๋ฆฌ
   - ์—ฐ๊ฒฐ/ํ•ด์ œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
   - ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

NAT Traversal๊ณผ ๋ฐฉํ™”๋ฒฝ

NAT(Network Address Translation)์€ ์‚ฌ์„ค IP ์ฃผ์†Œ๋ฅผ ๊ณต์ธ IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ํ•˜๋‚˜์˜ ๊ณต์ธ IP๋ฅผ ์—ฌ๋Ÿฌ ์‚ฌ์„ค IP๊ฐ€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

NAT Traversal์€ ์ด๋Ÿฌํ•œ NAT ํ™˜๊ฒฝ์—์„œ P2P ์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ๋“ค์„ ์ด์นญํ•œ๋‹ค. NAT ๋’ค์— ์žˆ๋Š” ๊ธฐ๊ธฐ์™€์˜ ํ†ต์‹ ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š”๋ฐ, WebRTC๋Š” STUN๊ณผ TURN ์„œ๋ฒ„, ICE ๋“ฑ ๋‹ค์–‘ํ•œ NAT Traversal ๊ธฐ์ˆ ๋“ค์„ ์‚ฌ์šฉํ•ด NAT์™€ ๋ฐฉํ™”๋ฒฝ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

๋ฐฉํ™”๋ฒฝ์€ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ œํ•œํ•˜์—ฌ ์™ธ๋ถ€ ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋„คํŠธ์›Œํฌ๋ฅผ ๋ณดํ˜ธํ•œ๋‹ค. WebRTC ์—ฐ๊ฒฐ ์‹œ ํŠน์ • ํฌํŠธ๊ฐ€ ์ฐจ๋‹จ๋œ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ๋ผ์šฐํ„ฐ๋ฅผ ํ†ต๊ณผํ•ด ๊ณต์ธ IP ์ฃผ์†Œ, ์‚ฌ์„ค IP ์ฃผ์†Œ๋ฅผ ์•Œ์•„๋‚ด์–ด ํด๋ผ์ด์–ธํŠธ ๊ฐ„ P2P ์—ฐ๊ฒฐ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ณผ์ •์„ NAT Traversal์ด๋ผ๊ณ  ํ•œ๋‹ค.

๊ณต์ธ IP ์ฃผ์†Œ์™€ ์‚ฌ์„ค IP ์ฃผ์†Œ

๊ณต์ธ IP ์ฃผ์†Œ

์ „ ์„ธ๊ณ„์—์„œ ๊ณ ์œ ํ•œ IP ์ฃผ์†Œ์ด๋‹ค. ๋„คํŠธ์›Œํฌ ๊ฐ„์˜ ํ†ต์‹ , ์ด๋ฅผํ…Œ๋ฉด ์ธํ„ฐ๋„ท์„ ์ด์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” IP ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋กœ ๊ณต์ธ IP ์ฃผ์†Œ์ด๋‹ค. ๊ณต์ธ IP ์ฃผ์†Œ๋Š” ISP๋‚˜ ๊ณต์ธ IP ์ฃผ์†Œ ํ• ๋‹น ๊ธฐ๊ด€์„ ํ†ตํ•ด ํ• ๋‹น๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์„ค IP ์ฃผ์†Œ์™€ NAT

์‚ฌ์„ค ๋„คํŠธ์›Œํฌ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ IP ์ฃผ์†Œ์ด๋‹ค. ์‚ฌ์„ค ๋„คํŠธ์›Œํฌ๋ž€ ์ธํ„ฐ๋„ท, ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์— ๊ณต๊ฐœ๋˜์ง€ ์•Š์€ ๋„คํŠธ์›Œํฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. IP ์ฃผ์†Œ ๊ณต๊ฐ„ ์ค‘ ์‚ฌ์„ค IP ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ํŠน๋ณ„ํžˆ ์˜ˆ์•ฝ๋œ IP ์ฃผ์†Œ ๊ณต๊ฐ„์ด ์žˆ๋‹ค. ๋‹ค์Œ ๋ฒ”์œ„์— ์†ํ•˜๋Š” IP ์ฃผ์†Œ๋Š” ์‚ฌ์„ค IP ์ฃผ์†Œ๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ๋กœ ์•ฝ์†๋˜์–ด ์žˆ๋‹ค.

  • 10.0.0.0/8 (10.0.0.0 - 10.255.255.255)
  • 172.16.0.0/12 (172.16.0.0 - 172.31.255.255)
  • 192.168.0.0/16 (192.168.0.0 - 192.168.255.255)

์‚ฌ์„ค IP ์ฃผ์†Œ์˜ ํ• ๋‹น ์ฃผ์ฒด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ผ์šฐํ„ฐ์ด๋‹ค. ํ• ๋‹น๋ฐ›์€ ์‚ฌ์„ค IP ์ฃผ์†Œ๋Š” ํ•ด๋‹น ํ˜ธ์ŠคํŠธ๊ฐ€ ์†ํ•œ ์‚ฌ์„ค ๋„คํŠธ์›Œํฌ์ƒ์—์„œ๋งŒ ์œ ํšจํ•œ ์ฃผ์†Œ์ด๋ฏ€๋กœ, ์–ผ๋งˆ๋“ ์ง€ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ์ƒ์˜ ์‚ฌ์„ค IP ์ฃผ์†Œ์™€ ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ์„ค IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ˜ธ์ŠคํŠธ๊ฐ€ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์™€ ํ†ต์‹ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ์ด NAT(Network Address Translation)์ด๋‹ค. NAT๋Š” IP ์ฃผ์†Œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ฃผ๋กœ ๋„คํŠธ์›Œํฌ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์‚ฌ์„ค IP ์ฃผ์†Œ์™€ ๋„คํŠธ์›Œํฌ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ณต์ธ IP ์ฃผ์†Œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. NAT๋ฅผ ํ†ตํ•ด ์‚ฌ์„ค IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŠธ๋Š” ์ ์€ ์ˆ˜์˜ ๊ณต์ธ IP ์ฃผ์†Œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์šฐํ„ฐ์™€ (๊ฐ€์ •์šฉ) ๊ณต์œ ๊ธฐ๋Š” NAT ๊ธฐ๋Šฅ์„ ๋‚ด์žฅํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์‚ฌ์„ค ๋„คํŠธ์›Œํฌ์ƒ์—์„œ ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ท ์† ์‚ฌ์„ค IP ์ฃผ์†Œ๋Š” ๊ณต์œ ๊ธฐ๋ฅผ ๊ฑฐ์ณ ๊ณต์ธ IP ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝ๋˜๊ณ , ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ๋กœ ์ „์†ก๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ํŒจํ‚ท ์† ๊ณต์ธ IP ์ฃผ์†Œ๋Š” ๊ณต์œ ๊ธฐ๋ฅผ ๊ฑฐ์ณ ์‚ฌ์„ค IP ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์‚ฌ์„ค ๋„คํŠธ์›Œํฌ ์† ํ˜ธ์ŠคํŠธ์— ์ด๋ฅด๊ฒŒ ๋œ๋‹ค.


STUN/TURN ์„œ๋ฒ„

STUN(Session Traversal Utilities for NAT) ์„œ๋ฒ„

NAT ๋’ค์— ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์‹ ์˜ ๊ณต์ธ IP ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ์•Œ์•„๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ STUN ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, STUN ์„œ๋ฒ„๋Š” ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด์ด๋Š” ๊ณต์ธ ์ฃผ์†Œ ์ •๋ณด๋ฅผ ์‘๋‹ต์œผ๋กœ ์ „์†กํ•œ๋‹ค. STUN ์„œ๋ฒ„๋Š” ๋‹จ์ˆœํžˆ ์ฃผ์†Œ ์ •๋ณด๋งŒ์„ ์ œ๊ณตํ•˜์—ฌ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์ด ์ ๊ณ  ๊ตฌํ˜„์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๋‹ค. STUN ์„œ๋ฒ„๋Š” P2P ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์ง์ ‘ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

TURN(Traversal Using Relays around NAT) ์„œ๋ฒ„

P2P ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋ฏธ๋””์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๊ณ„ํ•ด ์ฃผ๋Š” ์„œ๋ฒ„์ด๋‹ค. Symmetric NAT์™€ ๊ฐ™์ด ์ œํ•œ์ ์ธ ํ™˜๊ฒฝ์—์„œ๋Š” ์ง์ ‘์ ์ธ P2P ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ TURN ์„œ๋ฒ„๊ฐ€ ์ค‘๊ฐ„์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ์ค‘๊ณ„ํ•œ๋‹ค. ๋ชจ๋“  ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ์ด TURN ์„œ๋ฒ„๋ฅผ ๊ฒฝ์œ ํ•˜์—ฌ ์„œ๋ฒ„์˜ ๋Œ€์—ญํญ๊ณผ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์ด ์ค‘์š”ํ•˜๋‹ค. TURN ์„œ๋ฒ„๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ํ™•์žฅ์„ฑ์—๋„ ์ œ์•ฝ์ด ์žˆ์–ด ์ง์ ‘ P2P ์—ฐ๊ฒฐ์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ๋งˆ์ง€๋ง‰ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

Symmetric NAT(๋Œ€์นญํ˜• NAT) ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์˜ ์žฅ์น˜๊ฐ€ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์™€ ํ†ต์‹ ํ•  ๋•Œ, ๊ฐ™์€ ๋‚ด๋ถ€ IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ๋Œ€์ƒ์ด ๋˜๋Š” ์™ธ๋ถ€ ์ฃผ์†Œ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ๋งคํ•‘๋œ ๊ณต์šฉ IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•˜๋Š” NAT ์œ ํ˜• ํ†ต์‹ ํ•˜๋ ค๋Š” ๋Œ€์ƒ์— ๋”ฐ๋ผ ๊ณต์šฉ IP ์ฃผ์†Œ์™€ ํฌํŠธ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •๋œ๋‹ค.

Symmetric NAT์˜ P2P ์—ฐ๊ฒฐ ๋ฌธ์ œ

P2P ํ†ต์‹ ์—์„œ๋Š” ๊ฐ ํ”ผ์–ด์˜ ๊ณต์šฉ IP ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ํ†ตํ•ด ์ง์ ‘ ํ†ต์‹ ํ•˜๋ ค ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Symmetric NAT์—์„œ๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋Œ€์ƒ๊ณผ ํ†ต์‹ ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋งคํ•‘์ด ์ƒ์„ฑ๋˜๋ฏ€๋กœ, P2P ํ†ต์‹ ์ด ๋ณต์žกํ•ด์ง€๊ฑฐ๋‚˜ ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ, TURN ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด P2P ์—ฐ๊ฒฐ์„ ์šฐํšŒํ•˜๊ฑฐ๋‚˜, ์ค‘๊ณ„ ์„œ๋ฒ„๋ฅผ ํ†ตํ•œ ๊ฐ„์ ‘ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜๋‹ค. Symmetric NAT๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณด์•ˆ์„ฑ์ด ๋†’์ง€๋งŒ, NAT ํŠธ๋ž˜๋ฒ„์„ค์— ์–ด๋ ค์›€์„ ์ฃผ์–ด WebRTC๋‚˜ P2P ํ†ต์‹  ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฌธ์ œ์ ์œผ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


SDP

SDP(Session Description Protocol)๋Š” ํ”ผ์–ด ๊ฐ„์— ์ฃผ๊ณ ๋ฐ›์„ ๋ฏธ๋””์–ด์˜ ์ข…๋ฅ˜, ์ฝ”๋ฑ, ํ•ด์ƒ๋„, ๋Œ€์—ญํญ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํ…์ŠคํŠธ๋กœ ๊ธฐ์ˆ ํ•œ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ํ”ผ์–ด ๊ฐ„์˜ ๋ฏธ๋””์–ด ํŠน์„ฑ์„ ํ˜‘์ƒํ•˜๊ณ , ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ์ด ์„ค์ •๋œ๋‹ค. ์ฆ‰, SDP ๊ตํ™˜์€ โ€œ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฏธ๋””์–ด๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ฃผ๊ณ ๋ฐ›์„์ง€โ€ ํ˜‘์˜ํ•˜๋Š” ๊ณผ์ •์ด๊ณ , ์ดํ›„ ICE candidate ๊ตํ™˜์€ โ€œ์–ด๋–ค ๊ฒฝ๋กœ๋กœ ์—ฐ๊ฒฐํ• ์ง€โ€๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ด๋‹ค.


ICE์™€ candidate

ICE(Interactive Connectivity Estabishment)๋Š” ๋‘ ํ”ผ์–ด ๊ฐ„์˜ ์ตœ์  ์—ฐ๊ฒฐ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. NAT์™€ ๋ฐฉํ™”๋ฒฝ์ด ์กด์žฌํ•˜๋Š” ๋ณต์žกํ•œ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ, ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์—ฐ๊ฒฐ ๊ฒฝ๋กœ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์„ ๋‹ด๋‹นํ•œ๋‹ค. ICE๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ candidate(ํ›„๋ณด)๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•œ๋‹ค.

candidate ์ข…๋ฅ˜

1. Host Candidate
   - ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ์ฃผ์†Œ
   - ์ตœ์šฐ์„  ์‚ฌ์šฉ ์‹œ๋„
   - ์˜ˆ: "192.168.1.100:9999"

2. Server Reflexive Candidate
   - STUN ์„œ๋ฒ„๋กœ ํ™•์ธํ•œ ๊ณต์ธ ์ฃผ์†Œ
   - NAT ๋ฐ”์ธ๋”ฉ ์ฃผ์†Œ
   - ์˜ˆ: "203.0.113.100:12345"

3. Relay Candidate
   - TURN ์„œ๋ฒ„ ํ• ๋‹น ์ฃผ์†Œ
   - ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ
   - ์˜ˆ: "turn.example.com:3478"

ICE ํ”„๋กœ์„ธ์Šค๋Š” ๋‹จ๊ณ„์ ์œผ๋กœ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•œ๋‹ค.

  1. Host Candidate (๋กœ์ปฌ ์ฃผ์†Œ) ์ˆ˜์ง‘
  • ๋จผ์ € ์ž์‹ ์˜ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ์ฃผ์†Œ๋ฅผ ์ˆ˜์ง‘
  • ๊ฐ™์€ ๋„คํŠธ์›Œํฌ์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ์ฃผ์†Œ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ ์‹œ๋„
  1. Server Reflexive Candidate (STUN์„ ํ†ตํ•œ ๊ณต์ธ ์ฃผ์†Œ) ์ˆ˜์ง‘
  • STUN ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด NAT ๋’ค์˜ ๊ณต์ธ IP:Port ํ™•์ธ
  • ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ์— ์žˆ์ง€๋งŒ NAT ํ™˜๊ฒฝ์ด ํ—ˆ์šฉ์ ์ธ ๊ฒฝ์šฐ ์ด ์ฃผ์†Œ๋กœ ์—ฐ๊ฒฐ ์‹œ๋„
  1. Relay Candidate (TURN ์„œ๋ฒ„ ์ฃผ์†Œ) ์ˆ˜์ง‘
  • ์œ„์˜ ๋‘ ๋ฐฉ๋ฒ•์œผ๋กœ ์—ฐ๊ฒฐ์ด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ
  • ํŠนํžˆ Symmetric NAT ๊ฐ™์€ ์ œํ•œ์ ์ธ ํ™˜๊ฒฝ์—์„œ
  • TURN ์„œ๋ฒ„๋ฅผ ํ†ตํ•œ ์ค‘๊ณ„ ์—ฐ๊ฒฐ ์‹œ๋„

์ด๋Š” ๋งˆ์น˜ ๊ณ„๋‹จ์‹ ํด๋ฐฑ(fallback) ๋ฉ”์ปค๋‹ˆ์ฆ˜์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค.

1. Host Candidate ์‹œ๋„
    โ†“ (์‹คํŒจ์‹œ)
2. Server Reflexive Candidate(STUN) ์‹œ๋„
    โ†“ (์‹คํŒจ์‹œ)
3. Relay Candidate(TURN) ์‹œ๋„

ICE๋Š” ์ด๋Ÿฌํ•œ candidate๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹œ๋„ํ•˜๋ฉด์„œ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์–‘์ชฝ ํ”ผ์–ด์˜ candidate๋“ค์„ ์กฐํ•ฉํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ , ๋„คํŠธ์›Œํฌ ์ƒํƒœ์™€ ์ง€์—ฐ์‹œ๊ฐ„ ๋“ฑ์„ ๊ณ ๋ คํ•ด ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•œ๋‹ค.

Trickle ICE

ICE ํ”„๋กœ์„ธ์Šค๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ „ํ†ต์ ์ธ ICE ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” ๋ชจ๋“  candidate๋ฅผ ์ˆ˜์ง‘ ํ›„ ํ•œ๊บผ๋ฒˆ์— ์ „์†กํ•˜๋Š”๋ฐ, Trickle ICE๋Š” candidate๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ์ฆ‰์‹œ ์ „์†กํ•œ๋‹ค. ์ด ๋ฐฉ์‹์˜ ์žฅ์ ์€ ์—ฐ๊ฒฐ ์„ค์ • ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. candidate๋“ค์„ ์ˆ˜์ง‘ํ•˜๋Š” ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋นจ๋ฆฌ ๋ฐœ๊ฒฌ๋˜๋Š” candidate๋ถ€ํ„ฐ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์–ด ์ „์ฒด์ ์ธ ์—ฐ๊ฒฐ ์„ค์ • ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋œ๋‹ค.


๋ฐ์ดํ„ฐ ์ „์†ก ํ”„๋กœํ† ์ฝœ

WebRTC๋Š” ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ๊ณผ ๋ฐ์ดํ„ฐ ์ฑ„๋„ ์œ„ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ์˜ ๊ฒฝ์šฐ RTP(Real-time Transport Protocol)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. RTP๋Š” UDP๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š”, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ํ”„๋กœํ† ์ฝœ๋กœ, ํŒจํ‚ท์— ์‹œํ€€์Šค ๋ฒˆํ˜ธ์™€ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํฌํ•จํ•ด ์ˆ˜์‹  ์ธก์—์„œ ํŒจํ‚ท์˜ ์ˆœ์„œ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๊ณ  ์ ์ ˆํ•œ ์‹œ์ ์— ์žฌ์ƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

๋ณด์•ˆ์„ ์œ„ํ•ด RTP๋Š” SRTP(Secure Real-time Transport Protocol)๋กœ ์•”ํ˜ธํ™”๋œ๋‹ค. SRTP๋Š” ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ์˜ ๊ธฐ๋ฐ€์„ฑ, ๋ฉ”์‹œ์ง€ ์ธ์ฆ, ์žฌ์ „์†ก ๋ฐฉ์ง€ ๋“ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ์ฑ„๋„์˜ ๊ฒฝ์šฐ SCTP(Stream Control Transmission Protocol)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. SCTP๋Š” TCP์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„, UDP์˜ ์žฅ์ ์„ ์‚ด๋ ค ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ์ŠคํŠธ๋ฆผ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜์˜ ์ „์†ก์„ ์ง€์›ํ•˜์—ฌ ์ฑ„ํŒ…์ด๋‚˜ ํŒŒ์ผ ์ „์†ก๊ณผ ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•˜๋‹ค.

๋ฏธ๋””์–ด์ŠคํŠธ๋ฆผ๊ณผ ๋ฐ์ดํ„ฐ ์ฑ„๋„

๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ (MediaStream)

  • ์‹ค์‹œ๊ฐ„ ์˜ค๋””์˜ค/๋น„๋””์˜ค ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ์ŠคํŠธ๋ฆผ
  • getUserMedia() API๋ฅผ ํ†ตํ•ด ์นด๋ฉ”๋ผ/๋งˆ์ดํฌ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ
  • ๋ฏธ๋””์–ด ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต:
    • ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ
    • ์—์ฝ” ์ œ๊ฑฐ
    • ๋…ธ์ด์ฆˆ ๊ฐ์†Œ
    • ๋น„ํŠธ๋ ˆ์ดํŠธ ์กฐ์ ˆ
    • ํŒจํ‚ท ์†์‹ค ๋ณด์ • ๋ฐ์ดํ„ฐ ์ฑ„๋„ (DataChannel)
  • ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ฑ„๋„
  • ํ…์ŠคํŠธ, ํŒŒ์ผ, JSON ๋“ฑ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ€๋Šฅ
  • TCP๋‚˜ UDP ๊ฐ™์€ ํŠน์„ฑ ์„ ํƒ ๊ฐ€๋Šฅ:
    • ordered/unordered (์ˆœ์„œ ๋ณด์žฅ ์—ฌ๋ถ€)
    • reliable/unreliable (์‹ ๋ขฐ์„ฑ ๋ณด์žฅ ์—ฌ๋ถ€) ์ฃผ์š” ์ฐจ์ด์ 
  1. ์šฉ๋„: ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ์€ ๋น„๋””์˜ค/์˜ค๋””์˜ค ์ „์šฉ, ๋ฐ์ดํ„ฐ ์ฑ„๋„์€ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ
  2. ์ฒ˜๋ฆฌ ๋ฐฉ์‹: ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ์€ ์‹ค์‹œ๊ฐ„ ๋ฏธ๋””์–ด ์ฒ˜๋ฆฌ ์ตœ์ ํ™”, ๋ฐ์ดํ„ฐ ์ฑ„๋„์€ ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก
  3. ์ œ์–ด: ๋ฐ์ดํ„ฐ ์ฑ„๋„์€ ์‹ ๋ขฐ์„ฑ๊ณผ ์ˆœ์„œ ๋ณด์žฅ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ

์ฐธ๊ณ  ์ž๋ฃŒ

https://wormwlrm.github.io/2021/01/24/Introducing-WebRTC.html
https://k0zdevel.tistory.com/129
https://www.youtube.com/watch?v=bWcNEk0H4Y0

์•ˆ๋…•! ํด๋กœ๋ฐ”ํŒŒํŠธ๋ผ

ํŒ€ ๋ฌธํ™”

๐Ÿค Ground Rule

ํ˜‘์—… ๋ฐฉ์‹

๐Ÿ”’ Convention
๐ŸŒณ Git Branch ์ „๋žต

๊ฐœ๋ฐœ ๋ฌธ์„œ

๐Ÿ› ๏ธ AGT - Automatic Git & Github Tool
๐Ÿ“Š WebRTC Mesh โ€ ํŠธ๋ž˜ํ”ฝ ๊ณ„์‚ฐ
๐ŸŽข WebRTC Mesh - ํ—˜๋‚œํ•œ ์—ฌ์ •
๐Ÿ’ฌ WebRTC๋ฅผ ์•Œ์•„๋ณด์ž
๐Ÿ“ฎ SSE(Server Sent Events)
๐Ÿ“– SSE Pagination
โณ Socket ํ†ต์‹ ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—… ์ˆœ์„œ ๋ณด์žฅ ๋ฐฉ๋ฒ•
๐Ÿ“ก Redis pub/sub๋ฅผ ํ™œ์šฉํ•œ SSE ์ ์šฉ๊ธฐ
๐Ÿ—๏ธ Naver Cloud Platform์„ ํ™œ์šฉํ•œ ๋ฐฐํฌ ์ „๋žต
โš”๏ธ๐Ÿš€ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ: ๋‹จ์ผ ์ธ์Šคํ„ด์Šค VS NKS
๐Ÿšดโ€โ™€๏ธ Redis๋กœ ๊ฒŒ์ž„๋ฐฉ ๊ด€๋ฆฌ ์ตœ์ ํ™”: ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ์„ฑ๋Šฅ ๊ฐœ์„ 

ํšŒ์˜๋ก

๐Ÿ“† ํšŒ์˜๋ก ์บ˜๋ฆฐ๋”
๐Ÿ–ค ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ ํ…œํ”Œ๋ฆฟ
๐Ÿ–ค ํšŒ๊ณ  ํ…œํ”Œ๋ฆฟ

๋ฉ˜ํ† ๋ง

0๏ธโƒฃ 0์ฃผ์ฐจ ๋ฉ˜ํ† ๋ง ์ผ์ง€
1๏ธโƒฃ 1์ฃผ์ฐจ ๋ฉ˜ํ† ๋ง ์ผ์ง€
2๏ธโƒฃ 2์ฃผ์ฐจ ๋ฉ˜ํ† ๋ง ์ผ์ง€
3๏ธโƒฃ 3์ฃผ์ฐจ ๋ฉ˜ํ† ๋ง ์ผ์ง€
4๏ธโƒฃ 4์ฃผ์ฐจ ๋ฉ˜ํ† ๋ง ์ผ์ง€

๋ฐœํ‘œ

0๏ธโƒฃ 0์ฃผ์ฐจ ๋ฐœํ‘œ
1๏ธโƒฃ 1์ฃผ์ฐจ ๋ฐœํ‘œ
2๏ธโƒฃ 2์ฃผ์ฐจ ๋ฐœํ‘œ
3๏ธโƒฃ 3์ฃผ์ฐจ ๋ฐœํ‘œ
4๏ธโƒฃ 4์ฃผ์ฐจ ๋ฐœํ‘œ
5๏ธโƒฃ ์ตœ์ข… ๋ฐœํ‘œ

Clone this wiki locally