HolePunching 관련해서 질문이 있습니다 제발 도와주십시오..ㅠㅠ

dhyoon1의 이미지


안녕하세요 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는 뭘로 잡아야되는지 잘 모르겠습니다..ㅠㅠ

도와주시면 사례도 해드리고 싶은 생각입니다

부탁드립니다..ㅠㅠ

dhyoon1의 이미지

상대방의 공인IP로(NAT) 접속을 시도한다고 했을때

NAT에선 연결요청을 기다리고 있는 socket 이 없을텐데 어떻게 접속을 할수가 있는건가요..?

사설IP로의 연결이야 클라이언트가 자신의 로컬호스트로 소켓을 열어 연결요청을 대기하고 있으니깐 이해가 가는데....

공인 IP로의 접속부분이 이해가 잘 안가네요..ㅠㅠ 인터넷은 충분히 찾아본거 같은데...너무 답답합니다ㅠㅠ

a287848의 이미지

처음부터 하시기 쉽지 않아 보이는데...

경험상 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.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.