NAT(network address translation)뒤에 있는 사설 네트워크를 사용하는 두 client끼리 직접 통신을 할 수 있게 만들어 주는 것을 말한다.
이는 NAT뒤에 있지 않는 서버를 통해 서로 응답하는 방법으로도 해결할 수 있지만, 결국 서버를 거쳐서 보내야하기 때문에 속도가 느려질 수 있다.
Hole Punching이 이루워지는 과정은 다음과 같다.
만약 연결이 되지 않았으며, 포트를 바꾸는 등의 여러 시도를 해도 연결이 되지 않았을 때에는 중간에 TURN 서버를 둔 다음 TURN 서버가 중계할 수 있게 만들어 연결하는 방법을 사용한다.
TURN 서버의 경우 NAT 뒤에 있는 사설 네트워크를 사용하지 않음으로 이를 해결할 수 있지만, 결국 사설 TURN 서버를 거쳐가야 하기 때문에 속도가 현저히 낮아진다.
모든 NAT가 Hole Punching이 가능한 것은 아니다.
<aside> 💡
NAT은 다음과 같이 크게 4가지 방식이 있다.
가장 간단한 NAT방식으로 private IP/port가 매핑되면, 누구든 간에 그 public/port로 접근 시, host에게 통신을 시도할 수 있는 방식이다.
Full Cone NAT에서 제한이 걸린 방식으로 기존에 통신하던 Service의 IP가 아니라면 Host에게로 패킷이 도달하지 않는다. 이때 다른 port까지는 허용한다.
Restricted Cone NAT에서 제한이 더 걸린 방식으로 기존에 통신하던 Service의 IP뿐 아니라 port까지도 같지 않으면 Host에게로 패킷이 도달하지 않는다.
Host가 통신하는 대상에 따라 각각 다른 매핑정보를 가져가는 방식으로 매핑 정보가 계속해서 변한다고 말할 수 있다.
</aside>
이 4가지 방식중 Symmetric NAT 방식은 통신하는 대상에 따라 다른 public IP, port를 부여함으로 STUN서버로는 통신할 수 없고 TURN서버를 사용해야 통신할 수 있다.