Frage

Ich habe viele ähnliche Fragen gesehen und gelesen, und die entsprechenden Wikipedia-Artikel ( NAT-Traversal , STUN , TURN , TCP Lochen ), aber die überwältigende Menge an Informationen gefällt mir nicht wirklich helfen, mit meinem sehr einfachen Problem:

Ich schreibe eine P2P-Anwendung, und ich möchte zwei Benutzer meiner Anwendung hinter NAT der Lage sein, miteinander zu verbinden. Die Verbindung muss zuverlässig sein (vergleichbar mit TCP Zuverlässigkeit), so kann ich nicht nur auf UDP wechseln. Die Lösung sollte auf den heute üblichen Systemen ohne Neukonfiguration arbeiten. Wenn es hilft, kann die Lösung eine zuschaltbare 3rd-Party beinhaltet, solange sie die gesamten Daten zu Proxy muss nicht (zum Beispiel zu den Peers' externe (WAN) IP-Adressen erhalten).

Soweit ich weiß, meine einzige Möglichkeit ist es, eine „zuverlässige UDP“ Bibliothek verwenden + UDP Loch Stanzen . Gibt es eine (C / C ++) Bibliothek für das? Ich fand enet in a ähnliche Frage , aber es kümmert sich nur um die erste Hälfte der Lösung.

Sonst noch etwas? Dinge, die ich sehe:

  1. Teredo-Tunneling - erfordert Unterstützung vom Betriebssystem und / oder Benutzerkonfiguration
  2. UPnP Portweiterleitung - UPnP ist nicht vorhanden / aktiviert überall
  3. TCP Lochen experimentelle und nur Arbeit unter bestimmten Umständen zu sein scheint
  4. SCTP wird sogar weniger als IPv6 unterstützt. SCTP über UDP ist nur Phantasie zuverlässiger UDP (siehe oben)
  5. RUDP - fast kein Mainstream-Support
  6. Von dem, was ich von STUN, STUNT, TURN und ICE verstehen konnte, keiner von ihnen mir hier helfen würde.
War es hilfreich?

Lösung

ICE sammelt eine Liste von Kandidaten-IP / Port-Ziele, auf die verbinden. Jeder Peer sammelt diese, und dann jeder läuft eine Konnektivitätsprüfung auf jedem des Kandidaten in der Reihenfolge, bis entweder einen Scheck Pässe oder eine Überprüfung fehlschlägt.

Wenn Alice Bob versucht, eine Verbindung, bekommt sie irgendwie eine Liste der möglichen Wege - bestimmt durch Bob - sie Bob verbinden kann. ICE nennt diese Kandidaten. Bob könnte zum Beispiel sagen: „meine lokale Buchse des 192.168.1.1:1024/udp, meine externe NAT-Bindung (durch STUN gefunden) ist 196.25.1.1:4454/udp, und Sie können einen Medien Relais (a middlebox) bei 1,2 aufrufen .3.4: 6675 / udp“. Bob legt, dass in einem SDP-Paket (eine Beschreibung dieser verschiedenen Kandidaten) und sendet zu Alice, dass in irgendeiner Weise. (In SIP, der ursprüngliche Anwendungsfall für ICE, getragen von der SDP in einem SIP-INVITE / 200 / ACK-Austausches, Einstellung eine SIP-Sitzung auf.)

ICE ist steckbar, und Sie können die genaue Art / Anzahl der Kandidaten konfigurieren. Sie könnten einen direkten Link versuchen, gefolgt von einer STUN Server für eine Bindung (diese Schläge ein gefragt Loch in der NAT, und sagt Ihnen, die externe IP / Port dieses Loch, das Sie in Ihre Sitzungsbeschreibung setzen) und fallen zurück eine TURN Server Ihre Daten zu übermitteln.

Ein Nachteil ICE ist, dass Ihre Kollegen austauschen SDP Beschreibungen, die Sie können oder nicht wie. Ein weiterer Grund ist, dass TCP-Unterstützung ist immer noch in Entwurfsstadium , DIE oder möglicherweise kein Problem für Sie sein. [UPDATE: ICE ist jetzt offiziell RFC 6544 .]

Spiele oft UDP verwenden, da die alten Daten nutzlos ist. (Aus diesem Grund ist in der Regel RTP über UDP läuft.) Oft Einige P2P-Anwendungen Middle oder Netzwerke von Middleboxen verwenden.

IRC verwendet ein Netzwerk von Middle: IRC-Server bilden Netzwerke und Clients zu einem in der Nähe von Server verbinden. Nachrichten von einem Client zu einem anderen können über das Netzwerk von Servern reisen.

Failing all das, Sie einen Blick auf BitTorrent Architektur nehmen und sehen, wie sie das NAT-Problem umgehen. Wie CodeShadow in den Kommentaren unten weist darauf hin, setzt BitTorrent auf erreichbar Peers im Netzwerk: in gewisser Hinsicht einige Kollegen ein Netzwerk von Middle bilden. Wenn diese Middle als Relais wirken könnten, würden Sie einen IRC-ähnliche Architektur, sondern eine, die dynamisch aufgebaut wird.

Andere Tipps

Ich empfehle libjingle , wie es von einigen großen Video-Spiel verwendet wird, Unternehmen, die auf P2P-Netzwerk-Kommunikation stark angewiesen ist. (Sie über Steam gehört? Vavle verwendet auch libjingle finden Sie im " Peer-to-Peer-Netzwerke“Sitzung in der Seite: https://partner.steamgames.com/documentation/api )

Doch die immer arbeits Lösung wäre, einen Relay-Server verwenden. Da es keine „Standard“ Weg ist durch NAT zu gehen, sollten Sie diese Relay-Server-Option als Fall-Back-Strategie haben, wenn eine Verbindung immer zwischen beliebigen Peers etabliert werden muss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top