UDP 홀펀칭을 할 때에...

3권에서 새로 도입된 네트웍 및 멀티플레이어 프로그로그래밍 섹션을 위한 게시판입니다.

Moderator: 류광

Locked
비회원

UDP 홀펀칭을 할 때에...

Post by 비회원 »

NAT환경에 있는 컴퓨터에게 보내려면 외부아이피와 외부포트를 알면 보낼 수 있는 것으로 압니다.

A - 192.168.0.2 (외부-221.32.42.44)
B - 211.42.55.62

로 가정하면

A의 외부아이피, 외부포트만 알고 있다면 굳이 A->B , B->A로 보내지 않고,

B->A로 보내는게 가능한가요?

가능하다면 라우팅 테이블에 B의 IP/PORT가 기억된다는게 무의미할텐데,

어느것이 진짜인가요?

단순히 A의 외부아이피,외부포트만 아는 것으로는 패킷을 보낼 수 없는 것인가요?
해키스트
Posts: 398
Joined: 2004-02-14 20:11
Location: N거시기
Contact:

Post by 해키스트 »

NAT의 종류에 따라 가능할수도, 불가능할수도 있습니다.


이 질문에 관한 논의는 매우 활발하게 이루어졌었으며, GPG내에 많은 스레드들이 있으니 NAT라는 검색어로 검색해보시길 추천합니다.
Quitters no win, winners no quit.
비회원

Post by 비회원 »

해키스트 wrote:NAT의 종류에 따라 가능할수도, 불가능할수도 있습니다.


이 질문에 관한 논의는 매우 활발하게 이루어졌었으며, GPG내에 많은 스레드들이 있으니 NAT라는 검색어로 검색해보시길 추천합니다.
그런데 이것은 안되는지요.

A - NAT(외부-211.54.54.23,내부-192.168.2.3)
B - 외부(222.53.23.55)

A는 Port를 1010으로 바인드 합니다.

그럼 B는 미리 1010바인드한다는 것을 알고
211.54.54.23의 1010으로 패킷을 보내면 보내지나요?
보내지면 홀펀칭이 필요없을 듯 한데..

물론 A는 SNAT가 아니라고 가정합니다.
구장생
Posts: 28
Joined: 2006-02-14 18:07
Location: 게임회사

음.. 이 부분은..

Post by 구장생 »

로컬의 1010 을 열었다고 해서 공유기의 1010 이 열린다는 보장이 없습니다.

그렇기 때문에 그렇게 해결하기 어려운 겁니다.

물론 어떤 공유기의 경우 자기가 1010 포트를 열었을 경우 공인아이피의 1010포트와 연결해주는 경우도

있습니다만. 아닌 경우가 더 많은 걸로 알고 있습니다.

그렇기 때문에 udp 홀 펀칭을 할 경우 공인아이피와 포트 둘다 보는 것입니다.
비회원

Re: 음.. 이 부분은..

Post by 비회원 »

구장생 wrote:로컬의 1010 을 열었다고 해서 공유기의 1010 이 열린다는 보장이 없습니다.

그렇기 때문에 그렇게 해결하기 어려운 겁니다.

물론 어떤 공유기의 경우 자기가 1010 포트를 열었을 경우 공인아이피의 1010포트와 연결해주는 경우도

있습니다만. 아닌 경우가 더 많은 걸로 알고 있습니다.

그렇기 때문에 udp 홀 펀칭을 할 경우 공인아이피와 포트 둘다 보는 것입니다.
님이 말씀하신 것은 1010 포트를 열어도 공유기를 통해 빠져나갈 때 다른 포트로 나갈 수 있다는 말씀이신데

만약 가정하에 특정 공유기가 60000포트로만 연다고 한다면,

홀펀칭으로 서로 UDP패킷을 막 쏴주지 않아도 바로 60000포트로 접속한다면 접속이 가능한가요?
구장생
Posts: 28
Joined: 2006-02-14 18:07
Location: 게임회사

그건 또 그렇다고 할 수 없습니다.

Post by 구장생 »

우선 저녁에 조금 자느라 답변이 조금 늦었군요. -..-;

192.168.0.3(211.63.45.xx) 이런 놈이 있다고 치고 서버는 200.200.200.200 이라 그냥 칩시다.
(그냥 친겁니다..)

서버는 공인아이피라 포트 하나만 열어두면 아무데에서나 온 거 다 받습니다.

근데 우리의 192.168.0.3 이 자슥은 공유기라는게 하나 붙어 있습니다.

그래서 그런지는 몰라도 자기가 먼저 200.200.200.200 으로 udp 를 먼저 쏴주지 않으면

200.200.200.200 에서 온 것을 공유기에서 흘리지 않는다는 보장이 없군요. 실제로 흘리는 경우가 더 많습니다.
(흘린다는 건 그냥 무시한다는 겁니다. 물론 공유기를 사용하지 않는다면 직접 다이렉트로 받겠지요.)

이 것만 유의하면 굳이 다른 건 유의해야 할 사항이 없습니다.

공인아이피의 포트가 사설아이피의 포트와 매칭이 된다는 조건이라면 그것만큼 좋은 조건이 없겠죠.

그냥 포트 1000 으로 소켓이 만들어 져 있을거라고 생각하고(절대 이렇지는 않다는 것을 실험해보면 압니다..)

서로 다른 공유기에 있는 사람들 중 한 명이 공인아이피로 딴 사람에게 처음 보냈다고 해봅시다.

그럼 공유기가 " 어 이넘은 내가 보내지도 않았는데 왜 왔지.. 이거 쓸데없는 패킷이잖아.. " 라고 생각하며

무시해버립니다. 그래서 어떤 송신에 대해 응답을 받고 싶어도 못받는 현상이 처음에는 일어나겠죠..

하지만 응답같은거 무시하고 서로 막 날리게 되면(더미패킷) 자기도 그 쪽으로 보냈고

그 쪽도 내 쪽으로 보낸 적이 있기 때문에 서로 통신이 가능해져 버리는 겁니다.

즉 정리하자면 UDP 홀 펀칭의 첫번째 요소는 자기의 공인아이피와 포트를 상대방에 알리는 것이며..

두번째 요소는 서로가 정말 통신을 하기 전에 연결통로를 뚫어주기 위해 서로의 공인아이피에 주구장창

더미패킷을 날려주는데에 있다고 보겠습니다.

그 외에도 신경쓰다보면 한 두가지 더 신경쓸게 있습니다만 그런 것은 구현하실때 개념의 문제이므로

이만 생략하겠습니다. 그럼 저는 다시 자러..~~;;

사실 제가 적은 글이 정확하지 않을수도 있습니다. -..-;
해키스트
Posts: 398
Joined: 2004-02-14 20:11
Location: N거시기
Contact:

Re: 음.. 이 부분은..

Post by 해키스트 »

비회원 wrote: 님이 말씀하신 것은 1010 포트를 열어도 공유기를 통해 빠져나갈 때 다른 포트로 나갈 수 있다는 말씀이신데

만약 가정하에 특정 공유기가 60000포트로만 연다고 한다면,

홀펀칭으로 서로 UDP패킷을 막 쏴주지 않아도 바로 60000포트로 접속한다면 접속이 가능한가요?
일단 '접속' 이라는 단어는 UDP에선 그다지 중요한 대목이 아니니 넘어가도록 하구요.

그럴리는 없겠지만, 만약 비회원님 가정대로 해당 공유기가 공유기 내부 호스트의 모든 메시지를 60000번 하나에다 매핑한다 가정한다면,

Full Cone 방식의 경우에는 메시지를 받을 수 있습니다.

Restricted 이하 방식은 내부 호스트가 메시지를 보낸 적이 있을 경우에만 받을 수 있습니다.

저라면 이런 불필요하고 위험한 가정을 통해 불안한 코드를 생산하는것보다, 제가 전에 이 포럼에서 추천드린 Restricted NAT를 두개 회사에서 구입하셔서 간단한 UDP 메시지 테스터를 제작하신 뒤, 여러 케이스를 테스트해보시는걸 추천드리고 싶습니다.
Quitters no win, winners no quit.
asirion
Posts: 17
Joined: 2005-06-09 14:04
Location: kog

Post by asirion »

안녕하세요~! 해키스트님~ 공유기 구입할때 공유기의 NAT Type을 알 수 있나요?

작년 여름쯤에 P2P, NAT, RelayServer작업할때에..공유기의 NAT Type을 알 수 없어서,

하나 하나 테스트해서 분류 했었던 경험이 있습니다.

Restricted / Port Restricted cone 방식의 공유기를 구하고 있는데요..
( 테스트를 통해서 분류해놓은 녀석이 있긴 하지만... 테스트를 통한 거라..정확하지가 않아서요 )

NAT Type을 알아 볼 수 있는 방법이 있으면 좀 알려 주세요.

아니면 혹시 가지고 계신것중 Restricted 또는 Port Restricted cone NAT 공유기의 모델명좀 가르쳐 주시면 감사하겠습니다.
( 테스트를 해보니 Restricted 또는 Port Restricted cone였다는거 말구요... )
해키스트
Posts: 398
Joined: 2004-02-14 20:11
Location: N거시기
Contact:

Post by 해키스트 »

asirion wrote:안녕하세요~! 해키스트님~ 공유기 구입할때 공유기의 NAT Type을 알 수 있나요?

작년 여름쯤에 P2P, NAT, RelayServer작업할때에..공유기의 NAT Type을 알 수 없어서,

하나 하나 테스트해서 분류 했었던 경험이 있습니다.

Restricted / Port Restricted cone 방식의 공유기를 구하고 있는데요..
( 테스트를 통해서 분류해놓은 녀석이 있긴 하지만... 테스트를 통한 거라..정확하지가 않아서요 )

NAT Type을 알아 볼 수 있는 방법이 있으면 좀 알려 주세요.

아니면 혹시 가지고 계신것중 Restricted 또는 Port Restricted cone NAT 공유기의 모델명좀 가르쳐 주시면 감사하겠습니다.
( 테스트를 해보니 Restricted 또는 Port Restricted cone였다는거 말구요... )
안녕하세요. 해키스트입니다.
음 구입전에 NAT타입을 알 수 있는 모델은 없었던걸로 기억합니다. 공유기 박스에 '이 공유기는 XBOX/PS2지원!' 이정도만 적혀있기때문이죠-_-(그러고보니 저 말이 안써있으면 Restricted일까요;; ㅋㅋ 잘 모르겠네요)

제조사에 모델의 NAT타입을 물어본적도 있습니다만, 그쪽 기술진도 그렇게 자세한건 잘 모르더군요. 다만 엑스박스 플스2 네트웍이 된다 안된다 정도만 아셨던걸로 기억합니다.

그냥 테스트 해보는게 장땡인듯 싶습니다-_-

http://gpgstudy.com/forum/viewtopic.php?t=9224
이건 제가 전에 쓴 글입니다.
실제 저 NAT와 회사 방화벽으로 전 실험했습니다.
Quitters no win, winners no quit.
imays
Posts: 1044
Joined: 2003-02-18 10:29
Contact:

Post by imays »

연락주시겠어요? 제가 좋은 솔루션 하나 소개해드리겠습니다. -_-V
imays골뱅이hitel.net
온라인 게임 서버 엔진 ProudNet
http://www.nettention.com
imays
Posts: 1044
Joined: 2003-02-18 10:29
Contact:

Post by imays »

일단 A의 외부 IP, PORT를 안다고 가정해서, B->A로 보내는게 가능한 공유기도 있고, 가능하지 않은 공유기도 있습니다.

일단 A의 외부 IP, PORT를 안다는 것은 NAT의 ROUTE TABLE에 이미 등록됐다는 뜻입니다.
온라인 게임 서버 엔진 ProudNet
http://www.nettention.com
trackback:

트랙백

Post by trackback: »

oooooxo's me2day: 시스의 생각 UDP 홀펀칭을 할 때에… / Nat기반 P2P 프로그래밍 / NAT 타입 / iPhone4 - 아이폰4 에서의 화상통신 문제 마지막 글이 특히 흥미롭다 현실과 바로 닿아있다보니..
Locked