Question

Je l'ai vu et lu beaucoup de questions semblables, et les articles de Wikipedia correspondant ( NAT traversal , STUN , TURN , trou TCP poinçonnage ), mais la quantité énorme d'information ne me permet pas vraiment mon problème très simple:

J'écris une application P2P, et je veux deux utilisateurs de mon application derrière NAT pour pouvoir se connecter les uns aux autres. La connexion doit être fiable (comparable à la fiabilité de TCP) donc je ne peux tout simplement passer à UDP. La solution devrait fonctionner sur les systèmes communs d'aujourd'hui sans reconfiguration. Si elle aide, la solution peut impliquer une 3ème partie connectable, tant qu'il n'a pas fondé de pouvoir l'ensemble des données (par exemple, pour obtenir des adresses IP externes (WAN) des pairs).

Pour autant que je sache, ma seule option est d'utiliser une bibliothèque « UDP fiable » + trou UDP coups de poing . Y at-il une bibliothèque (C / C ++) pour cela? J'ai trouvé enet dans question liée , mais il faut seulement prendre soin de la première moitié de la solution.

Rien d'autre? Ce que j'ai regardé:

  1. teredo - nécessite le soutien du système d'exploitation et / ou la configuration de l'utilisateur
  2. de redirection de port UPnP de - UPnP est absent / permis partout
  3. trouage TCP semble être un travail expérimental et que dans certaines circonstances
  4. SCTP est encore moins soutenu que IPv6. SCTP sur UDP est juste fantaisie UDP fiable (voir ci-dessus)
  5. RUDP - presque pas de soutien grand public
  6. D'après ce que je pouvais comprendre de STUN, Cascadeur, TURN et ICE, aucun d'entre eux ne me aider.
Était-ce utile?

La solution

ICE recueille une liste de cibles candidats IP / port auquel se connecter. Chaque pair recueille ces derniers, puis chacun exécute une vérification de la connectivité sur chacun des candidats dans l'ordre, jusqu'à ce que soit un chèque ou un chèque passe échoue.

Quand Alice essaie de se connecter à Bob, elle obtient en quelque sorte une liste des moyens possibles - déterminée par Bob - elle peut se connecter à Bob. ICE appelle ces candidats. Bob pourrait dire, par exemple: « mon 192.168.1.1:1024/udp de prise locale, ma liaison de NAT externe (trouvés par STUN) est 196.25.1.1:4454/udp, et vous pouvez invoquer un relais médiatique (un middlebox) à 1,2 .3.4: 6675 / udp ». Bob met que dans un paquet SDP (une description de ces différents candidats), et l'envoie à Alice en quelque sorte. (Dans SIP, le cas d'utilisation d'origine pour ICE, porté dans un SIP INVITER / échange 200 / ACK de la SDP, la mise en place d'une session SIP.)

ICE est connectable, et vous pouvez configurer la nature précise / nombre de candidats. Vous pouvez essayer un lien direct, puis en demandant un STUN serveur pour une fixation (ce perfore un trou dans votre NAT, et vous indique l'adresse IP externe / port de ce trou, que vous mettez dans votre description de session), et retombant sur demande une TURN serveur pour transmettre vos données.

Un inconvénient à ICE est que vos pairs change SDP descriptions, que vous pouvez ou pas comme. Une autre est que toujours de support TCP dans , qui peut ou peut ne pas être un problème pour vous. [MISE À JOUR:. ICE est maintenant officiellement RFC 6544 ]

Jeux utilisent souvent UDP, parce que les anciennes données ne sert à rien. (C'est pourquoi RTP fonctionne habituellement sur UDP.) Certaines applications P2P utilisent souvent middleboxes ou réseaux de middleboxes.

IRC utilise un réseau de middleboxes: les serveurs IRC forment des réseaux, et les clients se connectent à un serveur proche. Messages d'un client à un autre peut se déplacer à travers le réseau de serveurs.

A défaut de tout cela, vous pouvez jeter un oeil à l'architecture de BitTorrent et de voir comment ils gèrent le problème NAT. Comme CodeShadow souligne dans les commentaires ci-dessous, BitTorrent repose sur ses pairs accessibles dans le réseau: dans un sens des pairs forment un réseau de middleboxes. Si ces middleboxes pourraient servir de relais, vous auriez une architecture IRC comme, mais qui est mis en place dynamiquement.

Autres conseils

Je recommande libjingle car il est utilisé par un jeu vidéo majeur les entreprises qui repose en grande partie sur la communication réseau P2P. (Avez-vous entendu parler de Steam? Vavle utilise également libjingle , voir le " peer-to-peer réseau » session dans la page: https://partner.steamgames.com/documentation/api )

Cependant, le travail toujours solution serait d'utiliser un serveur de relais. Comme il n'y a aucun moyen « standard » de passer par NAT, vous devriez avoir cette option de serveur de relais en tant que stratégie de repli si une connexion doit toujours être établie entre les pairs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top