web-dev-qa-db-fra.com

=Java EXEMPLE DE POINTEUR DE TRACK UDP - Connexion du pare-feu

Disons que j'ai deux ordinateurs.

Ils connaissent les uns des autres publics et des IP privés via ice4j.

Un client écoute et l'autre envoi de la chaîne.

J'aimerais voir cela se produire via UP Hole Punching:

Let A be the client requesting the connection

Let B be the client that is responding to the request

Let S be the ice4j STUN server that they contact to initiate the connection
--
A sends a connection request to S

S responds with B's IP and port info, and sends A's IP and port info to B

A sends a UDP packet to B, which B's router firewall drops but it still
punches a hole in A's own firewall where B can connect

B sends a UDP packet to A, that both punches a hole in their own firewall,
and reaches A through the hole that they punched in their own firewall

A and B can now communicate through their established connection without 
the help of S

Quelqu'un pourrait-il poster des pseudo-exemples de la façon de faire de la perforation à travers une nat symétrique? En supposant qu'il y aura serveur S qui aidera à deviner les numéros de port et à établir la connexion entre le client A et B.

Ce serait bien si vous avez compté le double NAT aussi.

REMARQUE:

Vous pouvez utiliser Stum pour découvrir l'IP et le port, mais vous devez écrire votre propre code qui enverrait l'IP: port de votre serveur via keepalive technique.

Une fois qu'un client identifie l'autre via un ID unique sur le serveur, il sera fourni avec l'IP du client de l'autre: Info du port sur le trou de l'UDP Punch les données nécessaires à l'envoi et à la réception.

Petite mise à jour:

Il y a une bibliothèque qui s'affiche à l'horizon pour Java Vérifiez-le:
[.____] https://github.com/htwg/uce#readme

36
Mat B.

Votre question est vraiment large - je ne peux pas offrir un exemple, mais les liens suivants pourraient aider (spécifications, bibliothèques, échantillons, etc.):

10
Yahia

Votre problème n'est pas un Java associé. Si vous savez comment ouvrir une connexion UDP, c'est suffisant. Lisez le contenu du suivant link . Ne soyez pas Effrayé par le titre, il couvre également UDP. Le reste est juste Java codage.

P.s. : Dans votre scénario, il y a une étape manquante. A et B doivent avoir une connexion ouverte à S, car s doit dire à B qu'a tente de l'atteindre. Si B n'a pas de connexion ouverte à S, il n'ya aucun moyen A et B peut commencer à communiquer ensemble.

[~ # ~ ~] Mise à jour [~ # ~]

La réponse faite par Jason contient des erreurs et une spéculation sauvage sur NAT Traverse. Il faut lire le travail effectué par Saikat Guha (meci-s.org/~francis/imc05-tcpnat. PDF) Pour bien comprendre cette affaire. La classification du cône de Wikipedia est complètement obsolète et trompeuse.

6

Stum fonctionne essentiellement comme suit: Votre client derrière le pare-feu se connecte à un serveur étonnant en dehors du pare-feu. Le serveur étonnant inspecte le paquet reçu du client et envoie le client une réponse à la réaction contenant les clients IP et le port lorsqu'ils apparaissent au serveur Stum.

C'est ainsi que le client derrière le pare-feu découvre sa propre adresse IP et port externe. Pour autant que je sache un serveur étonnant ne transmettra normalement pas d'informations d'adresse d'un client à un autre.

Typiquement étourdissements est utilisé pour configurer des flux de support via des pare-feu, lorsque le pare-feu est déjà ouvert au trafic de signalisation - par exemple. En VoIP: Le client contacte un serveur étonnant pour découvrir sa propre adresse IP et port externe pour le trafic UDP, il envoie ensuite sa demande de signalisation (invité SIP ou autre) à l'autre client sur un port ouvert bien connu - y compris ses informations d'adresse UDP externe. dans la charge utile (SDP ou autre). Donc, généralement un client doit être accessible sur un port ouvert pour signaler la communication entre pairs.

6
vladimir e.