Connecter P2P sur NAT?
j'ai commencé à explorer l'option de me connecter avec d'autres en utilisant une connexion p2p, donc j'ai codé un programme de socket simple en JAVA pour les appareils android dans lequel les utilisateurs peuvent partager des messages P2P simples (je n'avais aucune idée de NAT alors). J'ai appris à connaître NAT, donc j'ai maintenant besoin d'établir une connexion TCP avec un autre utilisateur qui utilise un serveur pour la découverte mais la charge utile est transférée p2p. J'ai également regardé XMPP (une très bonne et détaillée explication de la façon dont le protocole fonctionne est ici) et UPnP mais je ne sais pas comment les mettre en œuvre.
une autre question intéressante qui se pose est celle de BitTorrent car ils peuvent fonctionner sur n'importe quel appareil et même derrière un NAT. Je n'arrive pas à comprendre comment fonctionne BitTorrent.
j'ai fait beaucoup de recherches mais je suis coincé.
Mes questions sont:
- Une explication détaillée de BitTorrent(comme ici, et non pas des torrents de travail) et comment est-il en mesure de travailler autour de NAT ?
- y a-t-il un moyen de programmer une entrée NAT?
- Est programmation socket suffisante pour le p2p ?
- Comment est-il difficile de créer votre propre protocole et comment puis-je construire ?
- si deux dispositifs D1 et D2 veulent communiquer p2p et qu'ils connaissent L'IP de l'autre. D1 envoie une requête à D2 et qui ne peut pas passer par le NAT de D2, mais il devrait y avoir une entrée créée dans le NAT de D1. Donc quand D2 essaye d'envoyer quelque chose de NAT de D1 devrait découvrir une entrée avec L'IP de D2. Alors pourquoi le paquet n'est pas autorisé ?
4 réponses
une autre question intéressante qui se pose est celle de BitTorrent car ils peuvent fonctionner sur n'importe quel appareil et même derrière un NAT. Je n'arrive pas à comprendre comment fonctionne BitTorrent.
Cette déclaration ressemble vous supposez que bittorrent besoins de connectivité complète pour fonctionner.
C'est incorrect.
derrière un périphérique NAT, vous pourrez toujours établir sortant connexions TCP. Ce qui est généralement suffisant pour bittorrent aussi longtemps qu'il y a d'autres, non-NATed (ou NATed mais proprement transfert de port) clients du réseau qui peut accepter en approche connnections.
NAT n'a pas d'impact sur le sens d'écoulement des données car les connexions sont bidirectionnelles une fois qu'elles sont établies. C'est seulement problématique pour la connexion initiale de l'installation.
cela fonctionne parfaitement bien pour bittorrent parce que bittorent ne se soucie pas de quel noeud spécifique vous obtenez de vos données. Bien qu'une meilleure connectivité améliore généralement les performances.
si l'identité du noeud compte ou si les transferts un-à-un sont un cas d'utilisation important, alors les autres protocoles p2p tentent habituellement NAT traversal tout d'abord, et si cela échoue, il faut compter sur des nœuds tiers qui relaient le trafic entre les nœuds qui ne peuvent pas se connecter directement entre eux.
En outre, L'assistance IPv6 deviendra essentielle à l'avenir pour maintenir de bout en bout connectivité parce que de plus en plus de FAI commencent à se déployer NAT carrier-grade pour IPv4 alors que IPv6 restera non-NATed
une chose doit être claire est que 100% P2P entre tous les types de NAT est impossible en ce moment. Il n'existe aucun moyen pratique d'établir la connectivité P2P entre le NAT **symétrique et le NAT/PRC symétrique. Dans ce scénario, la connexion est établie via un serveur relais appelé TURN.
je réponds à partir de votre 2ème question, parce que je ne sais pas beaucoup sur la première.
2) Oui. Vous pouvez envoyer un paquet à travers votre NAT et il y aura un mapping entre votre interne IP: Port vers L'IP externe de votre NAT:Port. Vous pouvez connaître ces IP: Port externes en envoyant une requête stun. Notez que cette technique ne fonctionne pas pour le NAT symétrique.
3) Oui programmation de socket suffisante pour p2p.
4)Pourquoi avez-vous besoin d'un protocole, lorsqu'il existe déjà plusieurs. Le protocole ICE est le meilleur aujourd'hui pour NAT traversal et je ne pense pas qu'il était facile à créer. UPnP et NAT-PMP sont vraiment vulnérables en termes de sécurité.
5) je pense que ce qui se passe est habituellement, le NAT bloque les paquets inconnus. Ainsi, lorsque D1 envoie un paquet à D2, son NAT bloque tous les paquets entrants depuis le Port IP:D1s. C'est pourquoi l'établissement de connexion échoue. Vous devez utiliser la technique de perforation pour D1 et D2 pour établir avec succès la connectivité P2P.
**par NAT symétrique je veux dire NAT symétrique avec répartition aléatoire des ports.
Il y a un papier sur "Communication de pair à pair à travers les traducteurs D'adresses réseau" qui décrit l' UDP perforation méthode et l'étend à l'être utilisé sur TCP.
bien sûr, vous aurez toujours besoin d'un serveur relais pour les cas où la perforation par trou n'est pas supportée.
versions récentes de L'utilisation de BitTorrent µTP, qui est superposé au-dessus de UDP, pas TCP. µTorrent utilise une extension privée (
ut_holepunch
) qui effectue le poinçonnage de trou UDP, la plupart des autres implémentations ne prennent pas la peine (à l'exception notable de Tixati).certains routeurs NAT acceptent les requêtes port forwarding en utilisant uPNP ou PMP protocole. Si cela est soutenu dépend de la marque particulière de le routeur et sa configuration.
Oui, programmation socket est assez pour le P2P.
Difficile de répondre. Je vous suggère de lire le wikified et annoté BitTorrent spécification pour un début.
Oui, c'est le principe derrière UDP perforation.