UDP 홀펀칭 2 (NAT 방식) 어떻게 알아내고 처리할까~
2007. 1. 18. 09:59ㆍJava
NAT 방식에는 여러가지가 있다.
Full Cone NAT = 내부에 있는 호스트들의 모든 요청은, 모두 같은 외부 ip, port로 맵된다. 더군다나
어떤 외부 호스트든 공인 IP가 맵된 패킷 보내기에 의해 내부 호스트로 패킷을 보낸다.
=>즉 목적지 가 바뀌어도 항상 같은 외부 ip,port로 맵된다는 의미, 이방식이면 UDP 홀펀칭이 가능하군. 중계서버든 다른 클라이언트든 그 ip,port로 udp 패킷이 전송될것이니.~
Restricted Cone = 목적지의 주소에 따라 NAT에 맵 되는 포트가 달라진다.
홀 펀칭을 위해서는 목적지의 IP만 동일시 하여 뚫어주면 목적지의 패킷을 받을 수 있다.=> 목적지 주소가 달라지면 외부 UDP ip,port가 달라진다는거네.
Port Restricted Cone = 목적지의 주소에 따라 NAT에 맵 되는 포트가 달라진다.
홀 펀칭을 위해서는 목적지의 IP와 포트를 동일시 하여 뚫어주어야만 목적지의 패킷을 받을 수 있다.
=> 목적지 의 주소(ip,port) 마다 열리는 외부 ip,port가 다르다. ㅡ.ㅡ; 난감.
Symmetric Cone = 목적지의 주소와 포트에 따라 NAT에 맵 되는 포트가 달라진다.
추가: 홀 펀칭을 위해서는 목적지의 IP만 동일시 하여 뚫어주면 목적지의 패킷을 받을 수 있다.
=> 흠 이거 같은경우는 공인 아이피 2개가 있어야 테스트가 가능하겠구나.
이러면 Full cone NAT 방식만 P2p 홀펀칭이 가능하다는 얘기인가.
공유기에 물려있는 Client 는 다음과 같은 방법으로 홀펀칭을 수행한다.
1. Client 는 게임 서버에 TCP로 접속을 한다.
2. Client 는 랑데뷰 게임서버에 UDP로 패킷을 보내고, Server는 Client의 외부 UDP 포트를 알아낸다.
3. Server는 알아낸 Client의 ip와 port를 다시 보내준다.
4. Client는 해당 port로 UDP Server Socket을 연다.
5. 다른 외부 ip 에서 이 클라이언트의 주소와 외부 port로 udp 패킷을 전송한다.
* 주의할점은 일정시간동안 dummy packet을 보내지 않으면 해당 port가 막혀버린다. 주기적으로 packet을 보내, Hole을 유지해야한다.
- 클라이언트에서 서버와 연결되면, 클라이언트는 본인이 연결된 내부 port 를 알게된다.
이 port로 udp server 를 bind 한다.
by 카니스(조성준)
Full Cone NAT = 내부에 있는 호스트들의 모든 요청은, 모두 같은 외부 ip, port로 맵된다. 더군다나
어떤 외부 호스트든 공인 IP가 맵된 패킷 보내기에 의해 내부 호스트로 패킷을 보낸다.
=>즉 목적지 가 바뀌어도 항상 같은 외부 ip,port로 맵된다는 의미, 이방식이면 UDP 홀펀칭이 가능하군. 중계서버든 다른 클라이언트든 그 ip,port로 udp 패킷이 전송될것이니.~
Restricted Cone = 목적지의 주소에 따라 NAT에 맵 되는 포트가 달라진다.
홀 펀칭을 위해서는 목적지의 IP만 동일시 하여 뚫어주면 목적지의 패킷을 받을 수 있다.=> 목적지 주소가 달라지면 외부 UDP ip,port가 달라진다는거네.
Port Restricted Cone = 목적지의 주소에 따라 NAT에 맵 되는 포트가 달라진다.
홀 펀칭을 위해서는 목적지의 IP와 포트를 동일시 하여 뚫어주어야만 목적지의 패킷을 받을 수 있다.
=> 목적지 의 주소(ip,port) 마다 열리는 외부 ip,port가 다르다. ㅡ.ㅡ; 난감.
Symmetric Cone = 목적지의 주소와 포트에 따라 NAT에 맵 되는 포트가 달라진다.
추가: 홀 펀칭을 위해서는 목적지의 IP만 동일시 하여 뚫어주면 목적지의 패킷을 받을 수 있다.
=> 흠 이거 같은경우는 공인 아이피 2개가 있어야 테스트가 가능하겠구나.
이러면 Full cone NAT 방식만 P2p 홀펀칭이 가능하다는 얘기인가.
공유기에 물려있는 Client 는 다음과 같은 방법으로 홀펀칭을 수행한다.
1. Client 는 게임 서버에 TCP로 접속을 한다.
2. Client 는 랑데뷰 게임서버에 UDP로 패킷을 보내고, Server는 Client의 외부 UDP 포트를 알아낸다.
3. Server는 알아낸 Client의 ip와 port를 다시 보내준다.
4. Client는 해당 port로 UDP Server Socket을 연다.
5. 다른 외부 ip 에서 이 클라이언트의 주소와 외부 port로 udp 패킷을 전송한다.
* 주의할점은 일정시간동안 dummy packet을 보내지 않으면 해당 port가 막혀버린다. 주기적으로 packet을 보내, Hole을 유지해야한다.
- 클라이언트에서 서버와 연결되면, 클라이언트는 본인이 연결된 내부 port 를 알게된다.
이 port로 udp server 를 bind 한다.
by 카니스(조성준)