[UDP ํํ์นญ(Hole Punching)] - UDP ํํ์นญ(2/2)
2์ค ์์ฝ
- UDP ํํ์นญ์ ํตํด NAT๊ฐ ๊ตฌ์ฑ๋์ด์๋ ํธ์คํธ๋ผ๋ฆฌ ํต์ ์ด ๊ฐ๋ฅํ๋ค
- ํํ์นญ์ ์ํด์ ์ค๊ฐ์๋ฒ๊ฐ ํ์ํ๋ค
UDP ํํ์นญ
์ด์ ๊ธ์์ NAT๋ก ์ธํด ์๋ก์ Public IP์ Port๋ฒํธ๋ฅผ ๋ชฐ๋ผ, P2P ํต์ ์ ํ๊ธฐ๊ฐ ์ด๋ ต๋ค๊ณ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐ ํ ๊น? ๊ฐ๋จํ๋ค, ์ด ๊ธ์ ์ฃผ์ ๋๋ก UDP ํํ์นญ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ด๋ฌํ ๊ธฐ๊ณ๋ฅผ ์ค์ํ์์ ๋ณธ ์ ์ด ์์๊ฒ์ด๋ค. ๊ตฌ๋ฉ์ ๋ซ์ด์ฃผ๋ ๋ ์์ธ๋ฐ UDP ํํ์นญ๋ ์๋ฏธ๋๋ก P2Pํต์ ์ ํ๊ธฐ ์ํด NAT์๋ค๊ฐ ํต๋ก(?)๊ฐ์ ๊ฒ์ ๋ซ์ด์ฃผ๋ ๊ธฐ๋ฒ์ ๋ปํ๋ค
UDP ํํ์นญ์ ์ํด์ ์ค๊ฐ์๋ฒ๋ผ๋ ์กด์ฌ๊ฐ ํ์ํ๋ค.
์ค๊ฐ ์๋ฒ
์๋ ์์์์ IP ์ฒด๊ณ์ 300.300.300.300์ด๋ผ๋ IP๋ ์กด์ฌํ ์ ์์ต๋๋ค. (255๊ฐ ์ต๋ ์์น๊ธฐ ๋๋ฌธ)
์ค๋๋ ํฌ์คํธ๋ผ ๊ทธ๋ฆผ ์์ ์ด ์๋๋๋ฐ ์ฐธ๊ณ ํ์ฌ ๋ด์ฃผ์๊ธธ ๋ฐ๋๋๋ค(__)
์์ ๋งํ๋ฏ์ด, ์ ์ A์ ์ ์ B๋ผ๋ฆฌ ์ง์ ์ ์ธ ํต์ ์ ํ์ฌ NAT๋ก ์ธํด ๊ฐ๋ก๋งํ ์๊ธฐ ๋๋ฌธ์ ๋ถ๊ฐ๋ฅํ ์ํ๋ค.
์ ์ A์ ์ ์ B์ <IP, ํฌํธ๋ฒํธ>๊ฐ ๋์ผํ๋ค๊ณ ํด์ '์ด..? ์ด๊ฑฐ ์๋ชป๋ ๊ทธ๋ฆผ์๋์ผ?' ๋ผ๊ณ ์๊ฐ ํ ์๋ ์์ง๋ง Private IP, Port๋ฒํธ๊ฐ ๊ฐ๋๋ผ๋ ๋ค๋ฅธ NAT๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ก ๋ค๋ฅธ ์กด์ฌ๋ค
(๋ค์ ๋งํ์ง๋ง, Private ์ฃผ์๋ ํ๋์ NAT์์๋ง ์ ํจํ ์ฃผ์๋ค)
์ฐ๋ฆฌ์ ๋ชฉ์ ์ ์ ์ A์ ์ ์ B์ Public IP์ Port๋ฒํธ๋ฅผ ์์๋ด์ ์ด ์ฃผ์๋ฅผ ์ดํด ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ! ๊ทธ๋ฌ๊ธฐ ์ํด์ ์ค๊ฐ์๋ฒ์ ํ์ด ํ์ํ๋ค.
์ ์ A์ ์ ์ B๊ฐ P2Pํต์ ์ ํ๊ธฐ ์ํด์ ๊ฐ์ฅ ๋จผ์ ์ค๊ฐ์๋ฒ์ ์ ์ํด์ผ ํ๋ค.
์ด ์ค๊ฐ์๋ฒ๋ Public IP, Port๊ฐ ๊ณต๊ฐ๋์ด์๊ณ ์ ์ ๋ค์ด ์ด๋์๋ ์ด ์ฃผ์๋ฅผ ํตํด ์ ์ํ ์ ์์ด์ผ ํ๋ค.
(๊ทธ๋ฆผ์์ 300.300.300.300:3 ์ด๋ค.)
์ ์ A์ ์ ์ B๊ฐ ์ฃผ์๊ฐ ๊ณต๊ฐ๋ ์ค๊ฐ์๋ฒ(300.300.300.300:3)์๊ฒ ์๋ฌด ๋ฉ์ธ์ง๋ฅผ ๋ ๋ฆฌ๊ฒ ๋๋ฉด
์ ์ A์ NAT์ ์ ์ B์ NAT๋ ์ธ๋ถ ๋คํธ์ํฌ(์ค๊ฐ์๋ฒ)์ ํต์ ํ๊ธฐ ์ํด ์์ ์ Private IP, Port๋ฒํธ๋ฅผ Public IP์ ์ ์ ํ Port๋ฒํธ๋ฅผ ๋ง๋ค์ด ์ค๊ฐ์๋ฒ์ ํต์ ํ ์ ์๋๋ก ๋ง๋ค์ด์ค๋ค.
์ด ๊ณผ์ ์์ NAT๋ ํ ์ด๋ธ์ ์ ์ A์ Private ์ฃผ์์ Public ์ฃผ์๋ฅผ ๋งคํํ ๊ฒ์ ๊ธฐ๋กํ๊ณ ,
์ ์ B์ NAT๋ ๋ง์ฐฌ๊ฐ์ง๋ก Private ์ฃผ์์ Public ์ฃผ์๋ฅผ ๋งคํํ ๊ฒ์ ๊ธฐ๋กํ๋ค.
์ค๊ฐ์๋ฒ๊ฐ ์ ์ A์ ์ ์ B์ ๋ฉ์ธ์ง์ ์๋ต์ ํ๋ฉด NAT๊ฐ ๊ธฐ๋กํ ํ ์ด๋ธ ๋๋ก,
A์ ์ ์ฅ์์๋ 100.100.100.100:1 ์ Public ์ฃผ์๋ก ์ค๊ฐ์๋ฒ์ ์๋ต์ด ์์ ๋ Private IP, Port๊ฐ 192.168.0.2:1์ธ ์ ์ A์ ํธ์คํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ฒ ๋๊ณ
B์ ์ ์ฅ์์๋ 200.200.200.200:2์ Public ์ฃผ์๋ก ์ค๊ฐ์๋ฒ์ ์๋ต์ด ์์ ๋ Private IP, Port๊ฐ 192.168.0.2:1์ธ ์ ์ B์ ํธ์คํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
์ ์ A์ ์ ์ B๊ฐ ์ค๊ฐ์๋ฒ์์ ํต์ ๋๋ถ์
NAT A๋ 100.100.100.100:1 <-> 192.168.0.2:1 ์ด๋ผ๋ ํ ์ด๋ธ์
NAT B๋ 200.200.200.200:1 <-> 192.168.0.2:1 ์ด๋ผ๋ ํ ์ด๋ธ์
์ป๊ฒ ๋์๋ค.
ํ๋ง๋๋ก ์ ์ A์ ์ ์ B๊ฐ ์๋ก ํต์ ์ ๊ฐ๋ฅํ๊ธฐ ์ํ ํต๋ก๋ฅผ ๋ง๋ค์ด ์ฃผ์๋ค๊ณ ๋ด๋ ๋ฌด๋ฐฉํ๋ค
(100.100.100.100:1 <-> 200.200.200.200:1 ๋ฅผ ํตํด์)
์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ด์ ์๋ก์ Public IP์ Port๋ก P2P ํต์ ์ ํ๋ฉด ๋๋ค.
(์๋ก์ Public ์ฃผ์๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ์ ์ค๊ฐ ์๋ฒ ํน์ ๊ฒ์์๋ฒ๋ก ์ด๋ป๊ฒ๋ ๊ตฌํํ๊ธฐ ๋๋ฆ)
์ฃผ์ํ ์
์ฃผ์ํ ์ ์ NAT๊ฐ ๋งคํ์ํจ Private ์ฃผ์์ Public ์ฃผ์๊ฐ ์ค๋ซ๋์ ํต์ ์ด ์์ผ๋ฉด ์ญ์ ๋๊ธฐ ๋๋ฌธ์ ์ผ์ ์ฃผ๊ธฐ๋ก ํํธ๋นํธ(Ping)์ ๋ณด๋ด์ ํต๋ก๋ฅผ ์ ์ง์ํค๋ ๊ฒ์ด ์ค์ํ๋ค.
ํ์ง๋ง, ์ด๋ฐ ๋ฐฉ์๋ NAT๋ง๋ค ์ฐจ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ UDP ํํ์นญ์ ์คํจํ๋ฉด ์ด์ฉ ์ ์์ด ์ ์ A์ ์ ์ B์ ์ง์ ์ ์ธ ํต์ ์ ๋ถ๊ฐ๋ฅํ๊ณ ์ค๊ฐ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ์ํค๋ ์์ผ๋ก ๊ตฌํํด์ผํ๋ค.
์์์๋ ์ ์ A์ ์ ์ B๊ฐ ์๋ก ๋ค๋ฅธ NAT๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํ์ ์ค๋ช ์ ํ์ง๋ง
์ ์ A์ ์ ์ B๊ฐ ๊ฐ์ NAT๋ผ๋ฉด ๊ตณ์ด Public ์ฃผ์๋ก ํต์ ํ ํ์ ์์ด ์๋ก์ Private ์ฃผ์๋ก ํต์ ํ๋ฉด ๋๋ค
๋ฌผ๋ก ์ด๊ฒ๋ ์ค๊ฐ์๋ฒ๋ฅผ ์ ์ ํ ํ์ฉํ์ฌ ๊ตฌํ ํ ์์๋ค ^^;
Golang์ผ๋ก ์์ ๊ตฌํ
https://github.com/cjwcjswo/BlogProject/tree/master/network/holePunching
json ํ์์ผ๋ก ํต์ ํ๋ ์ค๊ฐ์๋ฒ, ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ๋จํ ๊ตฌํํด ๋ณด์๋ค.
๊ธ์ ์ดํด๊ฐ ์๋๋ ๋ถ๋ถ์ด ์๊ฑฐ๋ ๋ฌธ์ ๊ฐ ์์๊ฒฝ์ฐ ์ง์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
'Development > Network' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
ํด๋ผ์ด์ธํธ์ ์น ๊ฒ์์ ํต์ ๊ด๊ณ(feat. ์ด๋ฒคํธํ์ด์ง)
ํด๋ผ์ด์ธํธ์ ์น ๊ฒ์์ ํต์ ๊ด๊ณ(feat. ์ด๋ฒคํธํ์ด์ง)
2021.03.30 -
[๋คํธ์ํฌ ๊ธฐ์ด ์ง์] IP, CIDR ํ๊ธฐ๋ฒ, ์๋ธ๋ท ๋ง์คํฌ
[๋คํธ์ํฌ ๊ธฐ์ด ์ง์] IP, CIDR ํ๊ธฐ๋ฒ, ์๋ธ๋ท ๋ง์คํฌ
2019.07.03 -
[UDP ํํ์นญ(Hole Punching)] - NAT ๊ทธ๋ฆฌ๊ณ P2P(1/2)
[UDP ํํ์นญ(Hole Punching)] - NAT ๊ทธ๋ฆฌ๊ณ P2P(1/2)
2018.12.03