사설 IP를 가진 일반 컴퓨터와 외부의 공인 IP를 가진 서버와의 UDP 통신상의 고민입니다.

dingkyu의 이미지

위 그림과 같은 상황이 있습니다.

서버는 UDP통신만 지원하고 하나의 UDP소켓을 열어놓고 입력을 대기 중입니다.
각 노드들은 먼저 서버로 특정 데이터를 전송해서 (노드들은 서버의 주소를 미리 알고 있습니다.)자신의 존재를 서버에게 알립니다. 그 다음 서버는 위 그림에서 어느 한 노드가 데이터를 서버로 전송하면, 서버는 그 데이터를 받아 나머지 노드들에게 전달해야 합니다.

서버는 각 노드들의 IP 주소를 보관하고 있다가 데이터를 보낸 IP를 제외하고 나머지 리스트의 IP 주소들에게 받은 데이터를 다시 전송하도록 하면 되겠다 싶었는데, 제가 공부한 바로는 UDP통신은 상대방의 IP address 밖에 모르는 것으로 알고 있습니다. 즉, 위 상황에서는 제가 알기로는 3개의 노드들이 전부 서버에 접속하게 되면 서버에서는 전부 동일한 IP를 사용하는 노드로 인식할 것이라는 겁니다.

이럴 경우 어떻게 서버는 저 안쪽의 각 노드들을 어떻게 구분해서 전달받은 데이터를 전달할 수 있을까요 ?

네트워크 프로그래밍은 처음이라 아직 모르는 개념이 많습니다. 한수 가르쳐 주시면 고맙겠습니다.

File attachments: 
첨부파일 크기
Image icon 2011-03-02_1940.png46.66 KB
ktd2004의 이미지

공유기의 port forwarding 설정에 대해서 확인해보시면 어떨까요?

dingkyu의 이미지

공유기의 포트 포워딩은 지금 개발하려는 취지에서 많이 벗어나서 고려하기 어렵네요.
프로그램으로 이 난관을 헤쳐나가야 하거든요..

고민이 많아 고민인 애늙은이 입니다.

mog422의 이미지

아이피 말고도 source port와 destination port로 구분이 됩니다. 따라서 nat 환경에서 글쓴이가 원하시는 통신은 아무런 문제가 없습니다.

dingkyu의 이미지

동일한 IP를 받는다 하더라도 source port, destination port 를 이용하면 정확히 해당 노드로 데이터를 전송할 수 있다는 말씀이신거죠 ?
감사합니다. 이쪽으로 좀더 공부를 해 봐야 겠네요..

고민이 많아 고민인 애늙은이 입니다.

라스코니의 이미지

데이터를 보낸 쪽의 ip 와 destination port, source port 등을 알 수 있습니다.
즉 만약 세군데에서 데이터를 보냈다면 세군데 모두의 ip 등을 알 수 있습니다.

Hyun의 이미지

인터넷 전화기가 저런 환경에서 양방향 통신을 한다고 어디서 본 적이 있습니다. 자세히는 모르지만 노드가 주기적으로 서버에 패킷을 보내어 공유기의 포트 변환 테이블을 업데이트 한다고 본거 같은데...

dingkyu의 이미지

말씀해 주신건 아마도 홀 펀칭(Hole Punching)인거 같은데 UDP로 NAT로 둘러쌓인 클라이언트 끼리 서버없이 서로 통신하려는데 사용한다 하더군요.
말씀하신것도 아마 끝판왕쯤 되서 저를 기다리고 있을꺼 같습니다. ^^;

고민이 많아 고민인 애늙은이 입니다.

rexos33의 이미지

UDT는 일반적으로 고속/효율적인 UDP 통신을 지원하는 네트워크 프레임워크입니다. UDP를 이용하지만 거의 TCP 처럼 사용할 수 있는 장점도 있습니다. 랑데뷰 커넥션도 지원하니 도움이 될 듯....

UDP-based Data Transfer (UDT) Library - version 4
URL: http://udt.sf.net

모두들 행복하세요~

dingkyu의 이미지

알려주신 거 공부해 보고 적극 활용해 보도록 하겠습니다.

ps : 말씀해 주신 UDT를 구글 선생님께 가르쳐달라 하니까 해군 특수부대 이야기를 가장 많이 해주시네요...^^;;;

고민이 많아 고민인 애늙은이 입니다.

익명 사용자의 이미지

세션이 맺어진 이후에도 udp 세션이 끊어지지 않도록 주기적으로 패킷만 오고가면 크게 문제가 없을 것 같습니다.

홀펀칭도 공인 IP 를 가진 relay 서버를 두고 NAT 안의 두 서버간에 연결이 되는 세션만 찾아주는 것만 하지
실제 데이터는 edge 단끼리만 주고 받으며, 이 경우에도 주기적으로 패킷을 주고 받아 NAT 에서 라우팅이 지워지지
않도록 하지 않나요 ?

NAT 안의 서버와 통신하는 문제는 tcp 나 udp 나 크게 차이는 없는 것 같습니다.
제가 예전에 테스트를 했던 경험을 보면 tcp 와 udp 에서 세션을 유지하는 것은 큰 이슈가 되지 않았습니다.

그리고, 실제로 검색을 해보시면 udp 로 tcp의 특성을 구현하는 프로젝트들도 상당히 많습니다.
이 프로젝트들의 이슈 역시 세션 유지가 아닌 데이터 재조합 및 데이터의 신뢰성 체크 부분이죠...

글이 좀 이상한데... 홀펀칭까지 가는건 p2p 에서나 쓰는 것이니 제외하시면 될 것 같고...
세션유지를 위해 더미 패킷을 얼마나 자주 보낼 것인가를 고민하셔야 될 것 같습니다.
그리고, 세션이 끊겼을 때는 어떤 식으로 복구를 할지도.. ^^;;;
그리고, 이 edge 가 지금 연결이 된 건지 끊긴건지 체크하는 것도 고민하셔야 될 것 같습니다.
tcp 야 서버단에서 바로 알 수 있지만... udp 는.. ;;;;

declspec의 이미지

NAT 테이블이 포트번호를 가지고 알아서 포워딩 해줄것이므로 노드가 서버에게 데이터를 전송하는 통신은 문제가 없지만
서버가 나머지 노드들에게 어떻게 접근이 가능할까요?

한 노드가 서버에게 UDP 로 연결해서 패킷을 보냈을때 서버는
해당 노드의 공인IP 주소와 해당 노드의 소스PORT 밖에 모릅니다

이 소스 PORT 번호를 이용해서 서버는 자신에게 패킷을보낸 해당 단말과만
통신할수 있을 뿐이죠.

나머지 단말들과 통신을 하기위해서는 서버가 나머지 단말들을 위한 UDP 소켓을
열어야 하는데 그러기 위한 정보가 없습니다

즉 나머지 단말들은 UDP 서버가 되어야 하기때문에 포트번호에 의한 IP 포워딩이
의미가 없죠. 따라서 먼저 NAT 테이블상에서 특정 포트번호에 대한 IP 포워딩을 미리 지정해주고
최초에 서버에 연락하는 단말이 이 포트번호들을 알려줘야 할것같습니다

자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.