Notice
Recent Posts
Recent Comments
Link
๊ด€๋ฆฌ ๋ฉ”๋‰ด

I'm pine thank you and you?

WebRTC๊ฐ€ ๋ฌด์—‡์ผ๊นŒ? (์šฉ์–ด, ์ƒ˜ํ”Œ, openvidu) ๋ณธ๋ฌธ

CS

WebRTC๊ฐ€ ๋ฌด์—‡์ผ๊นŒ? (์šฉ์–ด, ์ƒ˜ํ”Œ, openvidu)

SollyJ 2023. 3. 4. 16:26

์ •์˜

Web Real-Time Communication ๐Ÿ“ก

์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•Œ๊ณ ์žˆ๋Š” ํ™”์ƒ ํ†ตํ™”, ํ™”์ƒ ๊ณต์œ ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค

๋น„๋””์˜ค, ์Œ์„ฑ, ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ P2P๋ฐฉ์‹์œผ๋กœ ์ „์†ก

JavaScript API๋กœ ์ œ๊ณต

 


 

๊ด€๋ จ ์šฉ์–ด

1. data streams 

๋ง๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋“ค์˜ ํ๋ฆ„

๋ฐ์ดํ„ฐ์˜ ์–‘์ด ํ•œ์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ๋Š์ž„์—†์ด ์ƒ์„ฑ๋˜๊ณ  ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„

 

2. Signaling

์„ธ์…˜ ์ œ์–ด ๋ฉ”์„ธ์ง€, ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ, ๋ฏธ๋””์–ด ๊ธฐ๋Šฅ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๊ณผ์ •

  • ์„ธ์…˜ ์ œ์–ด ๋ฉ”์„ธ์ง€: ํ†ต์‹ ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ, ์˜ค๋ฅ˜ ๋ณด๊ณ 
  • ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ: ์ปดํ“จํ„ฐ์˜ IP์ฃผ์†Œ์™€ ํฌํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…
  • ๋ฏธ๋””์–ด ๊ธฐ๋Šฅ: ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋ฑ๊ณผ ํ•ด์ƒ๋„

P2P ํ†ต์‹ ์ด ์ผ์–ด๋‚˜๊ธฐ ์ „ Signaling์ด ์™„๋ฃŒ ๋˜์–ด์•ผ ํ•œ๋‹ค!

 

3. ICE (Interactive Connectivity Establishment)

๋ธŒ๋ผ์šฐ์ €๊ฐ€ peer๋ฅผ ํ†ตํ•œ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

๋”๋ณด๊ธฐ

๋ฐฉํ™”๋ฒฝ (STUN์œผ๋กœ ํ•ด๊ฒฐ)

๋‹จ๋ง์— Public IP๊ฐ€ ์—†๋‹ค๋ฉด ์œ ์ผํ•œ ์ฃผ์†Œ๊ฐ’์„ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค. (STUN์œผ๋กœ ํ•ด๊ฒฐ)

๋ผ์šฐํ„ฐ๊ฐ€ peer๊ฐ„์˜ ์ง์ ‘ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ์— ๋ฐ์ดํ„ฐ๋ฅผ relay(์ค‘๊ณ„) ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ (TURN์œผ๋กœ ํ•ด๊ฒฐ)

ICE๋Š” ์œ„์˜ ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด STUN ๋˜๋Š” TURN ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

4. NAT (Network Address Transilation)

๋„คํŠธ์›Œํฌ ์ฃผ์†Œ ๋ณ€ํ™˜

๋‹จ๋ง์— Public IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

๋”๋ณด๊ธฐ

๊ฐ ๊ธฐ๊ธฐ์—๋„ ์ž์‹ ๋งŒ์˜ ์ด๋ฆ„์ด ์žˆ๋‹ค.

์ž์‹ ๋งŒ์˜ ์ด๋ฆ„์„ Private IP๋ผ๊ณ  ํ•˜์ž.

IP๋Š” ๊ณ ์ • IP, ์œ ๋™ IP๋กœ ๋‚˜๋‰˜๊ณ  ๊ณ ์œ ์˜ ๊ฐ’์ผ ์ˆ˜๋„ ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ์—์„œ๋Š” ํ†ต์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด ๊ธฐ๊ธฐ๊ฐ€ ์‚ฌ์„ค ๋ฐ”๊นฅ ์ชฝ์— ์žˆ๋Š” ๋„คํŠธ์›Œํฌ์— ์ ‘์†ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” Public IP๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

192.168.100.3:3855(Private Address)์— ๋Œ€ํ•ด์„œ NAT๋Š” ์™ธ๋ถ€์— 142.12.131.7:6282(Public Address)๋กœ ๋งคํ•‘ํ•ด์„œ ์ „๋‹ฌํ•œ๋‹ค.

NAT ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. (Full Cone → Restricted Cone → Port Restricted Cone → Symmetric๋กœ ๊ฐˆ์ˆ˜๋ก ๋ณด์•ˆ↑)

Public IP๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ๋•Œ๋งˆ๋‹ค NAT์— ์˜ํ•ด ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ Public IP๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•œ๋‹ค.

๐Ÿ‘‰ STUN, TURN ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉ!

 

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

๋‚ด Public ์ฃผ์†Œ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์„œ๋ฒ„

peer๊ฐ„์˜ ์ง์ ‘ ์—ฐ๊ฒฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ํ˜„์žฌ peer๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ค€๋‹ค.

ํ•„์š”ํ•œ ์ด์œ ?

์นœ๊ตฌ์™€ ๋‚ด๊ฐ€ ์“ฐ๊ณ  ์žˆ๋Š” Wifi๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด ๊ฐ™์€ ๋ฐฉ์— ๋“ค์–ด์™€ ์žˆ์–ด๋„ stream์„ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.

Public ์ฃผ์†Œ๋ฅผ ์•Œ์•„์•ผ ๋‹ค๋ฅธ ๋„คํฌ์›Œํฌ์— ์žˆ๋Š” ์žฅ์น˜๋“ค์ด ์„œ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์ด ๋•Œ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด STUN ์„œ๋ฒ„!

1. ํด๋ผ์ด์–ธํŠธ๋Š” ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์ž์‹ ์˜ Public ์ฃผ์†Œ(IP์™€ PORT)๋ฅผ ์š”์ฒญ 

2. STUN ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ Public ์ฃผ์†Œ์™€ NAT, ๋ฐฉํ™”๋ฒฝ ์œ ํ˜•์„ ์•Œ๋ ค์ค€๋‹ค.

3. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅ? ๋ถˆ๊ฐ€๋Šฅ? ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ STUN ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š”๋‹ค.

STUN์€ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ์ œ๊ณตํ•ด์ค„ ๋ฟ, ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•  ๋•Œ STUN์ด ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์—†๋‹ค. ๐Ÿ‘‰ ์ด ๋•Œ TURN ์ด์šฉ

๋Œ€๋ถ€๋ถ„์˜ WebRTC๋Š” STUN์„ ์ด์šฉํ•œ ์—ฐ๊ฒฐ๋กœ๋„ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

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

NAT ๋ณด์•ˆ ์ •์ฑ…์ด ๋„ˆ๋ฌด ์—„๊ฒฉํ•ด NAT์„ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์“ด๋‹ค.

peer๋“ค์€ TURN ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ํ†ต์‹ ํ•œ๋‹ค. 

TURN ์„œ๋ฒ„๋Š” ๊ณต์šฉ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋ฏธ๋””์–ด๋ฅผ relay(์ค‘๊ณ„)ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

7. SDP (Session Description Protocol)

ํ•ด์ƒ๋„, ํ˜•์‹, ์ฝ”๋ฑ, ์•”ํ˜ธํ™” ๋“ฑ ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ์ปจํ…์ธ ์˜ ์—ฐ๊ฒฐ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€

๊ธฐ๊ธฐ ๊ฐ„์˜ ๋ฏธ๋””์–ด๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•œ ์„ค๋ช…์„ ์œ„ํ•ด ์‚ฌ์šฉ

 


 

WebRTC ์ƒ˜ํ”Œ API

WebRTC APIs

1. ๋ฏธ๋””์–ด ์žฅ์น˜์— ์•ก์„ธ์Šค

getUserMedia()

  • ๊ธฐ๊ธฐ(์นด๋ฉ”๋ผ or ๋งˆ์ดํฌ)์— ์ ‘๊ทผํ•œ๋‹ค.
  • alert๋กœ ๊ธฐ๊ธฐ ํ—ˆ์šฉ/๊ฑฐ๋ถ€ Permission์ด ๋œฌ๋‹ค.
  • drawImage()๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์ด๋ฏธ์ง€์— filter๋ฅผ ์”Œ์šธ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์˜ค๋””์˜ค๋งŒ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋น„๋””์˜ค ๋…นํ™” ๊ธฐ๋Šฅ๋„ ์žˆ๋‹ค.

2. peer ์—ฐ๊ฒฐ ์ œ์–ด

RTCPeerConnection()

  • ๋‘ peer ๊ฐ„์˜ ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ ํ†ต์‹ ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • Chrome, Opera, Firefox์—์„œ ์ง€์›

3. peer์—๊ฒŒ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ

RTCDataChannel()

  • text, file, data๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

 


 

Kurento

WebRTC ๋ฏธ๋””์–ด ์„œ๋ฒ„

WebRTC ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ Signalling Server

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฏธ๋””์–ด ์„œ๋ฒ„๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?

๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค์—์„œ 1:N ์ŠคํŠธ๋ฆฌ๋ฐ์„ ํ•˜๋Š”๋ฐ P2P ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœํ•˜๊ธฐ์—” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋‹ค.

๊ฐ€๋ น, peer๊ฐ€ 10๋งŒ๋ช…์ด๋ผ๋ฉด ์ŠคํŠธ๋ฆฌ๋จธ์˜ ํด๋ผ์ด์–ธํŠธ๋Š” ํ„ฐ์งˆ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ peer ์ค‘๊ฐ„์— ๋ฏธ๋””์–ด ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

๋ฏธ๋””์–ด ์„œ๋ฒ„ ์›๋ฆฌ

๐Ÿ  ๋ฐฉ ์ƒ์„ฑ

CREATE(๋ฐฉ๋ฒˆํ˜ธ, ๋ฐฉ์— ๋Œ€ํ•œ ์„ค์ •)

 

๐ŸŽ™๏ธ ๋ฐฉ์†ก์„ ํ•˜๊ธฐ์œ„ํ•œ ์ค€๋น„

JOIN(๋ฐฉ๋ฒˆํ˜ธ, PUBLISHER)

 

๐Ÿ“บ ๋ฐฉ์†ก ํ•˜๊ธฐ

CREATE OFFER: ๋ฐฉ์†กํ•ด๋„๋จ?

PUBLISH: ๋ฐฉ์†ก ํ• ๊ฒŒ

ํ•˜๋ฉด Kurento ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ stream์ด ๋‚ ๋ผ์˜ค๊ณ  ๋ฐฉ์†ก์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

 

๐Ÿ™‹‍โ™€๏ธ ๋ฐฉ์— ์ฐธ์—ฌ

JOIN(๋ฐฉ๋ฒˆํ˜ธ, SUBSCRIBER, FEED): FEED๋Š” PUBLISHER์˜ ์•„์ด๋””

CREATE ANSWER: ์•„๊นŒ OFFER๋กœ ๋“ค์–ด์˜จ ๋ฐฉ์†ก ์ฐธ์—ฌํ• ๊ฒŒ

START(๋ฐฉ๋ฒˆํ˜ธ): ๋ฐฉ์†ก ๋ณผ๊ฒŒ

ํ•˜๋ฉด Kurento ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ stream์ด ๋‚ ๋ผ์˜ค๊ณ  ๋ฐฉ์†ก์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

 


 

OpenVidu

Kurento ๊ธฐ๋ฐ˜์˜ ์ค‘๊ฐœ ์„œ๋ฒ„๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์™„์ „ํ•œ ๊ธฐ์ˆ  ์Šคํƒ์„ ์ œ๊ณตํ•˜๋Š” ํ”Œ๋žซํผ