2 minute read

홀펀칭, 그 신박한 세계

  • 이전 시간에(6. P2P와 Relay 방식) 홀펀칭 기술이 필요하게 된 이유에 대해 이야기하며 마쳤다.
  • 주소가 부족한 IPv4 체계 하에서, 모든 컴퓨터에 IP 주소를 부여하지 않고 게이트웨이 역할을 하는 것들만 public IP를 부여하고, 그 밑에 클라이언트에는 게이트웨이가 할당한 가짜 IP(private IP)를 할당하게 된다.

Mapping Table

  • 이 상황에서 패킷이 게이트웨이 안에서 바깥으로(예를 들어 네이버로, 네이버의 서버 또한 고정 IP) 보내지는 것은 가능하지만, 요청을 받은 네이버는 이게 어디서 온 것인지 알 수가 없기 때문에 보낼 수가 없다. 바깥에서 안으로 들어갈 수는 없다.

  • 예를 들어, 내 컴퓨터의 IP가 10.2.4.6이고 게이트웨이의 고정IP가 24.1.25.6라고 쳤을 때 내가 인터넷 브라우저에서 네이버에 접속하면 패킷이 Naver IP를 향해 나갈 것이다.

  • 이때, 게이트웨이는 나가는 패킷이 10.2.4.6의 뭐 10000번 포트로 나갔다고 할 때 그 포트번호를 게이트웨이의 256번 포트라고 바인딩해서 출발지로 적고, naver의 public IP를 목적지로 적는다. 이 상황에 대한 Mapping Table을 만들어준다.

  • PORT 출발지 목적지
    256 10.2.4.6 31.4.22.4(NAVER)
  • 요청받은 네이버가 응답을 해줘야하는데, 네이버는 당연히 10.2.4.6dml 10000번 포트에서 이게 온 것인지 뭔지 알 수가 없다. 하지만 게이트웨이의 256번 포트에서 온 것이니까 여기다가 응답을 해주면, 게이트웨이는 아까 만든 mapping table을 보고 출발지로 응답을 보내주는 것이다.

이 상황에서 P2P가 안 되는 이유

NAT(Network Address Translation)

정의

  • IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록(Port Forwarding)하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술
    • 클라이언트에서 출발한 패킷이, 프라이빗 IP를 숨기고 특정 포트에 바인딩한 상태에서 보내준다.
    • 게이트웨이, 라우터, 스위치, 공유기 등 이용

홀펀칭

  • UDP를 기반으로 하는 기술
  • 예전에는 무공비급처럼 비밀리에 공유되는 고급 기술이었지만 이제는 더이상 비밀이 아닌 공개된 기술. 오픈소스도 있고.

  • 네트워크에서 구멍을 뚫는다는 의미는 NAT라는 네트워크 장비를 두고 있어서 직접적인 TCP/UDP 통신이 불가능한 Peer들 간에 직접적인 통신이 가능할 수 있도록 (IP, PORT)를 확보하는 것을 의미
  • 홀펀칭이 필요한 이유는 P2P 기반의 게임이나 통신 방식에서는 클라이언트끼리 직접 연결을 맺고 통신을 해야하는데, 참여하는 클라이언트가 NAT 하위에 존재한다면 직접 연결이 불가능하기 때문이다. 요즘같이 유무선 공유기가 일반화가 된 환경에서는 P2P 게임이나 서비를 제공하려는 경우에는 필수적인 기술이다.
  • NAT 외부의 Peer는 먼저 NAT의 하위의 장비로 통신을 시작한다.
  • Peer끼리 통신을 할 때는 그 사이에 ISP도 있고 라우터도 있고 공유기도 있기 때문에 내 밖의 공유 IP 환경에 대해서 알 수 없다. 어떤 것들을 거쳐서 가는지 알 수 없음.
    • 대체로 처음 바인딩한 그 주소의 포트로 보내면 나한테 패킷 보낸 상대에서 대체로 전달되긴 하지만 게이트웨이 같은 놈들, NAT 장비 맘이기 때문에 안 그럴 수도 있음. 그게 제대로 갔으면 그게 홀이 뚫린거라고 한다.
      • 처음에는 고정된 public IP를 갖는 STUN 서버에 쏴보고,
      • 안뚫리면은 중간에 고정된 IP를 갖는 릴레이 서버를 하나두고 패킷을 주고 받는 수 밖에 없다. 이것을 TURN 서버라고 한다.

출처