[서버] 홀펀칭

2015. 9. 13. 23:21프로그래밍/서버

728x90
728x90

서론

P2P에서 Peer들 간의 통신을 하기 위해서 서로의 IP, Port에 패킷을 전송하면 된다.

But! 우리는 방화벽의 NAT(Network Address Translation)을 거치게 된다.

NAT안에서는 통신이 되지만 서로 다른 NAT에서는 그 안에만 존재하는 가상 IP기 때문에 당연히 통신이 되지 않는다.


NAT의 종류도 여러가지다.

Full Cone NAT, Restricted Cone NAT, Port Restricted Con NAT, Symmetric NAT


홀펀칭

1. 사설(Private) IP로 패킷을 전송해본다.

2. 안되면 공인(Public) IP로 패킷을 전송해본다.

3. 안되면 Relay Server로 패킷을 전송해 전송을 맡긴다.


(릴레이 서버는 패킷을 중계해주는 서버이다. 클라이언트로 받은 패킷을 다른 클라이언트로 전송만 해주는 역할을 담당한다.)


사전에 IP 알아내기

1. 클라이언트 gethostname으로 사설 or 공인 IP의 주소를 저장한다.

2. NAT 환경이 아닌 게임서버 혹은 스턴서버에서 Dummy Packet을 보낸다.

3. 서버는 받은 패킷의 IP, PORT로 IP, PORT를 담아 클라이언트에게 보낸다.

4. 클라이언트는 사설IP와 공인IP를 모두 저장한다.

5. 파티가 이뤄지면 서버는 각각의 Peer에게 서로의 사설, 공인 IP를 전송한다.


참고

http://www.gamedevforever.com/47

728x90
반응형

'프로그래밍 > 서버' 카테고리의 다른 글

[Network] inet_addr error. convert inet_pton  (0) 2019.01.14
[TCP/IP] 네트워크 스택 이해하기  (0) 2016.01.04
[참고] cgcii 홈페이지. 열심히 읽어보자!  (0) 2015.10.26
[서버] nagle 알고리즘  (0) 2015.09.13
[서버] UDP 패킷 손실에 대하여  (0) 2015.09.12
[서버] TTL  (0) 2015.09.12
TCP Max Packet  (0) 2015.09.11