GPG 및 구글링, 네이버 검색 등을 몇날몇일 훓어봤으나,
만족할정도로 상세히 설명되어있는 자료를 찾을수가 없어서 (혹은 찾지 못해서) 이렇게 질문드립니다.
홀펀칭은 서버에 접속해있는 Client들중, 하나 또는 다수의 Client가 (서로 다른) NAT 환경 예하에 있을 때에 UDP 환경일 경우 해당 Client끼리는 연결이 되지 않으므로
(이 부분에 대해서도 자세히 모르겠습니다. 공유기 또는 라우터가 내부적으로 매핑 테이블을 만든다는데, 그 부분에대해 확실히 이해를 못했습니다)
중계 서버를 통해 서로의 Connection 정보를 받아와서 그를 사용해 서로 접속을 한다는 내용으로 대충 이해를 했었으나, 간략한 시뮬레이션 프로그램을 작성하여 테스트해본 결과 (SOCKADDR_IN 안에 있는 Connection 정보를 무식하게 memcpy해서 보냈습니다) 서버와 완전 동일한 Connection정보를 사용해서 서로에게 Packet을 보냄에도 불구하고 왠지 받지 못합니다.
서버에서 전달한 Connection정보는 확실히 받아온 것을 확인했습니다.
살려주세요..
쉽게 얻을 수 있는 Hole Punching 정보보다 좀더 구체적인 정보를 원합니다 -_ㅜ
UDP Hole Punching 관련 질문
Moderator: 류광
-
- Posts: 9
- Joined: 2007-11-02 15:57
-
- Posts: 63
- Joined: 2006-05-01 17:04
어떤 점이 명확하지 않다는 건지가 명확하지 않네요. (말이 좀 꼬이네요 -ㅅ-)
NAT 동작은 RFC에 명확하게 명시되어 있습니다.
http://rfc.net/rfc3489.html
http://rfc.net/rfc2663.html
http://rfc.net/rfc3027.html
NAT 동작은 RFC에 명확하게 명시되어 있습니다.
http://rfc.net/rfc3489.html
http://rfc.net/rfc2663.html
http://rfc.net/rfc3027.html
-
- Posts: 9
- Joined: 2007-11-02 15:57
그 이후로 여러 자료를 탐독하여, TCP 환경에서 Router가 어떤식으로 LAN환경 내부와 외부의 통신을 지원해주는지 깨닳았습니다 ( 내부에서 보낸 패킷을 어떤식으로 변환하고, 매핑하여 목적지로 보내주고, 목적지에서의 답신 패킷이 나중에 그 매핑을 어떻게 활용해 다시 해당 내부 터미널로 돌아가는지 )
UDP 환경에서도 그와 유사하게 (혹은 동일하게) 동작한다고 가정을 할 때, 중계 서버를 통해 서로의 Address 를 받아온 후, 서로를 향해 연결될때까지 계속 UDP패킷을 쏴주어 서로가 서로에 대한 매핑정보를 구성하기를 기대하는게 Hole Punching이 아닐까 싶습니다
맞나요? ^_^;;?
UDP 환경에서도 그와 유사하게 (혹은 동일하게) 동작한다고 가정을 할 때, 중계 서버를 통해 서로의 Address 를 받아온 후, 서로를 향해 연결될때까지 계속 UDP패킷을 쏴주어 서로가 서로에 대한 매핑정보를 구성하기를 기대하는게 Hole Punching이 아닐까 싶습니다
맞나요? ^_^;;?
Re: UDP Hole Punching 관련 질문
GPG 및 구글링, 네이버 검색 등을 몇날몇일 ㅤㅎㅜㅀ어봤으나,
만족할정도로 상세히 설명되어있는 자료를 찾을수가 없어서 (혹은 찾지 못해서) 이렇게 질문드립니다.
홀펀칭은 서버에 접속해있는 Client들중, 하나 또는 다수의 Client가 (서로 다른) NAT 환경 예하에 있을 때에 UDP 환경일 경우 해당 Client끼리는 연결이 되지 않으므로
(이 부분에 대해서도 자세히 모르겠습니다. 공유기 또는 라우터가 내부적으로 매핑 테이블을 만든다는데, 그 부분에대해 확실히 이해를 못했습니다)
1. 당연한 애기입니다라고 밖에는.. A클라이언트는 B클라이언트와 연결한 적이 없습니다. 그런데 A와 B를 연결해야 합니다.
만약 A가 공유기(NAT)장비를 사용중입니다. IP를 192.168.1.2라고 합시다. 그리고 A의 공유기는 211.11.11.11 이라고 하죠. 이때 보통 A의 주소(IP + Port)를 "내부 주소"라고
통칭합니다. 공유기 주소는 "외부 주소"라고들 하죠.
자, 이제 B입장에서 봅시다. B가 연결해야 하는 건 A의 공유기가 아니라 A입니다. 뭔가 감이 오시나요?
이런 다른 두개의 주소를 가진 A를 연결해야 할때 사용하는 방법이 홀펀칭입니다. TCP, UDP둘다 가능합니다. 다만 TCP 특성상 UDP로 하시는게 좋습니다.
2. NAT 장비가 동작하는 방식입니다. 우선 약자를 검색해 보세요. NAT장비나 PAT라는 장비는 원래 적은 IP로 여러대의 호스트를 외부와 연결하게 해 준다던지(공유기),
해커등 공격을 막는 용도(방화벽)로 개발된 장비입니다. 라우터하고는 관련 없어요. 이 장비들로 인해 홀펀칭이 중요시된 이유는 일반 사용자가 공유기라는 장비를 통해
인터넷에 접속되어 있을 확률이 80%이상이기 때문입니다.
이 장비에 매핑 테이블이 있는 이유는 자기에게 셋팅된 외부주소에 비해 더 많은 사용자가 사용할 수 있기때문입니다.
NAT라는 기법은 외부주소가 1개고 10명의 사용자이면 처음 사용을 요청한 사용자에게 외부 주소를 주고 나머지 사용자는 대기해야 합니다. PAT라는 건 port로 구별하는 방식인데
하나의 IP는 65535까지 포트가 할당 가능하므로(short니까) 이론상 하나의 주소에 65535까지 외부 주소를 할당해 줄 수 있습니다. 네트웍 쪽에는 두 개를 구별해서 애기하는데 우리는
통합해서 NAT라고들 하죠.
3. 확인할 사항중계 서버를 통해 서로의 Connection 정보를 받아와서 그를 사용해 서로 접속을 한다는 내용으로 대충 이해를 했었으나, 간략한 시뮬레이션 프로그램을 작성하여 테스트해본 결과 (SOCKADDR_IN 안에 있는 Connection 정보를 무식하게 memcpy해서 보냈습니다) 서버와 완전 동일한 Connection정보를 사용해서 서로에게 Packet을 보냄에도 불구하고 왠지 받지 못합니다.
서버에서 전달한 Connection정보는 확실히 받아온 것을 확인했습니다.
(1) 호스트에서 UDP 바인딩 하셨나요?
(2) 호스트의 장비가 symmetric장비 아닌가요?
(3) A 호스트와 서버간에 뚫어논 포트(211.11.11.11:100), B호스트와 서버간 뚫어논 포트(222.222.222.222:500)
이러하다면 B는 211.11.11.11:100으로 쏴야 하고 A는 222.222.222.222:500으로 보내야 합니다.