6.클라이언트간 P2P 통신의 개요

클라이언트간 통신 또는 peer-to-peer 네트워킹(이하 P2P 통신)은 서버를 경유하지 않고 클라이언트 호스트끼리 직접 통신을 하는 것을 일컫습니다. P2P 통신은 다음과 같은 경우에 유용하게 쓰입니다.

그림 6-1소규모 멀티플레이 게임에서는 P2P 통신을 활용하는 것이 권장됩니다. 특히 FPS 게임처럼 통신량이 많은 게임일수록요. (사진은 소아암환자를 위한 기능성 게임 Re-mission 스크린샷)

ProudNet의 P2P 통신은 홀펀칭 기술과 강력한 P2P relay 기능을 갖추고 있습니다. 그렇기 때문에 개발자 입장에서는 항상 P2P 통신이 성사되고 있다는 전제하에 간편하게 개발을 진행할 수 있습니다.

1.1 ProudNet의 P2P 통신 성능 을 참고하십시오.

http://www.nettention.com/ko/ppn.aspx

ProudNet에서 클라이언트간 P2P 통신은 메시지 단위로 이루어집니다. 1개의 메시지는 1회의 RMI 호출(4. Remote Method Invocation (원격 메서드 호출) 참고) 에 대응합니다.

ProudNet의 클라이언트간 통신에서는 reliable, unreliable 통신이 모두 가능합니다. (3. ProudNet의 프로토콜 종류 참고)

클라이언트간 P2P 연결을 위해서는 먼저 서버에서 클라이언트간 P2P 그룹을 맺어줘야 합니다. 클라이언트는 자신과 같은 P2P 그룹에 속한 클라이언트와만 P2P 통신이 가능합니다.

클라이언트간 P2P 그룹을 서버에서 맺어주면 클라이언트끼리는 일단 서버를 통해 P2P relay 통신을 하게 됩니다. 그 동안에 클라이언트간 P2P 홀펀칭을 백그라운드로 진행합니다. 만약 P2P 홀펀칭이 성공하게 되면 그때부터 클라이언트간 통신은 서버를 경유하지 않고 직접 이루어지게 됩니다. 이러한 특징 때문에, ProudNet에서는 P2P 그룹을 맺거나 변경한 즉시 클라이언트간 메시지 송수신이 가능합니다. 그리고 P2P 그룹을 맺자마자 클라이언트간 통신을 시작하면 서버에서 수 초 동안 서버측 통신량이 일시적으로 약간 증가하게 됩니다. 이는 호스트간 홀펀칭 기능이 작용하기 때문입니다.

그림 6-2P2P 통신 시작후의 내부 진행

홀펀칭된 클라이언트끼리의 P2P 통신은 UDP와 ProudNet 자체 개발된 Reliable UDP로 이뤄집니다. 그러나 홀펀칭이 성공하기 전까지는 UDP 또는 TCP를 통해 P2P relay를 하게 됩니다.

클라이언트에서 P2P 통신을 위해 사용하는 UDP 포트는 서버와 연결할 때 사용하는 UDP 포트와 동일합니다.