๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

WebSocket๊ณผ WebRTC ๋น„๊ตํ•˜๋ฉฐ ์ดํ•ดํ•˜๊ธฐ ๋ณธ๋ฌธ

Study/๊ธฐํƒ€

WebSocket๊ณผ WebRTC ๋น„๊ตํ•˜๋ฉฐ ์ดํ•ดํ•˜๊ธฐ

Shinjio 2025. 1. 15. 00:45
๋ฐ˜์‘ํ˜•

2025๋…„ ์ƒˆํ•ด ์ƒˆ๋กœ์šด ๋ชฉํ‘œ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. 

๋””์Šค์ฝ”๋“œ ํด๋ก ์ฝ”๋”ฉ์ธ๋ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ํ•˜๋ ค๋‹ค ๋ณด๋‹ˆ WebSocket๊ณผ WebRTC์— ๋Œ€ํ•ด์„œ ํ•„์ˆ˜๋กœ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ด์„œ ๋‚ด ๋‚˜๋ฆ„๋Œ€๋กœ ๋จธ๋ฆฌ์— ์ž˜ ๋“ค์–ด์˜ค๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค. 

 

์•„๋ž˜ ๋‚ด์šฉ์—์„œ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์ž๋ฃŒ๋ฅผ ์ฐพ๋‹ค๊ฐ€ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด๋‚˜ ์ถ”๊ฐ€ํ•  ๋‚ด์šฉ์ด ์žˆ์œผ๋ฉด ๊ณ„์†ํ•ด์„œ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ด๋‹ค.


  • ์›น์˜ ํ†ต์‹  ๋ฐฉ์‹์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
  • ๋Œ€ํ‘œ์ ์œผ๋กœ HTTP, Websocket, Polling, gRPC, SSE, GraphQL ๋“ฑ์ด ์žˆ๋Š”๋ฐ, ๊ฐ๊ฐ์˜ ๋ฐฉ์‹๋งˆ๋‹ค ํŠน์ง•์ด ์žˆ์–ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ์•Œ๋งž์€ ๊ฒƒ์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
  • HTTP๋Š” ์›น ํ†ต์‹ ์˜ ๊ธฐ๋ณธ ํ”„๋กœํ† ์ฝœ๋กœ ์š”์ฒญ-์‘๋‹ต ๋ฐฉ์‹ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋Œ€ํ‘œ์ ์ธ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์ด๋‹ค.
  • WebSocket์€ ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์ง€์›ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋กœ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์•Œ๋ฆผ ์„œ๋น„์Šค ๋“ฑ์„ ์ œ๊ณตํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • WebRTC ๋˜ํ•œ HTTP, WebSocket๊ณผ ๊ฐ™์€ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ ์ค‘ ํ•˜๋‚˜๋กœ HTTP์™€ WebSocket์ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ๋ฐฉ์‹์ธ ๋ฐ˜๋ฉด, WebRTC๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ์ง์ ‘์ ์ธ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์ง€์›ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.
    • WebRTC๋Š” P2P ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„๋˜์–ด, ์‹ค์‹œ๊ฐ„ ์˜์ƒ ํ†ตํ™”๋‚˜ ํŒŒ์ผ ์ „์†ก ๋“ฑ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ง์ ‘ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
ํ†ต์‹ ๋ฐฉ์‹ ์„ค๋ช… ์ฃผ์š” ํŠน์ง• ์šฉ๋„ WebAPI
HTTP ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์š”์ฒญ-์‘๋‹ต ๋ฐฉ์‹ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ , ๋ฌด์ƒํƒœ์„ฑ ์›น ํŽ˜์ด์ง€ ์š”์ฒญ, REST API ํ˜ธ์ถœ XMLHttpRequest, fetchAPI
WebSocket ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„ ์ง€์†์ ์ธ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ์–‘๋ฐฉํ–ฅ, ์ง€์† ์—ฐ๊ฒฐ ์‹ค์‹œ๊ฐ„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์ฑ„ํŒ… ์„œ๋น„์Šค websocket
WebRTC ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ์ง์ ‘์ ์ธ P2P ํ†ต์‹  ์‹ค์‹œ๊ฐ„ ์Œ์„ฑ/์˜์ƒ ํ†ตํ™”, ๋ฐ์ดํ„ฐ ์ „์†ก ์˜์ƒ/์Œ์„ฑ ํ†ตํ™”, ํŒŒ์ผ ๊ณต์œ  webrtc

์›น์†Œ์ผ“(WebSocket)

  • HTML5 ํ‘œ์ค€ ๊ธฐ์ˆ ๋กœ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ์‚ฌ์ด์˜ ๋™์ ์ธ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ์ฑ„๋„์„ ๊ตฌ์„ฑ
  • Websocket API๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๊ณ , ์š”์ฒญ ์—†์ด ์‘๋‹ต์„ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ

1. HTTP vs ์›น์†Œ์ผ“ ์ฐจ์ด์ 

  • Websocket ํ”„๋กœํ† ์ฝœ์€ ์ ‘์† ํ™•๋ฆฝ์— HTTP๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ทธ ํ›„์˜ ํ†ต์‹ ์€ WebSocket ๋…์ž์˜ ํ”„๋กœํ† ์ฝœ๋กœ ์ด๋ฃจ์–ด์ง
  • header๊ฐ€ ์ƒ๋‹นํžˆ ์ž‘์•„ overhead๊ฐ€ ์ ์€ ํŠน์ง•์ด ์žˆ์Œ
  • ์žฅ์‹œ๊ฐ„ ์ ‘์†์„ ์ „์ œ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ ‘์†ํ•œ ์ƒํƒœ๋ผ๋ฉด ํด๋ผ์ด์–ธํŠธ๋‚˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์†ก์‹ ์ด ๊ฐ€๋Šฅ
  • ๋ฐ์ดํ„ฐ์˜ ์†ก์‹ ๊ณผ ์ˆ˜์‹ ์— ๊ฐ๊ฐ ์ปค๋„ฅ์…˜์„ ๋งบ์„ ํ•„์š”๊ฐ€ ์—†์–ด, ํ•˜๋‚˜์˜ ์ปค๋„ฅ์…˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹  ํ•  ์ˆ˜ ์žˆ์Œ
  • ํ†ต์‹ ์‹œ URL์€ ws:// ํ˜•ํƒœ

2. socket.io

  • ์›น์†Œ์ผ“์€ HTML5์˜ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ž˜๋œ ๋ฒ„์ „์˜ ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์›น์†Œ์ผ“์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ
  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜
  • ์›นํŽ˜์ด์ง€๊ฐ€ ์—ด๋ฆฌ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น์†Œ์ผ“์„ ์ง€์›ํ•˜๋ฉด ์›น์†Œ์ผ“ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ณ , ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๋ผ๋ฉด ์ผ๋ฐ˜ http๋ฅผ ์ด์šฉํ•ด์„œ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ํ‰๋‚ด
  • node.js ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ธฐ์ˆ ๋กœ, ๊ฑฐ์˜ ๋ชจ๋“  ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ๋ชจ๋ฐ”์ผ ์žฅ์น˜๋ฅผ ์ง€์›ํ•˜๋Š” ์‹ค์‹œ๊ฐ„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • 100% ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ˜„์กดํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‹ค์‹œ๊ฐ„ ์›น ๊ธฐ์ˆ ๋“ค์„ ์ถ”์ƒ
  • ๋ธŒ๋ผ์šฐ์ €๋ณ„๋กœ ์ง€์›ํ•˜๋Š” ์›น์†Œ์ผ“ ๋ฒ„์ „์ด ๋‹ค๋ฅด๋ฉฐ ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฒฝ์šฐ ์•„์˜ˆ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋งŽ์ด ์‚ฌ์šฉ

3. socket.io vs WebSocket

ํ•ญ๋ชฉ socket.io webSocket
์„ค์น˜ ์ถ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•„์š” (socket.io) ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ API ์‚ฌ์šฉ
ํด๋ฐฑ ์ง€์› ์ง€์› (๋กฑํด๋ง ๋“ฑ) ํด๋ฐฑ ์—†์Œ (WebSocket ๋ฏธ์ง€์› ๋ธŒ๋ผ์šฐ์ € ๋ถˆ๊ฐ€)
์‚ฌ์šฉ ํŽธ์˜์„ฑ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ†ต์‹ ์œผ๋กœ ์ง๊ด€์  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ฐ ์ˆ˜๋™ ๊ตฌํ˜„ ํ•„์š”
์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์ธ์ฆ, ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ, ๋ฃธ/๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต ์ตœ์†Œ ๊ธฐ๋Šฅ ์ œ๊ณต
์„ฑ๋Šฅ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ ๋” ๊ฐ€๋ฒผ์›€
  • socket.io: ์ฑ„ํŒ…, ์•Œ๋ฆผ ์‹œ์Šคํ…œ, ๊ฒŒ์ž„ ๊ฐ™์€ ๋ณต์žกํ•œ ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
  • Websocket: ๋‹จ์ˆœํ•œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ(์˜ˆ: ์ฃผ๊ฐ€, ๋‚ ์”จ์ •๋ณด)

4. ๋™์ž‘์›๋ฆฌ

1) ํ•ธ๋“œ์‰์ดํฌ(handshake)

์›น์†Œ์ผ“ ์—ฐ๊ฒฐ์€ HTTP๋ฅผ ํ†ตํ•ด ์‹œ์ž‘๋œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ์›น์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ์ผ๋ จ์˜ ํ•ธ๋“œ์‰์ดํฌ ๊ณผ์ •์ด ๋ฐœ์ƒํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” HTTP Upgrade ์š”์ฒญ ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น์†Œ์ผ“ ์—ฐ๊ฒฐ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ , ์„œ๋ฒ„๋Š” ์ด๋ฅผ ์Šน์ธํ•˜๋ฉฐ 101 Switching Protocols ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.

2) ์—ฐ๊ฒฐ ์œ ์ง€(Keeping Connection)

ํ•ธ๋“œ์‰์ดํฌ ์ดํ›„์—๋Š” TCP ๊ธฐ๋ฐ˜์˜ ์—ฐ๊ฒฐ์ด ์„ค์ •๋˜๋ฉฐ, ์ด ์—ฐ๊ฒฐ์€ ์ง€์†์ ์œผ๋กœ ์œ ์ง€๋œ๋‹ค. ์ด๋กœ์จ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

3) ๋ฐ์ดํ„ฐ ๊ตํ™˜(Data Exchange)

์—ฐ๊ฒฐ์ด ํ™•๋ฆฝ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”์‹œ์ง€์˜ ํ˜•ํƒœ๋กœ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ, ์ด ๋ฉ”์‹œ์ง€๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๋˜๋Š” ์„œ๋ฒ„๋Š” ์–ธ์ œ๋“ ์ง€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒ๋Œ€๋ฐฉ์€ ์ด์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค.

4) ์—ฐ๊ฒฐ ์ข…๋ฃŒ(Connection Termination)

์›น์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ ๋˜๋Š” ์„œ๋ฒ„๊ฐ€ ์ข…๋ฃŒ ํ”„๋ ˆ์ž„์„ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค. ์ด ํ”„๋ ˆ์ž„์€ ์—ฐ๊ฒฐ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‹ซ๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋˜ํ•œ, ์—ฐ๊ฒฐ์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ๋˜๋Š” ๋‹ค๋ฅธ ์ด์œ ๋กœ ์ธํ•ด ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„ ๊ฒƒ์œผ๋กœ ํŒ๋‹จ๋œ๋‹ค.

5) ํ”„๋กœํ† ์ฝœ๊ณผ ๋ฐ์ดํ„ฐ ํ˜•์‹(Protocol and Data Format)

์›น์†Œ์ผ“ ํ”„๋กœํ† ์ฝœ์€ ํ—ค๋” ์ •๋ณด๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋‚ฎ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค. ๋ฉ”์‹œ์ง€๋Š” ํ”„๋ ˆ์ž„ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ ์ง€๋ฉฐ, ๊ฐ ํ”„๋ ˆ์ž„์€ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ปจํŠธ๋กค ๋ช…๋ น์„ ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

5. ์›น์†Œ์ผ“ ํ”„๋กœํ† ์ฝœ์˜ ์ฒ ํ•™

  • ์›น์†Œ์ผ“์€ ๊ธฐ์กด์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ๋˜๋˜ Origin ์ •์ฑ…์„ ์ค€์ˆ˜ํ•œ๋‹ค.
  • ํ•œ ๊ฐœ์˜ ํฌํŠธ ๋ฐ IP์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์†Œ ๋ฐ ํ”„๋กœํ† ์ฝœ ๋„ค์ด๋ฐ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • HTTP ๋“ฑ์˜ ํ”„๋กœํ† ์ฝœ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ TCP ์œ„์—์„œ ๊ณ„์ธตํ™”๋˜์–ด ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ดํ›„ TCP๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๋™์ผํ•˜์ง€๋งŒ, ๊ธธ์ด์— ์ œํ•œ์ด ์—†๋‹ค.
  • ํ”„๋ก์‹œ์™€ ๊ฐ™์€ ์ค‘์žฌ์ž์™€๋„ ์›ํ™œํ•˜๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ข…๋ฃŒ(closing) handshake ๊ณผ์ •์„ ์‚ฌ์šฉํ•œ๋‹ค.

6. ๊ตฌ์„ฑ

  • ํด๋ผ์ด์–ธํŠธ
  • ์„œ๋ฒ„

WebRTC

  • WebRTC(Web Real-Time Communication)์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์‚ฌ์ดํŠธ๊ฐ€ ์ค‘๊ฐ„์ž ์—†์ด ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์— ์˜ค๋””์˜ค๋‚˜ ์˜์ƒ ๋ฏธ๋””์–ด๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ๋งˆ์Œ๋Œ€๋กœ ์ŠคํŠธ๋ฆผ ํ•  ๋ฟ ์•„๋‹ˆ๋ผ, ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋„ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ 
  • WebRTC๋Š” ์ค‘๊ฐ„์ž ์—†์ด ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์„ P2P๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ์ˆ ์ด๋ฏ€๋กœ ๋น ๋ฅธ ์†๋„๊ฐ€ ๋ณด์žฅ๋˜๊ณ , HTTPS๊ฐ€ ๊ฐ•์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋ณด์•ˆ์ด ๋ณด์žฅ๋œ๋‹ค.
  • WebRTC๋Š” ๊ตฌ๊ธ€์ด ์ฃผ๋„ํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์›น ํ‘œ์ค€์ด๊ธฐ ๋•Œ๋ฌธ์— ํŠนํžˆ ํฌ๋กฌ์—์„œ ํ˜ธํ™˜์„ฑ์ด ๋†’๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŒŒ์ด์–ดํญ์Šค์™€ ์˜คํŽ˜๋ผ ๋“ฑ์ด WebRTC๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ›„์›ํ•˜๊ณ  ์žˆ๋‹ค. ํ•œํŽธ ์‚ฌํŒŒ๋ฆฌ ์—ญ์‹œ WebKit ๊ธฐ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ €์ด๊ธฐ ๋•Œ๋ฌธ์— WebRTC๊ฐ€ ์ง€์›๋˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์— ๋น„ํ•ด ํ˜ธํ™˜์„ฑ์ด ๋–จ์–ด์ง€๋Š” ํŽธ์ด๋‹ค.
    • ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง• ์ด์Šˆ ํ•ด๊ฒฐ์„ ์œ„ํ•ด์„œ๋Š” adapter.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ด๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” shim ํŒจํ„ด ๋ฐ ํด๋ฆฌํ•„์„ ์ด์šฉํ•ด ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง• ์ด์Šˆ๋ฅผ ์‚ฌ์ „์— ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

1. P2P ์ ˆ์ฐจ

1) ๊ฐ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ P2P ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์— ๋™์˜

2) ์„œ๋กœ์˜ ์ฃผ์†Œ๋ฅผ ๊ณต์œ 

  • ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ์ง์ ‘ ํ†ต์‹ ์„ ์œ„ํ•ด์„œ๋Š” ๊ฐ๊ฐ ํ˜„์žฌ ์—ฐ๊ฒฐ๋œ ๋ผ์šฐํ„ฐ์˜ ๊ณต์ธ IP ์ฃผ์†Œ์™€ ํฌํŠธ(์‚ฌ์„ค IP ๋งค์นญ)๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ ์–ด๋–ค ๋ผ์šฐํ„ฐ๋“ค์€ ํŠน์ • ์ฃผ์†Œ๋‚˜ ํฌํŠธ์™€์˜ ์—ฐ๊ฒฐ์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉํ™”๋ฒฝ ์„ค์ •์ด ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์šฐํ„ฐ๋ฅผ ํ†ต๊ณผํ•ด์„œ ์—ฐ๊ฒฐํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ณผ์ •์„ NAT ํŠธ๋ž˜๋ฒ„์…œ(NAT traversal)์ด๋ผ๊ณ  ํ•œ๋‹ค.

3) ๋ณด์•ˆ ์‚ฌํ•ญ ๋ฐ ๋ฐฉํ™”๋ฒฝ ์šฐํšŒ

  • NAT ํŠธ๋ž˜๋ฒ„์…œ ๋ฐฉ๋ฒ•
    1. STUN ์„œ๋ฒ„(Sesstion Traversal Utilites for NAT)
      • ๋‹จ๋ง์ด ์ž์‹ ์˜ ๊ณต์ธ IP ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•œ ํ”„๋กœํ† ์ฝœ ⇒ ์ž์‹ ์˜ ๊ณต์ธ IP์™€ ํฌํŠธ ์ฐพ์•„
    2. TURN ์„œ๋ฒ„(Traversal Using Relay NAT)
      • ๋ฐฉํ™”๋ฒฝ ์ •์ฑ…์œผ๋กœ ์ธํ•ด STUN ์„œ๋ฒ„๋กœ ์ž์‹ ์˜ ์ฃผ์†Œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ
      • ๋„คํŠธ์›Œํฌ ๋ฏธ๋””์–ด๋ฅผ ์ค‘๊ฐœํ•˜๋Š” ์„œ๋ฒ„ ์‚ฌ์šฉ → ๊ตฌ์กฐ์ƒ P2P๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋–„๋ฌธ์— ํ•„์—ฐ์ ์œผ๋กœ ์ง€์—ฐ ๋ฐœ์ƒ(์ตœํ›„์˜ ์ˆ˜๋‹จ)
  • STUN, TURN ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•ด ์ž์‹ ์˜ ์ฃผ์†Œ ํš๋“ >> ํ›„๋ณด ์ฐพ๊ธฐ
    • ํ›„๋ณด ์ฐพ๊ธฐ ๊ฒฐ๊ณผ
      • ์ž์‹ ์˜ ์‚ฌ์„ค IP์™€ ํฌํŠธ ๋„˜๋ฒ„
      • ์ž์‹ ์˜ ๊ณต์ธ IP์™€ ํฌํŠธ ๋„˜๋ฒ„(STUN, TURN ์„œ๋ฒ„์—์„œ ํš๋“)
      • TURN ์„œ๋ฒ„์˜ IP์™€ ํฌํŠธ ๋„˜๋ฒ„(TURN ์„œ๋ฒ„์—์„œ ํš๋“)
    • ํ›„๋ณด ์ฐพ๊ธฐ ๋ฐฉ๋ฒ• → ICE(Interactive Connectivity Establishment) ํ”„๋ ˆ์ž„์›Œํฌ ํ™œ์šฉ
      • ICE: ๋‘ ๊ฐœ์˜ ๋‹จ๋ง์ด P2P ์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋„๋ก ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

4) ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ๋ฐ์ดํ„ฐ ์‹ค์‹œ๊ฐ„ ๊ตํ™˜

  • SDP(Session Description Protocol)
    • WebRTC์—์„œ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฏธ๋””์–ด์˜ ํ•ด์ƒ๋„๋‚˜ ํ˜•์‹, ์ฝ”๋ฑ ๋“ฑ์˜ ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ์ปจํ…์ธ ์˜ ์ดˆ๊ธฐ ์ธ์ˆ˜๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ฑ„ํƒํ•œ ํ”„๋กœํ† ์ฝœ

2. WebRTC ์•„ํ‚คํ…์ฒ˜

 

1) Signaling Server

์œ ์ € ๊ฐ„ ์—ฐ๊ฒฐ์„ ํ•˜๊ธฐ์œ„ํ•ด ์š”๊ตฌ๋˜๋Š” ์ •๋ณด๋“ค์„ ๊ตํ™˜ํ•˜๋„๋ก ๋„์™€์คŒ

SDP, ICE ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

์‹œ๊ทธ๋„๋ง์„ ํ•  ๋•Œ WebSocket ๋˜๋Š” XMLHttpRequest ๋“ฑ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

2) STUN Server

ICE Candidate์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฃผ๋Š” ์„œ๋ฒ„

3) TURN Server

P2P ํ†ต์‹ ์— ์‹คํŒจํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„

4) ๋ฏธ๋””์–ด ์„œ๋ฒ„

P2P ์—ฐ๊ฒฐ๋กœ 3์ธ, 4์ธ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ด์ƒ์˜ ์ธ์›์˜ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์„ ์ง€์›ํ•˜๊ฒŒ ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ธก๋ฉด์—์„œ์˜ ๊ณผ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•˜๊ฒŒ ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋‚˜์˜จ ๊ฒƒ์ด SFU์™€ MCU ๋ฐฉ์‹์˜ ๋ฏธ๋””์–ด ์„œ๋ฒ„๋ฅผ ๋‘๋Š” ๊ฒƒ์ด๋‹ค.

Mesh

  • ํ”ผ์–ด ๊ฐ„์˜ offer/answer ์ •๋ณด ์ค‘๊ณ„ → ์ฒ˜์Œ WebRTC๊ฐ€ ํ”ผ์–ด ๊ฐ„์˜ ์ •๋ณด๋ฅผ ์ค‘๊ณ„ํ•  ๋•Œ๋งŒ ์„œ๋ฒ„์— ๋ถ€ํ•˜ ๋ฐœ์ƒ
  • ํ”ผ์–ด ์—ฐ๊ฒฐ ์™„๋ฃŒ ํ›„์—๋Š” ์„œ๋ฒ„์— ๋ณ„๋„ ๋ถ€ํ•˜ ์—†์Œ
  • 1:1 ์—ฐ๊ฒฐ์— ์ ํ•ฉ
  • ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์ ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ์ž์›์ด ์ ๊ฒŒ ๋“ ๋‹ค.
  • ํ”ผ์–ด๊ฐ„ ์ง์ ‘ ์—ฐ๊ฒฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹  ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค.
  • N:N ๋˜๋Š” N:M ์—ฐ๊ฒฐ์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ธ‰๊ฒฉํ•˜๊ฒŒ ์ฆ๊ฐ€ํ•จ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด 5์ธ์ด WebRTC ์—ฐ๊ฒฐ์„ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด Uplink(๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‚ด๋Š” ๊ฐœ์ˆ˜) 4๊ฐœ, Downlink(์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜์—๊ฒŒ ๋“ค์–ด์˜ค๋Š” ๊ฐœ์ˆ˜) 4๊ฐœ๋กœ ์ด 8๊ฐœ์˜ ๋งํฌ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ 

SFU(Selective Forwarding Unit) ์„œ๋ฒ„

  • ์ข…๋‹จ ๊ฐ„ ๋ฏธ๋””์–ด ํŠธ๋ž˜ํ”ฝ์„ ์ค‘๊ณ„ํ•˜๋Š” ์ค‘์•™ ์„œ๋ฒ„ ๋ฐฉ์‹
  • ํด๋ผ์ด์–ธํŠธ ํ”ผ์–ด๊ฐ„ ์—ฐ๊ฒฐ์ด ์•„๋‹Œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ํ”ผ์–ด ์—ฐ๊ฒฐ
  • 1:1, 1:N, N:M ๋“ฑ ๋ชจ๋“  ์—ฐ๊ฒฐ ํ˜•์‹์—์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ํ•„์š” ์—†์ด ์„œ๋ฒ„์—๊ฒŒ๋งŒ ์ž์‹ ์˜ ์˜์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ 1:N, N:N ํ˜น์€ N:M ํ˜•์‹์ด๋ผ๋ฉด ์ƒ๋Œ€๋ฐฉ์˜ ์ˆ˜๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ํ”ผ์–ด๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
  • 1:N ํ˜•์‹ ๋˜๋Š” ์†Œ๊ทœ๋ชจ N:M ํ˜•์‹์˜ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ์— ์ ํ•ฉ
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜๊ณ  Mesh ๋ฐฉ์‹๋ณด๋‹ค ๋Š๋ฆฌ์ง€๋งŒ ๋น„์Šทํ•œ ์ˆ˜์ค€์˜ ์‹ค์‹œ๊ฐ„์„ฑ ์œ ์ง€ํ•˜๋ฉด์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ›๋Š” ๋ถ€ํ•˜ ์ค„์–ด๋“ ๋‹ค.
  • ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋ณด๋‹ค ์„œ๋ฒ„ ๋น„์šฉ ์ฆ๊ฐ€
  • ๋Œ€๊ทœ๋ชจ์ผ ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งŽ์€ ๋ถ€ํ•˜ ๊ฐ๋‹น

MCU(Multi-point Control Unit) ์„œ๋ฒ„

  • ๋‹ค์ˆ˜์˜ ์†ก์ถœ ๋ฏธ๋””์–ด๋ฅผ ์ค‘์•™ ์„œ๋ฒ„์—์„œ ํ˜ผํ•ฉ ๋˜๋Š” ๊ฐ€๊ณตํ•˜์—ฌ ์ˆ˜์‹ ์ธก์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ์ค‘์•™ ์„œ๋ฒ„ ๋ฐฉ์‹. ์˜ˆ๋ฅผ ๋“ค์–ด 5์ธ์ด WebRTC ์—ฐ๊ฒฐ์„ ํ•œ๋‹ค๋ฉด ์ž์‹ ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ 4์ธ์˜ Vedio ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ Video ๋ฐ์ดํ„ฐ๋กœ ํŽธ์ง‘ํ•˜๊ณ , audio ๋ฐ์ดํ„ฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŽธ์ง‘ํ•˜์—ฌ ํ•œ ๋ช…์—๊ฒŒ ๋ณด๋‚ธ๋‹ค. ์ด ์ž‘์—…์„ ๋‚จ์€ 4๋ช…์—๊ฒŒ๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉํ•œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ํ”ผ์–ด๊ฐ„ ์—ฐ๊ฒฐ์ด ์•„๋‹Œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ํ”ผ์–ด ์—ฐ๊ฒฐ
  • ๋ชจ๋“  ์—ฐ๊ฒฐ ํ˜•์‹์—์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ํ•„์š” ์—†์ด ์„œ๋ฒ„์—๊ฒŒ๋งŒ ์ž์‹ ์˜ ์˜์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค. (uplink 1๊ฐœ)
  • ๋ชจ๋“  ์—ฐ๊ฒฐ ํ˜•์‹์—์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž์˜ ์ˆ˜์™€ ์ƒ๊ด€์—†์ด ์„œ๋ฒ„์—๊ฒŒ์„œ ํ•˜๋‚˜์˜ ํ”ผ์–ด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ฉด ๋œ๋‹ค. (downlink 1๊ฐœ)
  • ์ค‘์•™ ์„œ๋ฒ„์˜ ๋†’์€ ์ปดํ“จํŒ… ํŒŒ์›Œ๊ฐ€ ์š”๊ตฌ ๋œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์˜ ๋ถ€ํ•˜๊ฐ€ ํ˜„์ €ํžˆ ์ค„์–ด๋“ ๋‹ค.
  • WebRTC์˜ ์ตœ๋Œ€ ์žฅ์ ์ธ ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ €ํ•ด๋˜๊ณ , video, audio๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค.

์ด๋ ‡๊ฒŒ ๊นŒ์ง€๋งŒ ๋ดค์„ ๋•Œ SFU ๋ฐฉ์‹์ด ์ ๋‹นํ•  ๋“ฏ

์ผ๋‹จ ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๋†’์€ ์ปดํ“จํŒ… ํŒŒ์›Œ์˜ ์„œ๋ฒ„๊ฐ€ ์—†์œผ๋ฉฐ, ์‹ค์‹œ๊ฐ„์„ฑ์„ ์ €ํ•ดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ถ€ํ•˜๊ฐ€ ๋‚˜์„๊ฒƒ ๊ฐ™๋‹ค….

chatGPT ๋ฌธ์˜ ๊ฒฐ๊ณผ

๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ์ˆ˜์— ๋”ฐ๋ฅธ ๋น„๊ต

1:10 (์†Œ๊ทœ๋ชจ ๊ทธ๋ฃน ์ฑ„ํŒ…)

  • SFU:
    • ์„œ๋ฒ„ ๋ถ€ํ•˜: ๋‚ฎ์Œ.
    • ํด๋ผ์ด์–ธํŠธ ๋ถ€ํ•˜: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ตœ๋Œ€ 10๊ฐœ์˜ ์ŠคํŠธ๋ฆผ(์˜ค๋””์˜ค+๋น„๋””์˜ค)์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ.
    • ์ง€์—ฐ: ์„œ๋ฒ„ ์ง€์—ฐ์ด ๋‚ฎ์•„ ์‹ค์‹œ๊ฐ„์„ฑ ์šฐ์ˆ˜.
  • MCU:
    • ์„œ๋ฒ„ ๋ถ€ํ•˜: ๋ฏน์‹ฑ ์ž‘์—…์œผ๋กœ ๋ถ€ํ•˜ ์ฆ๊ฐ€.
    • ํด๋ผ์ด์–ธํŠธ ๋ถ€ํ•˜: ๋‹จ์ผ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ๋กœ ๋งค์šฐ ๋‚ฎ์Œ.
    • ์ง€์—ฐ: ๋ฏน์‹ฑ์œผ๋กœ ์ธํ•ด 100~300ms์˜ ์ถ”๊ฐ€ ์ง€์—ฐ ๋ฐœ์ƒ.

1:100 (์ค‘๊ทœ๋ชจ ํšŒ์˜ ๋˜๋Š” ๋Œ€๊ทœ๋ชจ ๊ทธ๋ฃน ์ฑ„ํŒ…)

  • SFU:
    • ์„œ๋ฒ„ ๋ถ€ํ•˜: ์—ฌ์ „ํžˆ ๋‚ฎ์Œ (๋‹จ์ˆœ ์ „๋‹ฌ ์ž‘์—…).
    • ํด๋ผ์ด์–ธํŠธ ๋ถ€ํ•˜: ๊ฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ตœ๋Œ€ 100๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์„ ์ˆ˜์‹ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋งค์šฐ ๋†’์Œ. ๋‚ฎ์€ ์ŠคํŽ™์˜ ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€.
    • ์ง€์—ฐ: ํด๋ผ์ด์–ธํŠธ CPU ๋ฐ ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ์œผ๋กœ ์ธํ•ด ์‹ค์‹œ๊ฐ„์„ฑ ์ €ํ•˜.
  • MCU:
    • ์„œ๋ฒ„ ๋ถ€ํ•˜: ๋ฏน์‹ฑ ์ž‘์—…์ด ๋งค์šฐ ์ปค์ง (CPU/GPU ์ž์› ์†Œ๋น„ ์ฆ๊ฐ€).
    • ํด๋ผ์ด์–ธํŠธ ๋ถ€ํ•˜: ์—ฌ์ „ํžˆ ๋‚ฎ์Œ (๋‹จ์ผ ์ŠคํŠธ๋ฆผ).
    • ์ง€์—ฐ: ๋ฏน์‹ฑ์— 300~500ms ์ถ”๊ฐ€ ์ง€์—ฐ ๋ฐœ์ƒ. ์‹ค์‹œ๊ฐ„์„ฑ ์ €ํ•˜ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ.

10:10 (๋‹ค์ค‘ ์†Œ๊ทœ๋ชจ ๊ทธ๋ฃน ์ฑ„ํŒ…)

  • SFU:
    • ์„œ๋ฒ„ ๋ถ€ํ•˜: ๋‚ฎ์Œ (10๊ฐœ์˜ ๋ณ„๋„ ์ฑ„๋„ ๊ด€๋ฆฌ).
    • ํด๋ผ์ด์–ธํŠธ ๋ถ€ํ•˜: ๊ฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์ตœ๋Œ€ 10๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์„ ์ˆ˜์‹ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ ๋‹นํ•œ ์ˆ˜์ค€์˜ ์ž์› ํ•„์š”.
    • ์ง€์—ฐ: ์„œ๋ฒ„ ์ง€์—ฐ์ด ๋‚ฎ์•„ ์‹ค์‹œ๊ฐ„์„ฑ ์šฐ์ˆ˜.
  • MCU:
    • ์„œ๋ฒ„ ๋ถ€ํ•˜: ๋ฏน์‹ฑ ์ž‘์—… ์ฆ๊ฐ€ (10๊ฐœ์˜ ๋ฏน์‹ฑ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ).
    • ํด๋ผ์ด์–ธํŠธ ๋ถ€ํ•˜: ๋‹จ์ผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋‚ฎ์Œ.
    • ์ง€์—ฐ: ๋ฏน์‹ฑ์œผ๋กœ ์ธํ•ด 200~400ms ์ถ”๊ฐ€ ์ง€์—ฐ ๋ฐœ์ƒ.

๊ฒฐ๋ก : ์‚ฌ์šฉ์ž ์ˆ˜์— ๋”ฐ๋ฅธ ์„ ํƒ

  1. 1:10 ์†Œ๊ทœ๋ชจ ์ฑ„ํŒ…:
    • SFU๊ฐ€ ์ ํ•ฉ. ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์ ๊ณ  ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋›ฐ์–ด๋‚จ.
  2. 1:100 ๋Œ€๊ทœ๋ชจ ์ฑ„ํŒ…:
    • MCU๊ฐ€ ์ ํ•ฉ. ํด๋ผ์ด์–ธํŠธ ๋ถ€ํ•˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ณด์žฅ.
  3. 10:10 ๋‹ค์ค‘ ์†Œ๊ทœ๋ชจ ์ฑ„ํŒ…:
    • ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„.
      • ํด๋ผ์ด์–ธํŠธ์˜ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค๋ฉด SFU.

์ €์‚ฌ์–‘ ๋””๋ฐ”์ด์Šค๋ฅผ ๊ณ ๋ คํ•œ๋‹ค๋ฉด MCU.

๋””์Šค์ฝ”๋“œ์—์„œ๋Š”?

๋””์Šค์ฝ”๋“œ๋Š” ์ฃผ๋กœ SFU ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค๋งŒ, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์„ ์ ์šฉํ•œ๋‹ค.

  • ์ €์‚ฌ์–‘ ๋””๋ฐ”์ด์Šค๋‚˜ ๋„คํŠธ์›Œํฌ ํ’ˆ์งˆ์ด ๋‚ฎ์€ ํ™˜๊ฒฝ์—์„œ๋Š” SFU + ๋‹ค์šด์ƒ˜ํ”Œ๋ง(ํ™”์งˆ/์Œ์งˆ ์กฐ์ •).
  • ๋Œ€๊ทœ๋ชจ ์‚ฌ์šฉ์ž ํšŒ์˜์—์„œ๋Š” MCU์™€ ์œ ์‚ฌํ•œ ์ค‘์•™ ์ง‘์ค‘ํ™” ์ „๋žต์œผ๋กœ ์ŠคํŠธ๋ฆผ์„ ์ตœ์ ํ™”.

๊ตฌ์„ฑ

  • ํด๋ผ์ด์–ธํŠธ
  • Signaling Server
  • STUN Serer
  • TURN Server
  • MediaServer

WebRTC vs WebSocket

WebSocket

  • ๋ชจ๋“  ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์™€ ์›น์†Œ์ผ“ JS ํด๋ฆฌํ•„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์ง€์›๋˜๋Š” IETF ํ‘œ์ค€ ๋งˆ๋ จ
  • HTTP ํ˜ธํ™˜ ํ•ธ๋“œ์‰์ดํฌ์™€ ๊ธฐ๋ณธ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ธฐ์กด ๋ฐฉํ™”๋ฒฝ, ํ”„๋ก์‹œ ๋ฐ ์›น ์„œ๋ฒ„ ์ธํ”„๋ผ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ํ›จ์”ฌ ์‰ฌ์›€
  • ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•œ ๋ธŒ๋ผ์šฐ์ € API
  • ํด๋ผ์ด์–ธํŠธ/๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„๋กœ๋งŒ ์—ฐ๊ฒฐ
  • TCP ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ˆœ์ฐจ์  ์ „์†ก๋งŒ ์ง€์›

WebRTC

  • WebRTC์— ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ , ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„์— ์›น์†Œ์ผ“์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ์›น์†Œ์ผ“์— ๋น„ํ•ด ๋ณต์žก
  • ์—ฐ๊ฒฐ ์‹คํŒจ ๊ฐ€๋Šฅ์„ฑ
  • CPU, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋” ๋งŽ์•„์งˆ ์ˆ˜ ์žˆ์Œ
์š”์†Œ WebRTC WebSocket
CPU ์‚ฌ์šฉ๋Ÿ‰ ์ค‘๊ฐ„(์•”ํ˜ธํ˜ธ ๋ฐ P2P ์—ฐ๊ฒฐ ๊ด€๋ฆฌ) ๋‚ฎ์Œ(๋‹จ์ˆœ ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ)
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ค‘๊ฐ„(P2P ์—ฐ๊ฒฐ ๋ฐ ICE ์ •๋ณด ์œ ์ง€) ๋‚ฎ์Œ(๋‹จ์ˆœ ์—ฐ๊ฒฐ๊ด€๋ฆฌ)
์ง€์—ฐ ์‹œ๊ฐ„ ๋‚ฎ์Œ(P2P ์—ฐ๊ฒฐ) ๋‚ฎ์Œ(์„œ๋ฒ„๋ฅผ ๊ฒฝ์œ )
๊ตฌํ˜„ ๋ณต์žก๋„ ๋†’์Œ(STUN/TURN ๋“ฑ ์„ค์ • ํ•„์š”) ๋‚ฎ์Œ(๊ธฐ๋ณธ HTTP ์„œ๋ฒ„๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ)

์ฐธ๊ณ ์ž๋ฃŒ

https://inpa.tistory.com/entry/WEB-๐ŸŒ-์›น-์†Œ์ผ“-Socket-์—ญ์‚ฌ๋ถ€ํ„ฐ-์ •๋ฆฌ

 

[WEB] ๐ŸŒ ์›น ์†Œ์ผ“ (Socket) ์ •๋ฆฌ (์—ญ์‚ฌ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ)

โ€‹์›น ๊ฐœ๋ฐœ์„ ์ฒ˜์Œ ๋ฐฐ์šฐ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๋ฉด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ํ†ต์‹ ์€ ๋ชจ๋‘ HTTP ํ”„๋กœํ† ์ฝœ๋งŒ ์ด์šฉํ•ด์„œ ์ด๋ฃจ์–ด์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์›น ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ์ฑ„ํŒ…, ๊ฒŒ์ž„, ์ฃผ์‹ ์ฐจํŠธ ๋“ฑ์˜ ์‹ค์‹œ

inpa.tistory.com

 

https://jaehyeon48.github.io/network/websocket-protocol/

 

์›น ์†Œ์ผ“ ํ”„๋กœํ† ์ฝœ

๋“ฑ์žฅ ๋ฐฐ๊ฒฝ ์›น ์†Œ์ผ“์ด ๋“ฑ์žฅํ•˜๊ธฐ ์ „์— ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋˜ ๋ฐฉ์‹์—๋Š” ํด๋ง, ๋กฑํด๋ง, HTTP ์ŠคํŠธ๋ฆฌ๋ฐ ๊ธฐ๋ฒ• ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ธฐ๋ฒ•๋“ค์€ ๊ทผ๋ณธ์ ์œผ๋กœ HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉ

jaehyeon48.github.io

 

https://wormwlrm.github.io/2021/01/24/Introducing-WebRTC.html

 

WebRTC๋Š” ์–ด๋–ป๊ฒŒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ? - ์žฌ๊ทธ์ง€๊ทธ์˜ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ

WebRTC ์—ฐ๊ฒฐ ์ ˆ์ฐจ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ , ์ด ๊ณผ์ •์—์„œ ์ ‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ฏ์„  ์šฉ์–ด๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ด…๋‹ˆ๋‹ค.

wormwlrm.github.io

 

https://velog.io/@jasondal91/๋‚ด๊ฐ€-์ดํ•ดํ•œ-WebRTC

 

๋‚ด๊ฐ€ ์ดํ•ดํ•œ WebRTC

ํ”„๋กœ์ ํŠธ์— WebRTC ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— WebRTC์— ๋Œ€ํ•ด ์ฐพ์•„๋ดค๋‹ค. ์ฒ˜์Œ๋ณด๋Š” ์šฉ์–ด๋“ค์ด ๋งŽ์ด ๋‚˜์™€์„œ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š”๋ฐ ์กฐ๊ธˆ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ๋„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด์—ฌ์„œ ๊นŠ์ด ๋“ค์–ด๊ฐ€

velog.io

 

https://stackoverflow.com/questions/18799364/webrtc-vs-websocket-if-webrtc-can-do-video-audio-and-data-why-do-i-need-webs

 

WebRTC vs WebSocket: If WebRTC can do Video, Audio, and Data, why do I need WebSocket?

So I'm looking to build a chat app that will allow video, audio, and text. I spent some time researching into WebSocket and WebRTC to decide which to use. Since there are plenty of video and audio ...

stackoverflow.com

 

https://millo-l.github.io/WebRTC-๊ตฌํ˜„-๋ฐฉ์‹-Mesh-SFU-MCU/

 

WebRTC ๊ตฌํ˜„ ๋ฐฉ์‹(Mesh/P2P, SFU, MCU) | millo's tech blog

WebRTC๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ฒ„์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. (Mesh/P2P, SFU, MCU)

millo-l.github.io

 

 

๋ฐ˜์‘ํ˜•