[Develope]/Network

홀 펀칭(Hole Punching)

하늘을닮은호수M 2008. 8. 11. 11:33
반응형

홀 펀칭(Hole Punching)이란??

공유기 라는 녀석이 라우터의 특성도 함께 가지고 있어 Routing Table을 작성하기 위해 P2P 통신을 목적으로, 사전에 상대방과 패킷을 주고받고 하여 각자의 공유기에 Routing Table을 작성하는 것을 [홀 펀칭]이라고 한다.

    Full Cone
    Port Restricted Cone
    Restricted Cone
    Symmetric Cone

Full Cone NAT
내부에 있는 호스트들의 모든 요청은, 모두 같은 외부 ip, port로 맵된다. 더군다나
어떤 외부 호스트든 공인 IP가 맵된 패킷 보내기에 의해 내부 호스트로 패킷을 보낸다.


Restricted Cone
목적지의 주소에 따라 NAT에 맵 되는 포트가 달라진다.
홀 펀칭을 위해서는 목적지의 IP만 동일시 하여 뚫어주면 목적지의 패킷을 받을 수 있다.

Port Restricted Cone
목적지의 주소에 따라 NAT에 맵 되는 포트가 달라진다.
홀 펀칭을 위해서는 목적지의 IP와 포트를 동일시 하여 뚫어주어야만
목적지의 패킷을 받을 수 있다.

Symmetric Cone
목적지의 주소와 포트에 따라 NAT에 맵 되는 포트가 달라진다.

P2P로의 1:1 연결에서는 적어도 한 쪽이 Symmetric Cone NAT 아니거나 공인 아이피를 소유하고 있는 Peer 여야 한다.

===========================================================================================================================

홀펀칭(Hole Punching)방식은 아래와 같다.

1. Full Cone
 -> PC에서 UDP 데이터를 공유기 밖으로 보낼때 해당 PC의 IP와 포트 정보를 공유기가 기억하고 공유기의 포트와 매핑을 해줌
     공유기의 해당 포트로 데이터가 오면 출발지 IP와 포트 정보를 상관하지 않고 해당 PC에 포워딩을 해줌

2. Restricted Cone
 -> PC에서 UDP 데이터를 공유기 밖으로 보낼때 해당 PC의 IP와 포트 정보, 목적지 IP를 기억하고 공유기의 포트와 매핑을 해줌
     공유기의 해당 포트로 데이터가 오면 출발지 IP 정보를 비교하여 공유기에 기록된 목적지IP와 같으면 해당 PC에 포워딩을 해줌

3. Port Restricted Cone.
 -> PC에서 UDP 데이터를 공유기 밖으로 보낼때 해당 PC의 IP와 포트 정보, 목적지 IP, Port를 기억하고 공유기의 포트와 매핑을 해줌
     공유기의 해당 포트로 데이터가 오면 출발지 IP 정보를 비교하여 공유기에 기록된 목적지IP, Port가 같으면 해당 PC에 포워딩을 해줌

4. Symmetric NAT
 -> PC에서 UDP 데이터를 공유기 밖으로 보낼때 해당 PC의 IP와 포트 정보, 목적지 IP, Port를 기억하고 공유기의 포트와 매핑을 해줌, 만약 목적지 IP나 Port번호가 봐뀌면 새로운 포트로 매핑해줌
     공유기의 해당 포트로 데이터가 오면 출발지 IP 정보를 비교하여 공유기에 기록된 목적지IP, Port가 같으면 해당 PC에 포워딩을 해줌

UDP 서버 ( 랑데뷰 피어 )로 클라이언트가 UDP 패킷을 전송
서버에 클라이언트의 IP와 Port정보가 남는다.
이 정보를 바탕으로 현재 서버에 연결된 소켓에 접속할 IP와 포트 정보만
상대방 IP와 포트 정보를 넣고 상호간에 데이터 전송 시도하면 Cone 방식은 UDP 홀펀칭이 성공한다.
100%가 아닐까 싶다...(나의 소망)

간혹 Symmetric NAT방식의 공유기가 있는데
이공유기 같은 경우에는 같은 소켓을 써도 UDP 데이터를 외부로 쏠때 목적지 IP나 포트 정보가 변경되면 공유기에서는 새로운 포트를 할당해 준다. 고로 나가는것은 되나 들어오는것이 안됨..
한쪽이 Symmetric NAT방식이라면 상관 없는데 양쪽이 Symmetric NAT방식이라면 낭패;
UDP 릴레이 서버를 거치던지 다른 방법을 써야 한다.

한쪽이 Symmetric NAT방식이라면 반대쪽에서는 Symmetric NAT쪽의 데이터를 받을수 있다.
이 데이터를 받을때 IP와 포트 번호를 알아 낼수있다.
알아낸 IP와 포트번호로 데이터 전송하면 됨
고로 통신이 가능함.

반응형

'[Develope] > Network' 카테고리의 다른 글

FD_SETSIZE 의 지정  (0) 2011.11.24
ERRNO listing for Linux RH6.2, 2.2.19  (0) 2009.03.04
TCP State Diagram  (0) 2008.07.28
posix proactor library test  (0) 2008.07.01
posix proactor library  (0) 2008.07.01