11
votes

Recevoir une réponse à travers UDP

J'ai vu des applications envoyez un paquet via UDP à une adresse IP sur un port et recevez une réponse. À quel port la réponse va-t-elle? (BTW, comment le routeur peut-il savoir que la réponse est pour mon PC, s'il n'y a pas de ports transmis à mon PC?)

Salutations, Neo_B


0 commentaires

3 Réponses :


11
votes

Quel port une réponse est attribué à la demande. UDP est totalement apatride, donc après avoir tiré sur un paquet, la seule manière qu'une application peut s'attendre à une réponse si elle sait que l'autre extrémité va en envoyer un. Selon l'application UDP, je m'attendrais à ce que la réponse soit sur le même port de simplicité - ce n'est pas le cas pour les protocoles tels que TCP, qui ont un port source intentionnellement aléatoire (et élevé).

Pour répondre à votre deuxième question, de nombreux routeurs, même des routeurs à domicile peu coûteux, do inspection de paquets standard (SPI). Quelque chose comme ça se passe probablement, mais je suis prêt à être corrigé si je suis désactivé:

[Stage Stage avec client, routeur, Internet, serveur.]

  1. Le client émet un paquet UDP.
  2. le routeur passe le paquet UDP sur Internet.
  3. Routeur se souvient de ce client envoyé un paquet UDP au serveur et établit une cartographie dans sa mémoire.
  4. Server envoie un paquet UDP, probablement sur le même port.
  5. Routeur reçoit des paquets et vérifie la mappage pour trouver le client parlé au serveur récemment.
  6. le routeur passe le paquet au client.

    Comment cela est mis en œuvre est spécifique au routeur, j'imagine, mais c'est ma compréhension de la façon dont cela fonctionne.


2 commentaires

Merci de l'avoir écrit bien. Seule la correction est à # 4 hypothèse: "réponse probablement sur le même port". Ceci est peu probable car cela provoquerait des interférences avec un serveur UDP exécutant sur le même port sur la machine à expéditeur.


C'est une bonne référence rapide en Java: Stackoverflow.com/Questtions/10556829/...



2
votes

Lorsque vous créez la prise UDP, vous devez la lier à un numéro de port. Si vous ne le faites pas, le système d'exploitation attribuera un port éphémère.

L'application de l'autre côté doit connaître ce port. Lorsque les réponses sont renvoyées, votre routeur pourrait ne pas savoir comment parcourir. Il y a 2 façons de résoudre ce problème

  1. vous pouvez configurer explicitement un itinéraire à votre ordinateur sur un particulier Port.
  2. Vous pouvez configurer votre routeur pour Suivre la connexion UDP par ouvrir automatiquement un itinéraire vers votre ordinateur quand un particulier paquet est envoyé. UPNP protocole est Basé sur ce concept.

1 commentaires

Merci à vous deux pour des réponses rapides. J'ai compilé des versions légèrement modifiées d'un client et d'un serveur UDP. Ils travaillent sur mon PC lorsque j'essaie d'envoyer un message à localhost sur pratiquement tous les ports que j'ai essayés. Bien que lorsque j'envoie une requête à un serveur qui fonctionne sur un autre PC de mon réseau local et écoutez une réponse sur le même port que j'ai envoyé la requête sur, je ne reçois pas de réponse (lorsque j'utilise mon propre code irréel , Je reçois en quelque sorte une réponse).



3
votes

Si j'envoie un message à un port UDP sur une autre machine, quel que soit le port, j'envoie le message de, quelle que soit sa sélection, apparaîtra dans le datagramme UDP. J'aurais pensé que l'extrémité distante envoiait toute réponse à ce datagramme à ce port source.

Je suppose que la même chose s'applique même si les ports sont modifiés par pare-feu ou par périphérique NAT, l'extrémité distante voit un datagramme à partir d'un port particulier et envoie la réponse à l'arrière, le pirewall / NAT traduit ensuite ce port au port source d'origine.


1 commentaires

Je pense que c'est comme ça que ça se passe, car je viens de regarder un code de noms de noms. Les demandes DNS optent généralement sur UDP, mais doivent renvoyer la réponse.