Wie funktioniert Peer-to-Peer über das Internet?

17914
Pacerier

Soweit ich weiß, gibt es keine Möglichkeit, ein Paket von außerhalb des Netzwerks an einen Computer in einem lokalen Netzwerk zu senden, es sei denn, wir kennen den Routing-Mechanismus des Routers.

Angenommen, wir haben ein Setup, das folgendermaßen aussieht:

  1. Computer-A, IP 192.168.1.2 (Standardgateway 192.168.1.1)

  2. Computer-B, IP 192.168.1.3 (Standardgateway 192.168.1.1)

  3. Router-C, IP 192.168.1.1 (externe IP 1.1.1.1)

  4. Router-D (externe IP 2.2.2.2)

Computer-A, Computer-B und Router-C gehören zu demselben lokalen Netzwerk. Router-D möchte Daten an Computer-A senden, kann dies jedoch nicht ohne Router-C.

Router-C leitet jetzt Pakete an Computer-A weiter, wenn der Zielport 1000 ist, und leitet Pakete an Computer-B weiter, wenn der Zielport 2000 ist. Aber das einzige Gerät, das diesen Routing-Mechanismus kennt , ist Router-C selbst! Nicht einmal Computer-A oder Computer-B wissen davon Bescheid, oder?

Router-D kann also ein Paket an Computer-A senden, wenn er über Port 1000 ein Paket an Router-C sendet. Wie kann Router-D jedoch wissen, dass er Pakete über Port 1000 sendet, und nicht Port 1001?

Wie können Peer-to-Peer-Programme wie Bittorrent dieses Problem lösen? Die einzige Lösung, die ich mir vorstellen kann, ist, dass Router-D das Paket über alle Ports an Router-C sendet, sodass es an Computer-A weitergeleitet wird. Aber gibt es eine bessere Lösung?

13

3 Antworten auf die Frage

6
Synetech

Ihre Verwirrung beruht auf falschen Annahmen.

Das einzige Gerät, das diesen Routing-Mechanismus kennt, ist sicherlich Router-C selbst! Nicht einmal Computer-A oder Computer-B wissen davon Bescheid, oder?

Was, warum? Dann wurde der Router so konfiguriert, dass er diese Ports an diese IPs weiterleitet? Sie müssen den P2P-Client so einrichten, dass er einen bestimmten Port verwendet, und dann den Router entsprechend einrichten.

Aber wie soll Router-D wissen, dass er Pakete über Port 1000 sendet, und nicht Port 1001?

Weil Sie den P2P-Client so konfigurieren, dass er einen bestimmten Port verwendet (Standard oder Nicht-Standard für dieses Protokoll).

Die einzige Lösung, die ich mir vorstellen kann, ist, dass Router-D das Paket über alle Ports an Router-C sendet, sodass es an Computer-A weitergeleitet wird. Aber gibt es eine bessere Lösung?

Es ist viel einfacher als das. Wenn der Client eine Verbindung zu einem Peer herstellt, gibt er an, welchen Port er verwenden möchte, sodass der Peer die Daten an diesen Port sendet.

Hmm, aber Bittorrent ändert das Verhalten des Routers nicht richtig? Da einige Routing-Mechanismen dynamisch gewesen sein könnten, wie in superuser.com/a/187190/78897 gezeigt, wie kann Computer-A davon erfahren?

Der Client hat keinen direkten Einfluss auf den Router, der Router kann jedoch so konfiguriert / intelligent sein, dass er sich an das Verhalten des Clients anpasst. Sie können UPnP sowohl im Router als auch im Client aktivieren, um die Verbindung automatisch zu konfigurieren. Die meisten Router verfügen über Stateful-Inspection-Funktionen als Teil ihres Portweiterleitungsmechanismus .

Zusammenfassend bedeutet dies, dass eine Verbindung dynamisch an einem zufälligen Port hergestellt werden kann und der Router den Überblick über die Vorgänge behält, anstatt alles als zufällige, bedeutungslose Verbindungen zu betrachten. Auf diese Weise kann eine Verbindung nach Bedarf weitergeleitet werden, da es sich beispielsweise um eine Antwort auf diese andere gerade erfolgte Verbindung handelt .

Das Problem tritt auf, wenn Sie mehrere Systeme verwenden, die dasselbe Programm verwenden. Wenn mehrere Systeme an denselben Router angeschlossen sind, die gleiche IP-Adresse verwenden und dynamische Ports verwendet werden, wird dies schnell unüberschaubar. Selbst bei Stateful Inspection ist es schwierig oder sogar unmöglich, die korrekte Funktionsweise zu gewährleisten. In diesem Fall müssen statische Ports (Standard oder anderweitig) verwendet werden.


Wenn Sie ein Programm wie SmartSniff oder TCPView verwenden, um Ihre Verbindungen zu überwachen, werden Sie feststellen, dass die P2P-Verbindungen normalerweise den von Ihnen konfigurierten Port (oder die Standardeinstellung für den Client) als Ziel für eingehende Verbindungen haben und entweder die Standard- oder eine benutzerdefinierte / Zufälliger Port für die Quelle und umgekehrt für ausgehende Verbindungen.

Hmm, aber Bittorrent ändert das Verhalten des Routers nicht richtig? Da einige Routing-Mechanismen dynamisch gewesen sein könnten, wie in http://superuser.com/a/187190/78897 gezeigt, wie kann Computer-A davon erfahren? Pacerier vor 11 Jahren 0
Port-Weiterleitung. Sie haben es vorher eingerichtet. UtahJarhead vor 11 Jahren 0
@ Pacerier Wenn sowohl der Router als auch die P2P-App [UPnP] (http://en.wikipedia.org/wiki/Upnp#NAT_traversal) verwenden, kann die Portweiterleitung dynamisch erfolgen. In diesem Fall ändert ja Bittorrent __ das Verhalten des Routers. zero2cx vor 11 Jahren 0
@ zero2cx, gibt es überhaupt Peer-to-Peer, ohne das Verhalten des Routers zu ändern? Pacerier vor 11 Jahren 0
@Pacerier, wenn du NAT (mehrere Systeme, die sich eine Verbindung teilen) haben willst, dann musst du * den Router irgendwie konfigurieren, um zu wissen, wo man Verbindungen herstellen soll (na ja, technisch gesehen * könnte * jeder) jede Verbindung auf alle Ports spucken Sie haben vorgeschlagen, aber das wäre im besten Fall schrecklich. Sie können dies statisch (IPs und Ports konfigurieren) oder dynamisch (UPnP) durchführen. Synetech vor 11 Jahren 0
@ Pacerier Ja, aber dann werden eingehende Verbindungsanfragen am Router angehalten. Ausgehende Bittorent-Verbindungsanforderungen sind nicht betroffen, und viele Bittorrent-Benutzer werden genau so eingerichtet. zero2cx vor 11 Jahren 0
3
John

Ihre Frage berührt das Herz des Internets und die Definition von Routing. In Ihrem Beispiel sendet Router D Daten aus zwei Gründen an Computer A:

  • Es wurde gesagt, Daten an Computer A zu senden.
  • Es sind bereits Daten von Computer A verarbeitet.

Ihr Szenario scheint die erste Option anzunehmen - Router D möchte an Computer A senden. Aber wie kommt er dorthin? Dies geschieht durch die Verwendung von Routingtabellen, die von Routern untereinander verwendet werden.

Router C sendet regelmäßig Updates an alle Router, die darüber informiert sind - einschließlich Router D -, dass er das "192.168. *" - Netzwerk "kennt" (in der Realität - das würde nicht passieren, da dieses Netzwerk nicht geroutet wird - es wird als privat betrachtet.) ignorieren Sie das.) Router D weiß also bereits, dass Router C dieses Netzwerk kennt.

Wenn Daten für Computer A bestimmt sind, werden sie zuerst über das Netzwerk angesprochen. Daher fragt Router D: "Ich muss das 192.168. * -Netzwerk finden. Weiß ich es? Nein. Kenne ich jemanden, der es tut? Ja. Router C ist. Wie komme ich zu Router C? Über meine 2.2. 2.2 Schnittstelle. "

Router D sendet dann die Daten an Router C. Router C ruft sie ab und sagt: "Oh, ich habe Daten von Router D, aber es ist für das 192.168-Netzwerk. Kenne ich das Netzwerk? Ja, über mein 192.168.1.1-Netzwerk" leitet es weiter.

Es gibt noch einige andere Arbeit, um die IP- und MAC-Adressierung aufzulösen, aber hier geht es um Routing an sich, nicht um ARP und lokales Netzwerk.

Sie werden feststellen, dass Ihre erste Annahme - der Remote-Router muss den Routing-Mechanismus kennen - hier nicht zum Tragen kommen. Router D kümmert sich nicht darum, ob Router C EIGRP, RIP, RIPv2, OSPF oder was auch immer verwendet. Es interessiert nur, dass es ein Update bekommen hat. (Natürlich ist es wichtig, wie es zu einem Update kam, um sicherzustellen, dass die beiden synchron bleiben. Aber auch dies ist ein anderes Problem.)

Ihre zweite Annahme, dass die Portnummer ein Faktor beim Routing ist, ist ebenfalls falsch. Router benötigen (im Allgemeinen) keine Portinformationen, um Routing-Entscheidungen zu treffen. (Dies hat sich aufgrund einiger neuer Netzwerktechnologien geringfügig geändert und gilt hauptsächlich für Firewalls und Proxies. Die weitergehende Annahme gilt jedoch immer noch für "echte" Router.)

Wenn Sie mit Ihrem Beispiel fortfahren, leitet Router C die Daten an Port 1000 weiter (je nach Szenario), da möglicherweise ein Dienst auf Computer A vorhanden ist, der Daten an diesem bestimmten Port erwartet. Dies ist jedoch nur möglich, weil Router D ihn an Port 1000 gesendet hat. Und Router D sendet ihn nur an diesem Port, da der Ersteller der Daten ihn an Router D an diesem Port gesendet hat.

Ich verstehe Ihre Aufnahme von Bittorrent- oder P2P-Programmen nicht als Spiegelbild der Frage, die Sie stellen. Die gleichen Erklärungen würden zutreffen. Router können auch mit Port-Triggering konfiguriert werden, wodurch ein bestimmtes Gerät (oder eine bestimmte IP-Adresse) einem bestimmten Port zugeordnet wird. Wenn der Datenverkehr in Port 1234 eingeht, weiß der Router, dass er Daten an Device ABCD sendet. Dies ist normalerweise mit einem ausgehenden TCP-Port verbunden. Wenn ich also Datenverkehr an Port 7890 sende, weiß der Router, dass eingehender Datenverkehr an Port 1234 stattfindet, und sendet ihn an mich.

Port-Triggering ist jedoch nicht mit (Remote-) Routing-Entscheidungen verbunden, sondern bezieht sich auf die interne MAC / IP-Tabelle, die der Router für das LAN verwendet.

Aktualisieren / Bearbeiten : Zur weiteren Beantwortung und Kommentierung Ihres Kommentars. Router D kennt Computer A nur anhand seiner IP-Adresse (192.168.2.2). Router C kennt Computer A jedoch anhand seiner IP-Adresse und seiner MAC-Adresse. Die MAC (Media Access Control) ist eine eindeutige (normalerweise ...) 48-Bit-Kennung, die durch internationalen Standard definiert wird. Jedes an ein LAN angeschlossene Gerät (verkabelt und drahtlos) sollte eine eindeutige MAC-Adresse haben.

Der Router (Router C) ordnet die IP-Adresse und die MAC-Adresse in einer Tabelle (MAC-Adressentabelle) zusammen. Wenn also Datenverkehr in Router C eingeht und der Router "lokal" erkennt, führt er eine MAC-Adressentabelle durch. Der Router ändert dann buchstäblich die Frame-Adressierungsinformationen.

Es rekonstruiert (schreibt) die Zielinformationen der Schicht 2 um, um die Ziel-MAC-Adresse von Computer A zu erhalten, behält jedoch die IP-Adressinformationen (Schicht 3) bei.

Wenn die Route die MAC-Adresse NICHT kennt. Oder er hat keine IP-MAC-Beziehung in der Tabelle. Er fragt nach einem ARP-Protokoll (Address Resolution Protocol), "HEY, alle in diesem Netzwerk. Haben Sie diese MAC-Adresse?" Oder manchmal - "Jeder, wie lautet Ihre MAC-Adresse?"). Das entsprechende Gerät / die entsprechenden Geräte antworten, und der Router erstellt seine IP-MAC-Tabelle.

Router-D sendet also ein Paket über den Port 60000 an Router-C (vorkonfiguriert), Router-C empfängt das Paket. Woher weiß es, dass dieses Paket an Computer-A weitergeleitet werden soll? Pacerier vor 11 Jahren 0
Router D kennt das endgültige Ziel bereits - Computer A. Computer (Router D) kennt Computer A nur über seine IP-Adresse: 192.168.2.2. Router C kennt Computer A jedoch auf zwei Arten: IP-Adresse (192.168.2.2) und etwas, das als MAC-Adresse bezeichnet wird. Ich werde die Antwort mit mehr Informationen aktualisieren. John vor 11 Jahren 1
2
UtahJarhead

Port Triggering. How does a web server send a webpage to you after you've requested it? Because you've requested it. When you request it, the router knows to expect a reply and when it gets it, it forwards it to the appropriate PC. Some programs are written to trigger an opening in anticipation of a signal from a specific PC, even if one isn't really on its way.

Some models have a central server used for basic communication. For example:

  • Client1 signs in with Server for 2-way communications.
  • Client2 signs in for the same thing.

Server now knows all files that Client1 and Client2 have.

  • Client2 says "I want file X from Client1" to Server.
  • Server tells Client1 "Client2 wants X file."
  • Client 1 sends a garbage piece of data to Client2's public IP, setting off the Port Triggering so it opens up the port for a reply from Client2.
  • Client2 sends its initial signal to Client1's public IP.

Client1 just fooled the router into opening up that port for Client2.

In some cases, such as BitTorrent or the original Napster (iirc), you have to forward a port on your router for it to work optimally.

As far as other clients knowing which port to connect to initially, it's because your client told the swarm or server which port you use. BitTorrent frequently uses a tracker and that keeps track of which ports are used by which clients.

Soweit sie wissen, welche Ports verwendet werden sollen, konfigurieren Sie den Client so, dass er einen bestimmten Port überwacht. Ihr Client teilt dem Swarm (wie im Fall von BitTorrent) mit, an welchem ​​Port Sie sich befinden, damit die anderen Clients wissen, zu welchen Verbindungen sie sich verbinden sollen. Ihr PC hat es ihnen gesagt. UtahJarhead vor 11 Jahren 0
Ich denke, Sie haben geantwortet, als mein erster Nachtrag geschrieben wurde. Richtig? UtahJarhead vor 11 Jahren 0
Aber wie soll der PC den Routing-Mechanismus kennen, wenn der Router dies tut? Einige Mechanismen könnten dynamisch gewesen sein, wie in http://superuser.com/a/187190/78897 gezeigt Pacerier vor 11 Jahren 0
Nein, das Routing muss nicht bekannt sein. Damit die meisten P2P-Clients ordnungsgemäß funktionieren, muss die Port-Weiterleitung auf Ihrem Router ordnungsgemäß konfiguriert sein. Ohne diese Option können Sie nur mit anderen Clients kommunizieren, mit denen Sie zuerst sprechen. Sie können das Gespräch nicht initiieren. Ich habe das in meiner Antwort kurz angesprochen (vorletzter Absatz) UtahJarhead vor 11 Jahren 0
Port-Forwarding ist jedoch nur möglich, wenn der Administrator es vorkonfiguriert hat. Wollen Sie damit sagen, dass Bittorrent * unsere Router neu konfiguriert *? Pacerier vor 11 Jahren 0
@ Pacerier Nur ein UPnP-fähiger Router. Router werden in der Regel nicht UPnP-fähig ausgeliefert, denke ich. Die Neukonfiguration (Port-Forward-Port-Einstellungen) erfolgt nur, wenn ein Router bereits einen internen Client dazu berechtigt hat. UPnP! zero2cx vor 11 Jahren 0