HolePunching 관련해서 질문이 있습니다 제발 도와주십시오..ㅠㅠ
글쓴이: dhyoon1 / 작성시간: 화, 2013/10/01 - 10:47오전
안녕하세요 TCP HolePunching 개발관련하여 도움을 요청드립니다 제발 도와주세요 ㅠㅠ
프로젝트특성상 클라이언트간의 안정적인 파일송수신이 주 목적이기 때문에 UDP보다는 TCP 방식을 선택하였습니다.
클라이언트가 각자 다른 네트워크망에 존재한다고 가정하고....
클라이언트1 <-------> NAT <-------> [서버] <--------> NAT <---------> 클라이언트2
이렇게 구성되어있다고 할때요 서버는 각 클라이언트의 사설 IP, 공인IP(public IP) 를 갖고 있으며 클라이언트1과 2가 P2P연결 요청시
서버는 각 클라이언트에게 상대편 클라이언트의 사설IP, 공인IP 를 가르쳐줍니다.
그럼 이제
1. 각 클라이언트는 12168번 포트(임시로 서로 약속한 포트넘버) 로 소켓을 생성하여 외부의 연결요청을 대기하고 있고
2. 각 클라이언트는 일정시간동안 상대방의 사설IP, 12168번 포트로 접속을 시도합니다
3. 일정시간동안 2번작업이 실패하였다면 이제 상대방클라이언트의 공인IP 로 접속을 시도합니다.
이렇게 순서를 구성하여 코딩을 하고있는데 순서가 이게 맞는건가요?
그리고 3번에서 상대방 클라이언트의 공인IP로 접속을 시도할때 PORT는 뭘로 잡아야되는지 잘 모르겠습니다..ㅠㅠ
도와주시면 사례도 해드리고 싶은 생각입니다
부탁드립니다..ㅠㅠ
Forums:
그리고 추가로 궁금한게 있는데요..
상대방의 공인IP로(NAT) 접속을 시도한다고 했을때
NAT에선 연결요청을 기다리고 있는 socket 이 없을텐데 어떻게 접속을 할수가 있는건가요..?
사설IP로의 연결이야 클라이언트가 자신의 로컬호스트로 소켓을 열어 연결요청을 대기하고 있으니깐 이해가 가는데....
공인 IP로의 접속부분이 이해가 잘 안가네요..ㅠㅠ 인터넷은 충분히 찾아본거 같은데...너무 답답합니다ㅠㅠ
jingle 이나 pjsip 같은 라이브러리를 참고해보심이 어떤지
처음부터 하시기 쉽지 않아 보이는데...
경험상 jingle library 나 pjsip 같은 라이브러리를 참고해보심이 어떤지 합니다.
그 라이브러리들만 공부해서 개발해도 충분히 좋은 경험일 겁니다.
질문 하시는 내용을 보고 판단해 보건데 밑바닥 부터 시작하기 쉽지 않은 분야 입니다.
개발하는 이유가 그냥 개인적으로 "hole punching 을 해봤다" 라면 모르겠으나
프로젝트 수준으로 하는 거라면 open fire 나 spark 같은 ice 응용프로그램을 한번 써보고 감을 잡아보세요. (wireshark 으로 packet 을 잡아보는 것도 좋겠죠)
그럴싸하게 만드려면 infra 차원에서 접근해야 하는 분야 입니다.
예를 들면 ICE server + Account server 정도는 있어야 합니다.
그래서 두개의 host 가 접근 시도를 할 수 있으니깐요.
일반적으로 개발하면
1. Bosh 같은 protocol을 사용하여 account server 와 synchronous 통신을 한다.
(이때 client alive 등을 검사)
2. client A 가 client B와 ice connection 을 시도한다. (결국 이 메시지는 account server 가 전달해 주어야 합니다.)
3. client A/B 가 ice connection 을 한다. (UPnP IGD/STUN->TURN 등)
정도 순이 되겠네요.
메신져에 응용되는 분야이니 그렇게 시작해보시는 것도 좋을 듯합니다.
참고로 TCP 연결은 UDP 연결보다 성공률이 떨어집니다.
Dig it.
댓글 달기