Programowanie aplikacji P2P

Piszę niestandardowy program p2p, który działa na porcie 4900. W niektórych przypadkach, gdy osoba znajduje się za routerem, port ten nie jest dostępny z Internetu.

Czy istnieje automatyczny sposób umożliwienia dostępu do portu z Internetu. Nie jestem pewien, jak działają inne aplikacje p2p.

Czy ktoś może rzucić na to trochę światła?

Author: Nalaka526, 2011-12-15

5 answers

Łączność P2P w skrócie. Załóżmy, że mówimy tu o UDP. Poniższe kroki można również zastosować do TCP z pewnymi dostosowaniami.

  1. Wylicz wszystkie swoje lokalne adresy IP (zwykle tylko 1). Utwórz Gniazdo UDP na podanym numerze portu* * dla każdego adaptera z adresem IP.

  2. Dla każdego gniazda utworzonego w kroku 1 Skontaktuj się z serwerem STUN lub TURN z tym samym gniazdem, aby odkryć swój zewnętrzny adres IP i dowiedzieć się, co mapuje wewnętrzny numer portu poza NAT (nie zawsze jest to ta sama wartość portu). Oznacza to, że twój lokalny adres 192.168.1.2: 4900 może być 128.11.12.13: 8888 dla świata zewnętrznego. Niektóre NAT nie zawsze używają mapowania tego samego portu, gdy używają tego samego portu lokalnego do innych adresów IP. TURN dostarczy Ci również "adres przekaźnika". Możesz również użyć UPNP, aby uzyskać adres mapowany portu bezpośrednio z routera, Jeśli obsługuje ten protokół.

  3. Poprzez usługę rendezvous (SIP, XMPP, instant message, Web service, email, cups with strings), opublikować listę kandydatów adresowych do Serwisu lub wysłać powiadomienie do innego klienta, który mówi: "Hej, chcę się z Tobą połączyć". Ta wiadomość zawiera wszystkie "kandydatów na adresy" (pary ip i portów) zebrane w krokach 1 i 2.

  4. Zdalny klient, po otrzymaniu zaproszenia do połączenia, wykonuje również Krok 1 i 2 powyżej. Następnie wysyła swoją listę kandydatów przez ten sam kanał, który otrzymał listę kandydatów zapraszającego on

  5. Krok dziurkowania. Obaj klienci, zaczynają wysyłać wiadomości testowe przez UDP do kandydatów na adresy drugiej strony i nasłuchują tych samych wiadomości na ich końcu. Za każdym razem, gdy wiadomość zostanie odebrana, odpisz na adres, z którego przyszła. W końcu klienci odkryją, że mają parę adresów, które mogą niezawodnie wysyłać również datagramy. Zazwyczaj jeden punkt końcowy podejmuje ostateczną decyzję, z którą parą adresów (gniazdkami) ma się komunikować, a protokołem ułatwia ten punkt końcowy informowanie drugiego punktu końcowego o tej decyzji.

* * - zwykle najlepiej nie polegać na dobrze znanym porcie dla klientów P2P. Ponieważ dwóch klientów korzystających z tego samego NAT lub zapory sieciowej prawdopodobnie nie będzie w stanie korzystać z oprogramowania w tym samym czasie.

Oto krótkie podsumowanie niektórych technologii do zbadania.

STUN - jest prostym serwerem i protokołem dla klientów za trasą NAT / aby dowiedzieć się jakie są ich zewnętrzne mapowania IP i portów są.

TURN jest rozszerzeniem do STUN, ale obsługuje przekaźniki dla scenariuszy połączeń P2P, w których zapory sieciowe i Nat uniemożliwiają bezpośrednie połączenia.

ICE jest zestawem kroków, za pomocą których ogłuszenie i obrót są używane do konfigurowania połączenia P2P. ICE jest formalnym protokołem dla kroków 1-5 powyżej. Dwa doskonałe zestawy ślizgawek na lodzie są tutaj i tutaj .

WebRTC {[30] } jest wariantem standardu ICE, a także biblioteką referencyjną dla twórz sesje P2P za pomocą STUN and TURN.

UPNP + Internet Gateway Device Protocol - niektóre routery obsługują ten protokół dla hostów, aby automatycznie uzyskać mapowanie portów.

Libnice jest otwartoźródłową biblioteką C dla Linuksa (i może działać na windows), która implementuje ICE.

Libjingle {[30] } jest kolejną implementacją ICE (W C++) od Google. Dla Systemów Windows i Linux.

PJNATH jest biblioteką wewnątrz PJSIP pakietu kodowania biblioteki. Jest to dobra implementacja stosu lodu (kod C) i została przeniesiona na wiele platform. (Windows, Linux, Mac, iOS, Symbian, a wkrótce Android).

I na koniec, mam dla Ciebie rażącą wtyczkę do użycia mojej bazy kodu serwera STUN .

 96
Author: selbie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-28 21:42:47

Istnieją rozwiązania w niektórych przypadkach, patrz UPnP: https://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal

Mój router domowy na to pozwala, zasadniczo NAT może być skonfigurowany automatycznie przez odpowiednie żądanie z komputera.

Nie liczyłbym na to, aby zapewnić dużą poprawę dostępności, ponieważ nie tak wiele routerów obsługuje to i ma włączone.

EDIT: @ David zasugerował to więc pytanie do biblioteki. NET dla UPnP: czy istnieje Biblioteka UPnP dla. Net (C# lub VB.NET)?

 4
Author: jv42,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:28

Użyłbym WebRTC jako open source framework dla takiej aplikacji.

Oficjalna Strona

W rzeczywistości jest to projekt open source, który obsługuje wszystkie niezbędne technologie peer-to-peer po wyjęciu z pudełka:

  • ICE and STUN (NAT traversal)
  • DTLS i SRTP (bezpieczeństwo)
  • AVPF dla jakości przesyłania strumieniowego.
 3
Author: ankitr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-14 06:58:01

Może to być trochę bardziej skomplikowane niż to, czego szukasz, ale TCP dziurkowanie jest techniką, która powinna działać. http://en.wikipedia.org/wiki/TCP_hole_punching

Alternatywnie, UPnP działa świetnie dla routerów / zapór sieciowych, które go obsługują.

 1
Author: Matthew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-15 16:38:48

Masz inną opcję, która jest Nat Port Mapping Protocol (NAT-PMP) NAT-PMP jest szeroko stosowany przez aplikacje VoIP, takie jak Skype czy klienty P2P BitTorrent.

 0
Author: loretoparisi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-16 20:31:39