[GPG 5 글 6.5] P2P 연결에 대해서 질문이 있어서 글을 올립니다.

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

비회원

P2P 연결에 대해서 질문이 있어서 글을 올립니다.

Post by 비회원 »

저희는 P2P를 이용한 4:4 대전 게임을 만들고 있습니다.

초기에 각 피어들끼리 연결하는 부분에서 궁금한 점이 있어서 질문을 드리는데요

Player[0] -------연결------> Player[0] ~ Player[7]
Player[1] -------연결------> Player[0] ~ Player[7] (연결된 플레이어와는 접속시도를 하지 않음)
Player[2] -------연결------> Player[0] ~ Player[7] (연결된 플레이어와는 접속시도를 하지 않음)


이런식으로 연결을 진행하고 있는데 연결하는 부분에서 시간이 좀 걸리는거 같습니다.

혹시 다른 좋은 방법이 있나요 ?

맨땅에 해딩중인 신입에게 가르침 선사를.. ;ㅁ;
imays
Posts: 1044
Joined: 2003-02-18 10:29
Contact:

답변입니다.

Post by imays »

간단히 답하자면, "일단 P2P 홀펀칭을 시작하지 말고, 아직까지는 서버를 통해 릴레이 통신을 하고 있뜸" 상태로 시작한 후, 백그라운드로 P2P홀펀칭을 시도해서 성공하면 릴레이 통신을 중단하고 P2P 통신으로 전환하는 것입니다. 이렇게 하면 대기 시간 없이 바로 서로간 통신이 됩니다. (물론 처음 한동안은 진짜 P2P 주고받기가 아니라 서버를 통해 릴레이하지만, 프로그래머 관점에서는 어쨌거나 바로 P2P 통신이 된 것을 전제해서 개발할 수 있죠)

컨셉은 간단하지만, 몇 가지 주의할 점이 있습니다.

unreliable 메시지(UDP같은)의 경우 P2P홀펀칭이 백그라운드로 성공한 후에는 릴레이 통신을 중단하고 직접 P2P 통신을 하는 과정이 큰 문제는 되지 않습니다. 만드는 것도 쉽고요.

하지만 reliable 메시지의 경우는 그렇게 했다가는 send/ack 순서가 꼬여버리게 됩니다. 즉 받는 쪽에서는 일시적인 unreliable 상황이 발생하게 됩니다. reliable 통신을 위해 TCP를 쓰는 경우가 많은데 TCP에만 의존해서는 이 문제를 해결할 수 없습니다. 자체적인 reliability layer를 구축해야 합니다. 그것도 릴레이 서버와 P2P 클라이언트간의 receive window가 공유될 수 있게 해서 말이죠.

참고로, ProudNet( http://www.nettention.co.kr 윽 또 홍보다 -_-)은 이미 이렇게 만들어져 있습니다.
온라인 게임 서버 엔진 ProudNet
http://www.nettention.com
해키스트
Posts: 398
Joined: 2004-02-14 20:11
Location: N거시기
Contact:

Post by 해키스트 »

한 호스트당 tcp connection과 udp connection 두개를 사용해서 tcp 커넥션으로는 reliable data를 전송하고 udp connection은 unreliable data를 전송하는 것과, reliable udp, unreliable udp를 사용하는것의 차이를 알고 싶습니다^^
Quitters no win, winners no quit.
imays
Posts: 1044
Joined: 2003-02-18 10:29
Contact:

Post by imays »

해키스트 wrote:한 호스트당 tcp connection과 udp connection 두개를 사용해서 tcp 커넥션으로는 reliable data를 전송하고 udp connection은 unreliable data를 전송하는 것과, reliable udp, unreliable udp를 사용하는것의 차이를 알고 싶습니다^^
"구현 방법이 다르다"입니다.

ㅎㅎ 농담이고요. 각각의 장점으로 차이를 답할께요.

TCP: 신뢰성이 매우 높습니다. TCP는 표준 프로토콜이기 때문에 장치 호환성을 위한 전세계 개발자들의 적극적인 참여가 있습니다. 공유기만 봐도, TCP 연결이 성사되지 않으면 그 공유기 사업은 큰일납니다. TCP를 쓰면 '일단 표준이니까 맘 편하다'는 먹고 들어가는거죠. 아 물론, reliable udp layer를 만들어야 하는 머리아픈 일을 피할 수 있습니다.

UDP: 쌍방이 공유기 뒤에 있는 호스트의 경우 TCP로 홀펀칭 후 연결하는 트릭을 필요로 합니다. (Game Programming Gems 5 or 6에 이것을 설명하는 아티클이 있습니다) reliable UDP는 그 정도의 트릭까지는 필요없죠. 그리고 다른 호스트와의 많은 연결을 할 경우 socket layer에서의 TCP socket handle을 다수 둘 필요가 없습니다. 1개의 UDP 소켓으로 다 커버되니까요. (소켓을 다수 다룰 때의 난황 중 하나는 게임 클라이언트가 Windows 95/98에서 작동할 수 있어야 하는 경우죠. )그리고 위의 케이스(P2P 릴레이에서 직접 P2P통신으로 채널을 변경하기)의 경우 reliable UDP쪽이 더 채널 변경이 효율적으로 이루어집니다.
온라인 게임 서버 엔진 ProudNet
http://www.nettention.com
Post Reply