P2P 및 홀펀칭

홍석주·2025년 1월 14일
0

Kwitch

목록 보기
5/6

개요

이번엔 P2P에 대해서 알아보자.
P2P는 Peer-to-Peer의 약자로 클라이언트끼리 직접 연결해서 통신을 하는 방식을 말한다.

위키백과 P2P

일반적으로 알고있는 서버와 클라이언트의 개념 없이 모두가 동등한 계층의 노드들이 통신하는 것이 특징이다.

P2P 연결의 도전과제

P2P 연결을 위해선 연결하는 서로가 상대방의 연결 정보를 공유할 수 있어야 한다.
하지만 이를 알아내기는 쉽지 않은데 그걸 이해하기 위해선 NAT에 대해 먼저 알아야 한다.

NAT(Network Address Translation)이란?

현재도 우리는 IPv4를 사용하고 있는데, 32bit로 표현되는 IP 주소는 전 세계의 컴퓨터에 할당하기엔 턱없이 부족하다.
따라서 IPv6(128bit)같은 더 넓은 IP 주소가 만들어지기도 했지만 여전히 IPv4로 작동하는 기술이 많아 넘어가지 못하고 있다.

NAT은 이런 부족 현상을 해결하기 위해 생겨났다. 여러 대의 호스트가 하나의 공인 IP를 사용하여 인터넷을 접속한다.

NAT

일반적으로 생각해 봤을 때, A라는 호스트가 naver.com에 요청을 보낸다고 했을 때, 나갈 때는 네이버의 공인 IP 주소로 패킷을 전송하면 되므로 문제가 없을 것이다.
하지만 네이버에서 A라는 호스트의 공인 아이피를 알 수도 없고, 안다고 하더라도 A, B, C 중 특정할 수 없기 때문에 패킷이 나갈 순 있지만, 들어올 순 없다.

그래서 NAT Mapping Table을 사용해 이를 해결한다.

NAT Mapping Table

내부에서 전송되는 패킷을 공인 IP는 같지만, Port 번호를 다르게 할당해서 호스트를 구분짓는 것이다.

문제는 양쪽 다 NAT

위에선 나갈 때 외부의 공인 IP와 Port 번호를 특정지을 수 있다.
하지만 P2P 연결에서 보통 서로가 NAT을 사용하여 사설 IP를 사용하고 있기 때문에 양측 다 공인 IP와 Port 번호를 특정지을 수 없어 연결 시작이 불가능하다.

"홀펀칭" 기술

홀 펀칭

(C: Client, G: Gateway)
이를 위해 홀 펀칭 기술이 사용된다.
공인 IP를 사용하는 서버를 하나 두고 각자가 자신의 공인 IP와 Port를 보내 서로의 연결 정보를 서버가 전달해주는 것이다.

이때, 서버를 STUN 서버라고 한다.

STUN Server 설정

예전에 크위치가 P2P 연결을 할 당시엔 ICE Server로 구글의 STUN Server를 이용하기도 했다.

문제는 홀 펀칭 과정에서 문제가 발생할 수 있는데, 아까 나왔듯이 NAT Mapping Table에는 목적지의 IP와 Port 번호도 정해져 있다.
하지만 이는 STUN Server의 연결 정보이고, 돌아오는 패킷은 출발지가 P2P 연결을 하려는 상대방에 연결 정보가 담겨있기 때문에 라우터가 다른 연결 정보에 대해 허용하지 않는다면 홀펀칭 기술은 실패하게 된다.

따라서 이때는 공인 IP를 가지는 서버를 하나 만들어 놓고, 서로의 패킷을 중계하는 Relay Server를 통해 연결을 유지할 수 밖에 없다.

이때의 Relay Server는 TURN Server라고 한다.

WebRTC같은 프로토콜에선 STUN Server를 이용해 홀펀칭을 먼저 시도하고, 이를 실패하면 TURN Server를 사용해 통신하게 된다.

profile
이거이 니 정주영이고 이병철이야

0개의 댓글

관련 채용 정보