๐ฅ Signaling (Full-Mesh)
์๋ฒ๋ฅผ ํตํด ํต์ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ peer ๋ผ๋ฆฌ ์ง์ ์ฐ๊ฒฐ๋๋ ๋ฐฉ์
peer ๊ฐ์ offer, answer(session ์ ๋ณด) signal์ ์๋ฒ๊ฐ ์ค๊ณํ๋ค.
โ peer ๊ฐ์ ์ฐ๊ฒฐ ์ ๋ณด๋ง ์ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ ํ์๋ ์๋ฒ์ ๋ถํ๊ฐ ์๋ค.
โ 1 : 1 ์ฐ๊ฒฐ์ ์ ํฉํ๋ค.
์๋ฒ์ ๋ถํ๊ฐ ์ ์ด ์๋ฒ ์์์ด ์ ๊ฒ ๋ ๋ค.
peer๊ฐ์ ์ง์ ์ฐ๊ฒฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ์ฑ์ด ๋ณด์ฅ๋๋ค.
peer๊ฐ์ ์ง์ ์ฐ๊ฒฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ์ด ๋ง์์ง ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ์ ๊ณผ๋ถํ๊ฐ ๊ธ๊ฒฉํ๊ฒ ์ฆ๊ฐํ๋ค.
SDP (Session Description Protocol)
RFC 4566์ ๊ท์ ๋ ์คํธ๋ฆฌ๋ฐ ๋ฏธ๋์ด์ ์ด๊ธฐํ ์ธ์๋ฅผ ๊ธฐ์ ํ๊ณ ํ์ํ๊ธฐ ์ํ ๊ฒ
๐ฃ๏ธ ์ฐ๊ฒฐ ๋จ๊ณ
- ์๋ก์ด ๋ธ๋ผ์ฐ์ (A)์์ SDP ํํ์ Offer๋ฅผ ์์ฑํ๋ค.
- Offer๋ฅผ ๋ณธ์ธ(A)์ LocalDescription์ ๋ฑ๋กํ๋ค.
- A์ Offer๋ฅผ ์๊ทธ๋๋ง ์๋ฒ์ ์ ๋ฌํ๋ค.
- ์๋ฒ๋ ํ ๋ธ๋ผ์ฐ์ (B)์๊ฒ SDP ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ค.
- Offer๋ฅผ ๋ฐ๋ ๋ธ๋ผ์ฐ์ (B)๋ ๋ณธ์ธ(B)์ Offer ์ ๋ณด๋ฅผ RemoteDescription์ ๋ฑ๋กํ๋ค.
- B๋ Answer ๋ฉ์์ง๋ฅผ ์์ฑํ๋ค.
- B๋ ๋ณธ์ธ์ LocalDescription์ผ๋ก Answer ๋ฉ์์ง๋ฅผ ๋ฑ๋กํ๋ค.
- Answer๋ฅผ ์๊ทธ๋๋ง ์๋ฒ๋ก ์ ๋ฌํ๋ค.
- ์๊ทธ๋๋ง ์๋ฒ๋ A์๊ฒ Answer๋ฅผ ์ ๋ฌํ๋ค.
- A๋ Answer์ ๋ณด๋ฅผ ๋ณธ์ธ(A)์ RemoteDescription์ ๋ฑ๋กํ๋ค.
SDP๋ฅผ ๊ตํํ ํ ๊ฐ Peer๋ ์๋ก์ ์ฃผ์ ๊ฐ์ ์๊ธฐ ์ํด ICE Candidate๋ฅผ ๊ตํํ๋ค.
ICE (Interactive Connectivity Establishment)
P2P ๋คํธ์ํน์์ ๋ ์ปดํจํฐ๊ฐ ๊ฐ๋ฅํ ํ ์ง์ ์๋ก ํต์ ํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ ์ํด ์ปดํจํฐ ๋คํธ์ํน์ ์ฌ์ฉ๋๋ ๊ธฐ์ ( ํ๋กํ ์ฝ(TCP or UDP), IP ์ฃผ์, ํฌํธ ๋๋ฒ, ์ปค๋ฅ์ ํ์ ๋ฑ์ ์ ์ )
๋ฐฉํ๋ฒฝ์ด ์กด์ฌํ๊ฑฐ๋, NAT ํ๊ฒฝ์ ๋์ฌ ์๋ ๊ฒฝ์ฐ์๋ Peer์ ๋ํ ์ง์ ์ ์ธ ์๊ทธ๋๋ง์ด ๋ถ๊ฐ๋ฅ
โ UDP Hole Punching ๋ฐฉ์์ ํตํด ํด๊ฒฐ
๊ณต์ ๊ธฐ์์ Private IP, Port ๋ฒํธ๋ฅผ Public IP, Port๋ฒํธ ํน์ ๊ทธ ๋ฐ๋๋ก ๋ณํ์์ผ์ฃผ๋ ๊ฐ๋
โ ์ค์ ๋ค๋ฅธ ์ ์ ๋ ๋ด Public IP์ Port๋ก ํต์ ์ ํ๋ ๊ฒ
P2Pํต์ ์ ํ๊ธฐ ์ํด NAT์๋ค๊ฐ ํต๋ก(?)๊ฐ์ ๊ฒ์ ๋ซ์ด์ฃผ๋ ๊ธฐ๋ฒ
์ค๊ฐ์๋ฒ(Public IP, Port๊ฐ ๊ณต๊ฐ๋)๋ฅผ ํ์๋กํ๋ค.
์ค๊ฐ์๋ฒ์์ ํต์ ์ผ๋ก ์ป๊ฒ๋ Public IP, Port๋ก A, B๋ ์๋ก ํต์ ํ ์ ์๋ค.
๐ฏ STUN(Session Traversal Uilities for NAT) ์๋ฒ
NATํ๊ฒฝ์์๋ Private IP๋ฅผ ๋ณ๋๋ก ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ Peer to Peer(์ดํ P2P) ํต์ ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๋ ์์ ์ Public IP๋ฅผ ํ์ธํ๊ธฐ ์ํด STUN ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ฒ๋ก ๋ถํฐ ์์ ์ Public IP๋ฅผ ๋ฐ๋๋ค.
๊ทธ๋์ ์ด๋๋ถํฐ ํด๋ผ์ด์ธํธ๋ ์์ ์ด ๋ฐ์ Public IP๋ฅผ ์ด์ฉํ์ฌ ์๊ทธ๋๋ง์ ํ ๋ ๋ฐ์ ๊ทธ ์ ๋ณด๋ฅผ ์ด์ฉํด์ ์๊ทธ๋๋ง์ ํ๊ฒ ํ๋ค.
๋ค๋ง ์ด STUN์ผ๋ก ๋ชจ๋ ๊ฑธ ํด๊ฒฐํ ์๋ ์๋๋ฐ ๋ฐ๋ก ๋ Client๊ฐ ๊ฐ์ ๋คํธ์ํฌ์ ์กด์ฌํ๊ณ ์์๋๋ ์ด๊ฒ์ผ๋ก๋ ํด๊ฒฐ์ด ๋์ง ์๋๋ค.
๋ํ, NAT ํ๊ฒฝ์์๋ Symmetirc NAT์ ๊ฒฝ์ฐ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ฌ๋ผ์ง๋ฉด NAT์ ๋งคํํ ์ด๋ธ์ด ๋ฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ช TURN ์๋ฒ
TURN ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ค์ด ํต์ ํ ๋ Public ๋ง์ ์กด์ฌํ๋ TURN ์๋ฒ๋ฅผ ๊ฒฝ์ ํ์ฌ ํต์ ํ๊ฒ ๋๋ค.
ํด๋ผ์ด์ธํธ๋ ์์ ์ Private IP๊ฐ ํฌํจ๋ TURN ๋ฉ์ธ์ง๋ฅผ ํด์๋ฒ๋ก ๋ณด๋ธ๋ค.
๊ทธ๋ฌ๋ฉด TURN ์๋ฒ๋ ๋ฉ์ธ์ง์ ํฌํจ๋ Network Layer IP ์ฃผ์์ย Transport Layer์ UDP ํฌํธ ๋๋ฒ์์ ์ฐจ์ด๋ฅผ ํ์ธํ๊ณ ํด๋ผ์ด์ธํธ์ Public IP๋ก ์๋ตํ๊ฒ ๋๋ค.
์ด๋ NAT๋ NAT ๋งคํํ ์ด๋ธ์ ๊ธฐ๋ก๋์ด ์๋ ์ ๋ณด์ ๋ฐ๋ผ์ ๋ด๋ถ ๋คํธ์ํฌ์ ์๋ ํด๋ผ์ด์ธํธ์ Private IP ๋ก ๋ฉ์ธ์ง๋ฅผ ์ ์กํ๋ค.
TURN ์๋ฒ๋ ICE์ ์ผ๋ถ๋ก ์ฌ์ฉ๋ ์ ์๋๋ก ๋์์ธ ๋์๋ค.
STUN ๐ TURN
TURN์๋ฒ๋ STUN์๋ฒ์ ๊ฐ๋ ์ ํฌํจํ๊ณ ์๋ ์งํฉ์ด๋ค.
STUN์๋ฒ์ฒ๋ผ ๋จ์ํ ๋ผ์ฐํ ํ ์ด๋ธ์ ํตํด์ private ip์ public ip๋ฅผ ์ฐ๊ฒฐํ๋๋ฐ์์ ๊ทธ์น์ง ์๋๋ค.
WebRTC๋ฅผ ์๋ก ๋ค๋ฉด ๋ฏธ๋์ด ๋ฐ์ดํฐ๋ฅผ 1:1๋ก ๋ณด๋ด์ค๋ค๊ณ ํ์๋ ๊ทธ ๋ชจ๋ ๋ฐ์ดํฐ๋ TURN ์๋ฒ๋ฅผ Relay ์๋ฒ๋ก ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ Peer์๊ฒ ์ ๋ฌํด์ฃผ๊ฒ ๋๋ค.
https://medium.com/monday-9-pm/์ด๋ณด๊ฐ๋ฐ์-webrtc-์๊ทธ๋๋ง์๋ฒ-๋ง๋ค๊ธฐ-caf8cf9adc9a