๊ธ€ ์ž‘์„ฑ์ž: ๋˜ฅํด๋ฒ .
๋ฐ˜์‘ํ˜•

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 ํ˜•์‹์œผ๋กœ ํ†ต์‹ ํ•˜๋Š” ์ค‘๊ฐœ์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค.

 

๊ธ€์— ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๊ฑฐ๋‚˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์„๊ฒฝ์šฐ ์ง€์ ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

๋ฐ˜์‘ํ˜•