P2P,MSN 접속방식.

oranke의 이미지

일반적으로
공유기를 통해서 두 peer 간에 연결이 맺어 있을때,
한 peer 에서 다른 쪽 peer 의 IP 를 어떻게 알수 있나요?

예)
A 회사 scott 라는 사람과 B회사의 tiger 라는 사람이 있을때,
A회사와 B회사는 각각 인터넷 공유기를 통해서
자기 회사 사람들에게 인터넷을 할수 있게 하였다고 치면,

scott 의 ip 는 192.168.xx.xx 가 될것이고,
tiger 의 ip 도 192.168.xx.xx 가 될것 입니다.

그렇다면 scott 에서 tiger 로 어떻게 접속을 할수 있나여?

msn 메신저 같은 경우 위와 같은 경우라도 '파일전송'이 되는것
을 보면 분명 찾아 갈수 있는 뭔가가 있는거 같은데요..

어떤 방법으로 찾아 가는지요?

Prentice의 이미지

192.*.*.* 대역은 사설망을 위한 대역이고, 외부와 연결을 할 때에는 다른 IP 주소가 사용되기 마련입니다. Linux Network Administrators' Guide등을 읽어보시면 이해하실 수 있으실 것입니다.

위키에 보시면 번역본도 있습니다.

oranke의 이미지

음..어렵군요..

외부 네트웍에서 192.168.xx.xx 로 되는 가상IP 를 어떤식으로
찾아 올까 하는 문제인데엽..

실제로 리얼IP 는 공유기 한대만 있고
공유기에서 가상으로 연결된
192.168.xx.xx 이란 것을
MSN과 같은 P2P 프로그램에선 어떻게 찾아 오나요?

Prentice의 이미지

한 집에 유선전화기가 단 한대만 있고, 이 유선전화기에 연결된 무선 단말기가 세대가 있다고 합시다. 모든 집이 다 이렇게 되어 있습니다.

무선 단말기에서 다른 집으로 전화를 걸었더니 무선 단말기로 받았습니다. 현재 전화기간의 의사 소통은 전화번호만으로 이루어지고, "몇번째 무선 단말기"인지 전화번호와는 관련 없습니다. 둘다 "첫번째 무선 단말기"더라도 전화는 되죠.

즉 192.168.*.* 라는 주소는 조회에 사용되지 않습니다. Router가 무슨 일을 하는지, gateway라는 물건은 무엇인지를 조금 읽어보시면 이해하시는 데에 도움이 되지 않을까 생각합니다.

저는 원리는 모르겠습니다만 이 점을 간과하고 계신 것 같아서 짧게나마 글을 써봅니다.

raymundo의 이미지

oranke 님의 질문은,
"상대방의 IP가 210.***.***.*** 라 하더라도, 실제로는 그 주소는 공유기에 부여된 거고 그 너머에 컴퓨터가 세 대(예를 들어)가 있는데 그 중 어느 컴퓨터인지 어떻게 알고 연결을 하겠느냐"
는 말씀 같습니다.

당연히, 이런 경우 세 대 중 어느 컴퓨터인지 알 수 없고, 접속할 수 없습니다. :-)

예를 들어 집 컴퓨터 세 대 중 하나(A라고 하죠)에 리눅스를 깔고 FTP서버로 쓴다고 하면, 외부에서 ftp 210.***.***.*** 로 연결을 해도 그 요청 패킷은 공유기까지만 도착할 뿐이죠. 공유기가 FTP서버가 아니니 접속은 불가능합니다.

하지만 이런 경우를 위해서 공유기에는 포트포워딩 기능이 있죠. 특정 포트로 들어갈 요청은 특정 컴퓨터로 넘겨주라는 설정을 할 수 있고, 이 경우 21번 포트를 A컴퓨터(192.198.1.10이라면)으로 넘겨 주게 설정을 하면 됩니다. 이 경우, A만 FTP서버로 쓸 수 있고, B나 C는 쓸 수 없죠.

MSN의 경우는 P2P라고는 하지만, "MSN메신저 로그온"을 할 때 컴퓨터 쪽에서 MSN사이트로 접속을 먼저 하기 때문에 세 컴퓨터 다 동시에 사용할 수 있는 거고요..

근데 파일 전송의 경우는 좀 애매하긴 한게, A쪽에서 B로 파일을 보내면, 실제로는 B가 A에 TCP접속을 따로 하나 만들어서 가져오는 걸로 알고 있습니다. (제가 잘못 알고 있을 수도...) 그래서 제 경우 예전에 모뎀 자체에 라우터+DHCP서버 기능이 있는 모뎀을 쓸 경우는 파일 전송용 포트를 포워딩시켜줄 수가 없어서 제 쪽에서 파일을 보내는 것을 할 수가 없었는데 (상대방 컴에서 보낸 요청이 내 공유기를 넘어오지 못해서), IP공유기를 사니까 그것도 해결되더군요. 공유기에 물려 있는 다른 컴에서도 파일 전송이 가능하고... 이것은 어떻게 하는 건지 저도 잘 모르겠네요.

제 글에서 잘못된 부분에 대한 지적이나 보충 설명은 아래 분이 설명해 주실 겁니다. ^^;;

좋은 하루 되세요!

kslee80의 이미지

msn 파일 전송에 사용하는 포트는 정해져 있구요....68?? 번부터였던거 같은데
기억이 잘 안 나는군요.
그리고 그와는 별도로 1863 번으로는 msn 서버와 연결해서 메시지가 왔다갔다 합니다.

한쪽에서 파일 전송을 할때, 이 1863번 포트로 port 번호를 담은 특정 커맨드가
날라가고...그걸 공유기 단에서 인식하는 방식으로 msn 파일 전송을 지원할 겁니다.

실제로 현재 판매되는 IP 공유기들이 이 방식을 사용할지는 잘 모르겠네요..
단지, 똑같은 원리로 동작하던 커널 모듈이 있었죠...
공식 커널에는 들어있지 않았었구요...(요즘은 모르겠군요)
linuxrouter 프로젝트의 결과물에 해당 모듈을 넣어서 사용했던 기억이 나네요.

zienie의 이미지

oranke wrote:

A 회사 scott 라는 사람과 B회사의 tiger 라는 사람이 있을때,
A회사와 B회사는 각각 인터넷 공유기를 통해서
자기 회사 사람들에게 인터넷을 할수 있게 하였다고 치면,

scott 의 ip 는 192.168.xx.xx 가 될것이고,
tiger 의 ip 도 192.168.xx.xx 가 될것 입니다.

그렇다면 scott 에서 tiger 로 어떻게 접속을 할수 있나여?

msn 메신저 같은 경우 위와 같은 경우라도 '파일전송'이 되는것
을 보면 분명 찾아 갈수 있는 뭔가가 있는거 같은데요..

어떤 방법으로 찾아 가는지요?

바로 윗분이 말씀 하신대로 일반적으로는 찾아갈 방법이 없습니다.
불가능하죠 ^^

근데 파일전송이 어떻게 되느냐......
분명 둘중 하나는 서버가 되어야 할텐데 말이죠~

이를 해결하기 위해서 통상 P2P 프로그램에서는 relay라는
개념을 사용합니다.

위의 경우를 예로 들자면 일단 tiger 가 server socket을 만들고
Scott 에게 접속 하라는 메시지를 보냅니다.
일정 시간동안 Scott 가 접속을 못하면 이번엔 Scott 가
server socket 을 만들고 Tiger 에게 접속 요청을 합니다.
이것마저도 실패하면 Server 에게 realy 를 담당할 server
생성을 요청합니다.
그러면 Server 측에서 realy 를 담당할 프로세스를 하나 생성하고
scott , tiger 모두 client 가 되어서 realy server 에 접속하여
파일전송을 수행하게 됩니다. realy server 는 말그대로
패킷은 tiger -> realy -> scott 이거나 혹은 반대 방향으로
진행이 되겠죠..... :P

그리고, 또 하나.....
공유기의 port forwarding 기능을 사용하면 가능합니다.
공유기 셋팅중에 특정 포트로 오는 접속을
특정 Mac Address 를 가진 내부 네트웍으로 forwarding
해 주도록 설정할 수 있습니다.
ISP 에서 막지만 않았다면 이와 같은 방식을 사용해서
공유기 물려서 쓰는 PC 에서도 FTP, WEB 서버를 돌릴 수 있습니다.
저는 동작 케이블 넷을 쓰는데 막아뒀더군요 :?

##########################################################
넘어지는건 아직 괜찮다.
하지만 넘어질때마다 무언가를 주워서 일어나자.

zelon의 이미지

100% 모든 공유기가 되는 것은 아니나 udp 를 이용하면 방법이 있긴 합니다.

아래 도표에서 공유기를 share 라고 하겠습니다. ^^

A - shareA - internet - shareB - B

위와 같은 경우

A 는 서버에 간단한 udp 를 쏩니다. 그런데 이 udp 가 재미있는게 connectless 라서 shareA 는 일정 시간동안 이 udp 가 나간 구멍을 열어놓게 됩니다. 그리고 그 구멍으로 들어오는 것은 A 에게 전달해주죠. 직접 해보시면, A 에서 외부 서버에 udp echo 를 요청하면 잘 돌아옵니다(앞에서 밝혔다시피 대부분의(!) 공유기가 그렇습니다)

이 원리를 이용해보면 대부분의 경우에서 udp 를 이용한 p2p 가 가능해집니다.

즉, A 가 shareA 를 통해서 특정 서버에 접근하고, B 가 shareB 를 통해서 그 서버에 접근해서 shareA 의 udp 의 주소(앞에서 구멍이라고 언급했던;; ) 를 알려줍니다. 그래서 B 가 shareA 의 udp 주소에 요청을 보내면 shareA 는 그 요청을 A 에 전달해줍니다.

단, shareA 는 특정 시간 이상 udp 를 쓰지 않으면 그 구멍을 닫아버린다는 것을 명심해야 합니다.

그리고 이 방법이 안 통할 수가 있는데, 그건 공유기가 이 기능을 지원해주지 않거나, 방화벽 문제겠죠 ^^;; 참고로 저희 한국에서는 스타크래프트 열풍 때문에 거의 모든 공유기가 이 기능을 지원하고, 중국 공유기는 지원해주지 않는 경우도 꽤 있답니다. 이 때는 앞의 분이 말씀하신 relay server 를 고려해야합니다. 하지만 이런 방법을 이용한다면 서버의 부담은 많이 줄어들겠죠.

-----------------------------------------------------------------------
GPL 오픈소스 윈도우용 이미지 뷰어 ZViewer - http://zviewer.wimy.com
블로그 : http://blog.wimy.com

댓글 달기

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