15. NAT 트래버설과 홀펀칭: STUN·TURN·ICE, P2P vs 릴레이
난이도 중내 답안
모범답안
난이도: 중상
모범답안
1. NAT가 만드는 문제
NAT(주로 가정용 PAT/NAPT)는 내부 호스트의 (사설 IP:포트)를 공유기의 (공인 IP:포트)로 매핑한다. 내부에서 바깥으로 나가는 패킷이 나갈 때 매핑이 동적으로 생성되고, 응답 패킷은 그 매핑을 역으로 따라 돌아온다. 문제는 외부에서 내부로 먼저 연결을 걸 수 없다는 점이다 — 아직 매핑이 없고, NAT는 매칭되는 아웃바운드 흐름이 없는 인바운드 패킷을 버린다(포트 포워딩을 수동 설정하지 않는 한). 그래서 "둘 다 NAT 뒤"인 두 피어는 서로에게 먼저 닿을 수 없다.
2. NAT 유형 (매핑 × 필터링)
- Full Cone: 내부
(IP:포트)가 항상 같은 공인(IP:포트)로 매핑되고(매핑 일관), 외부 누구든 그 공인 주소로 보내면 들어온다(필터링 느슨). 홀펀칭 가장 쉬움. - Restricted Cone: 매핑은 일관하지만, 내부가 먼저 보낸 적 있는 목적지 IP에서 오는 패킷만 통과.
- Port-Restricted Cone: 위와 같되 IP+포트까지 일치해야 통과.
- Symmetric NAT: 목적지가 다르면 매핑(공인 포트)이 매번 달라진다. STUN으로 알아낸 포트가 실제 피어로 보낼 때의 포트와 달라, 상대가 예측한 포트로 보내도 빗나간다 → 홀펀칭 실패율이 매우 높다. 두 피어가 모두 Symmetric이면 사실상 직접 연결 불가 → 릴레이 필요.
3. STUN / TURN / ICE
- STUN(서버 반사): 클라이언트가 STUN 서버에 UDP를 보내면 서버가 "내가 본 너의 공인 (IP:포트)"를 회신한다. 이 서버 반사 주소(srflx) 가 NAT가 부여한 외부 매핑이다. 클라이언트는 이를 시그널링 채널(매치메이킹 서버 등)로 상대에게 교환한다.
- 홀펀칭: 두 피어가 상대의 srflx로 동시에 패킷을 쏜다. 각자의 아웃바운드 패킷이 자기 NAT에 매핑(구멍)을 열고, 곧이어 도착한 상대 패킷이 그 구멍을 통과한다. 한쪽이 먼저 쏜 패킷은 상대 NAT에서 버려지지만 자기 쪽 매핑은 열린 상태가 되므로, 양쪽이 반복하면 연결이 성립한다.
- UDP 홀펀칭은 비교적 잘 된다(매핑이 단순). TCP 홀펀칭은 3-way 핸드셰이크와 SYN 상태 머신 때문에 훨씬 까다롭고 OS/NAT 의존적이라 실패율이 높다 — 그래서 실시간 게임은 대개 UDP를 쓴다.
- TURN(릴레이): 직접 연결이 안 되면(특히 Symmetric NAT), 공인 TURN 서버가 두 피어의 트래픽을 중계한다. 항상 성공하지만 모든 트래픽이 릴레이를 거쳐 지연↑·대역폭 비용↑. 그래서 최후의 폴백.
- ICE: 위를 하나로 묶는 절차. 각 피어가 후보를 수집한다 — host(로컬 주소), srflx(STUN 반사), relay(TURN). 후보들을 교환하고 우선순위(보통 host > srflx > relay)대로 쌍을 만들어 연결성 점검(STUN binding 요청) 을 주고받아, 실제로 통하는 가장 좋은 경로를 선택한다.
4. 게임에서의 선택
- P2P 홀펀칭: 서버 비용이 적고(릴레이 불필요), 피어 간 직접 경로라 지연이 낮을 수 있다. 단점은 NAT 실패율(특히 Symmetric/CGNAT), 피어 IP 노출(DDoS·스왓팅), 그리고 치트에 취약(권위가 클라에 있음). 격투/소규모 협동처럼 권위 분산이 허용되는 게임에 적합.
- 전용 서버(dedicated): 서버가 권위를 갖고 모든 클라가 서버로 아웃바운드 연결(NAT 문제 없음). 치트 방지·일관성·관측성에 유리하지만 서버 운영 비용이 크다. 경쟁적 FPS/MMO처럼 공정성이 중요한 게임의 표준.
- 현실적 절충: ICE로 직접 연결을 시도하되 실패 시 TURN/전용 릴레이로 폴백. 매치메이킹/시그널링은 항상 중앙 서버가 담당. CGNAT(이중 NAT) 보급으로 직접 연결 성공률이 떨어지고 있어, 경쟁 게임은 점점 전용 서버로 수렴하는 추세.
핵심 요약
NAT는 인바운드를 막으므로 양쪽이 NAT 뒤면 직접 연결이 안 된다. STUN으로 공인 매핑을 알아내 홀펀칭을 시도하고, 안 되면(특히 Symmetric NAT) TURN으로 릴레이한다. ICE가 host/srflx/relay 후보로 이 과정을 자동화한다. 게임은 지연·치트·실패율·비용을 저울질해 P2P와 전용 서버 사이에서 고른다.