Comment fonctionne le peer-to-peer sur Internet?

15

D'après ce que je comprends, il n'y a aucun moyen d'envoyer un paquet à un ordinateur dans un réseau local depuis l'extérieur du réseau, à moins que nous connaissions le mécanisme de routage utilisé par le routeur.

En supposant que nous ayons une configuration qui ressemble à ceci:

  1. Ordinateur-A, IP 192.168.1.2 (passerelle par défaut 192.168.1.1)

  2. Ordinateur-B, IP 192.168.1.3 (passerelle par défaut 192.168.1.1)

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

  4. Routeur-D (IP externe 2.2.2.2)

L'ordinateur A, l'ordinateur B et le routeur C appartiennent au même réseau local. Le routeur-D veut envoyer des données à l'ordinateur-A, mais il ne peut pas le faire sans passer par le routeur-C.

Maintenant, le routeur-C transmettra les paquets à l'ordinateur-A si le port de destination est 1000, et transmettra les paquets à l'ordinateur-B si le port de destination est 2000. Mais sûrement, le seul périphérique qui connaît ce mécanisme de routage est le routeur-C lui-même! Même l'ordinateur-A ou l'ordinateur-B ne le sauront pas, non?

Le routeur-D peut donc envoyer un paquet à l'ordinateur-A s'il envoie un paquet au routeur-C via le port 1000, mais comment le routeur-D doit-il savoir pour envoyer des paquets via le port 1000, et pas le port 1001?

Comment les programmes peer-to-peer comme Bittorrent réussissent-ils à résoudre ce problème? La seule solution à laquelle je peux penser est que le routeur-D envoie le paquet au routeur-C via tous les ports, de sorte qu'il soit transféré à l'ordinateur-A, mais y a-t-il une meilleure solution?

Pacerier
la source

Réponses:

9

Votre confusion provient de certaines hypothèses incorrectes.

Mais sûrement, le seul appareil qui connaît ce mécanisme de routage est Router-C lui-même! Ni l'ordinateur-A ni l'ordinateur-B ne le sauront, non?

Quoi, pourquoi ... Alors pourquoi le routeur a-t-il été configuré pour transférer ces ports vers ces IP? Vous devez configurer le client P2P pour utiliser un port spécifique, puis configurer le routeur pour correspondre.

mais comment le routeur-D doit-il savoir pour envoyer des paquets via le port 1000, et non pas le port 1001?

Parce que vous configurez le client P2P pour utiliser un port spécifique (standard ou non standard pour ce protocole).

La seule solution à laquelle je peux penser est que le routeur-D envoie le paquet au routeur-C via tous les ports, de sorte qu'il soit transféré à l'ordinateur-A, mais y a-t-il une meilleure solution?

C'est beaucoup plus simple que ça. Lorsque le client établit une connexion avec un homologue, il spécifie le port qu'il souhaite utiliser, afin que l'homologue envoie les données sur ce port.

Hmm, mais Bittorrent ne change pas le comportement du routeur non? Étant donné qu'un mécanisme de routage aurait pu être dynamique, comme le montre superuser.com/a/187190/78897, comment Computer-A peut-il le savoir?

Le client n'affecte pas directement le routeur, mais le routeur peut être configuré / suffisamment intelligent pour s'adapter au comportement du client. Vous pouvez activer UPnP dans le routeur et le client pour configurer automatiquement la connexion et la plupart des routeurs ont des capacités d' inspection avec état dans le cadre de leur mécanisme de redirection de port .

Ensemble, ce que cela signifie, c'est qu'une connexion peut être établie dynamiquement sur un port aléatoire, puis le routeur peut suivre ce qui se passe au lieu de tout voir comme des connexions aléatoires et dénuées de sens. De cette façon, il peut transférer une connexion si nécessaire car, par exemple, c'est une réponse à cette autre connexion qui vient de se produire .

Le problème survient lorsque plusieurs systèmes utilisent le même programme. Avoir plusieurs systèmes connectés au même routeur, partager la même IP et utiliser des ports dynamiques devient rapidement ingérable et même avec une inspection avec état, il est difficile, voire impossible, de le faire fonctionner correctement. Dans ce cas, des ports statiques (par défaut ou non) devront être utilisés.


Si vous utilisez un programme comme SmartSniff ou TCPView pour surveiller vos connexions, vous remarquerez que les connexions P2P auront généralement le port que vous avez configuré (ou la valeur par défaut pour le client) comme destination pour les connexions entrantes et la valeur par défaut ou personnalisée / port aléatoire pour la source et vice versa pour les connexions sortantes.

Synetech
la source
Hmm, mais Bittorrent ne change pas le comportement du routeur non? Étant donné qu'un mécanisme de routage aurait pu être dynamique, comme le montre superuser.com/a/187190/78897 , comment Computer-A peut-il le savoir?
Pacerier
Redirection de port. Vous l'avez configuré au préalable.
UtahJarhead
@Pacerier Si le routeur et l'application p2p utilisent UPnP , la redirection de port peut être effectuée de manière dynamique. Dans ce cas, oui Bittorrent fait changer le comportement du routeur.
zero2cx
@ zero2cx, est-il possible de faire du peer-to-peer sans changer le comportement du routeur?
Pacerier
@Pacerier, si vous voulez avoir NAT (plusieurs systèmes partageant une connexion), vous devez en quelque sorte configurer le routeur pour savoir où faire des liens (bien, vous techniquement pourriez juste avoir tout le monde crachent chaque connexion à tous les ports comme vous le suggérez, mais ce serait au mieux, horrible). Vous pouvez le faire de manière statique (configurer les adresses IP et les ports) ou dynamiquement (UPnP).
Synetech
4

Votre question touche au cœur d'Internet et à la définition même du routage. Dans votre exemple, le routeur D envoie des données à l'ordinateur A sur la base de deux prémisses:

  • On lui a dit d'envoyer des données à l'ordinateur A.
  • Il s'agit déjà de données traitées par l'ordinateur A.

Votre scénario semble supposer la première option - le routeur D veut envoyer à l'ordinateur A. Mais comment y parvient-il? Il le fait grâce à l'utilisation de tables de routage qui sont partagées par les routeurs entre eux.

Le routeur C envoie régulièrement des mises à jour à tous les routeurs qui savent - y compris le routeur D - qu'il "connaît" le réseau "192.168. *" (En réalité - cela ne se produirait pas parce que ce réseau n'est pas routé - il est considéré comme privé. Mais ignorer cela.) Ainsi, le routeur D sait déjà que le routeur C connaît ce réseau.

Ainsi, lorsque les données sont destinées à l'ordinateur A, elles sont d'abord traitées par le réseau. Ainsi, le routeur D demande: "J'ai besoin de trouver le réseau 192.168. *. Est-ce que je le connais? Non. Est-ce que je connais quelqu'un d'autre qui le sait? Oui. Le routeur C le fait. Comment puis-je accéder au routeur C? 2.2 interface. "

Le routeur D envoie ensuite les données au routeur C. Le routeur C les obtient et dit: "Oh, j'ai des données du routeur D mais c'est pour le réseau 192.168. Est-ce que je connais ce réseau? Oui, via mon réseau 192.168.1.1" Et puis le transmet.

Il y a un autre travail à faire pour résoudre l'adressage IP et MAC, mais je couvre le routage, en soi, pas ARP et le réseau local.

Vous remarquerez que votre première hypothèse - le routeur distant doit connaître le mécanisme de routage - ne joue pas ici. Le routeur D ne se soucie pas si le routeur C utilise EIGRP, RIP, RIPv2, OSPF ou autre. Tout ce qui importe, c'est qu'il a obtenu une mise à jour. (Bien sûr, comment il a obtenu une mise à jour est important pour s'assurer que les deux restent synchronisés. Mais encore une fois, c'est un problème différent.)

Votre deuxième hypothèse - que le numéro de port est un facteur de routage - est également incorrecte. Les routeurs (généralement) n'ont pas besoin d'informations sur les ports pour prendre des décisions de routage. (Cela a légèrement changé, en raison de certaines nouvelles technologies de réseau et s'applique principalement aux pare-feu et aux proxys, mais l'hypothèse plus large s'applique toujours aux "vrais" routeurs.)

Poursuivant votre exemple, le routeur C transmettra les données sur le port 1000 (selon votre scénario) car il est possible qu'un service sur l'ordinateur A attend des données sur ce port spécifique. Mais il ne sait le faire que parce que le routeur D l'a envoyé sur le port 1000. Et le routeur D ne l'envoie que sur ce port parce que l'expéditeur des données l'a envoyé au routeur D sur ce port.

Je ne comprends pas que votre inclusion de programmes bittorrent ou P2P reflète la question que vous posez. Les mêmes explications s'appliqueraient. Les routeurs peuvent également être configurés avec un déclenchement de port qui associe un périphérique particulier (ou IP) à un port particulier. De telle sorte que lorsque le trafic arrive sur le port 1234, les routeurs savent envoyer des données au périphérique ABCD. Ceci est généralement associé à un port TCP sortant. ie si j'envoie du trafic sur le port 7890, le routeur sait que le trafic entrant sera sur le port 1234 et me l'envoie.

Mais le déclenchement de port n'est pas associé à des décisions de routage (à distance) - il concerne plutôt la table MAC / IP interne que le routeur utilise pour le LAN.

Mettre à jour / modifier : Pour répondre davantage et élaborer après votre commentaire. Le routeur D ne connaît l'ordinateur A que par son adresse IP (192.168.2.2). Mais le routeur C connaît l'ordinateur A par son adresse IP et par son adresse MAC. Le MAC (Media Access Control) est un identifiant unique (généralement ...) de 48 bits qui est défini par une norme internationale. Chaque appareil connecté à un réseau local (filaire et sans fil) est censé avoir une adresse MAC unique.

Le routeur (routeur C) associe l'adresse IP et l'adresse MAC ensemble dans une table (la table d'adresses MAC). Ainsi, lorsque le trafic arrive sur le routeur C et que le routeur y réalise son "local", il effectue une recherche dans la table d'adresses MAC. Le routeur modifie alors littéralement les informations d'adressage de trame.

Il reconstruit (réécrit) les informations de destination de la couche 2 pour avoir l'adresse MAC de destination de l'ordinateur A mais conserve les informations d'adresse IP (couche 3) pour qu'elles soient identiques.

Si l'itinéraire ne connaît PAS l'adresse MAC. Ou n'a pas de relation IP-MAC dans sa table, il fait quelque chose appelé ARP (protocole de résolution d'adresse) pour demander "HEY, tout le monde sur ce réseau. Avez-vous cette adresse MAC?" Ou parfois - "Tout le monde, quelle est votre adresse MAC?"). Le ou les périphériques appropriés répondent et le routeur crée sa table IP-MAC.

John
la source
Ainsi, le routeur-D envoie un paquet au routeur-C via le port 60000 (préconfiguré), le routeur-C reçoit le paquet, mais comment sait-il que ce paquet doit être transmis à l'ordinateur-A?
Pacerier
1
Le routeur D connaît déjà la destination finale - l'ordinateur A. Il (le routeur D) ne connaît l'ordinateur A que par son adresse IP: 192.168.2.2. Mais, le routeur C connaît l'ordinateur A par deux méthodes: l'adresse IP (192.168.2.2) et quelque chose appelé son adresse MAC. Je mettrai à jour la réponse avec plus d'informations.
John
2

Déclenchement de port. Comment un serveur Web vous envoie-t-il une page Web après l'avoir demandée? Parce que vous l'avez demandé. Lorsque vous le demandez, le routeur sait attendre une réponse et lorsqu'il l'obtient, il la transmet au PC approprié. Certains programmes sont écrits pour déclencher une ouverture en prévision d'un signal provenant d'un PC spécifique, même si l'on n'est pas vraiment en route.

Certains modèles ont un serveur central utilisé pour la communication de base. Par exemple:

  • Client1 se connecte au serveur pour les communications bidirectionnelles.
  • Client2 se connecte pour la même chose.

Le serveur connaît désormais tous les fichiers que possèdent Client1 et Client2.

  • Client2 dit "Je veux le fichier X de Client1" vers le serveur.
  • Le serveur indique à Client1 "Client2 veut un fichier X".
  • Le client 1 envoie une poubelle de données à l'adresse IP publique de Client2, déclenchant le déclenchement du port afin qu'il ouvre le port pour une réponse de Client2.
  • Client2 envoie son signal initial à l'adresse IP publique de Client1.

Client1 vient de tromper le routeur pour qu'il ouvre ce port pour Client2.

Dans certains cas, comme BitTorrent ou le Napster d'origine (iirc), vous devez transférer un port sur votre routeur pour qu'il fonctionne de manière optimale.

Pour autant que les autres clients sachent à quel port se connecter initialement, c'est parce que votre client a dit à l'essaim ou au serveur quel port vous utilisez. BitTorrent utilise fréquemment un tracker et qui garde la trace des ports utilisés par quels clients.

UtahJarhead
la source
Pour autant qu'ils sachent quels ports utiliser ... vous configurez le client pour écouter sur un port spécifique. Votre client indique à l'essaim (comme dans le cas de BitTorrent) sur quel port vous êtes afin que les autres clients sachent à quoi se connecter. Votre PC leur a dit.
UtahJarhead
Je pense que vous avez répondu lors de la rédaction de mon premier addendum. Correct?
UtahJarhead
mais comment le PC connaît-il le mécanisme de routage quand c'est le routeur qui le fait? Un mécanisme aurait pu être dynamique comme démontré dans superuser.com/a/187190/78897
Pacerier
Non, il n'a pas besoin de connaître le routage. Pour que la plupart des clients P2P fonctionnent correctement, vous devez configurer correctement la redirection de port sur votre routeur. Sans cela, vous ne pouvez communiquer qu'avec les autres clients avec lesquels vous parlez en premier. Ils ne peuvent pas engager la conversation. J'ai brièvement abordé ce sujet dans ma réponse (avant-dernier paragraphe)
UtahJarhead
Mais la redirection de port n'est possible que si l'administrateur l'a préconfigurée. Voulez-vous dire que Bittorrent reconfigure nos routeurs?
Pacerier