319 votes

Deux applications peuvent-elles écouter le même port ?

Deux applications sur la même machine peuvent-elles se lier au même port et à la même adresse IP ? En allant plus loin, une application peut-elle écouter les requêtes provenant d'une certaine IP et l'autre d'une autre IP distante ? Je sais qu'une application qui démarre deux threads (ou forks) peut avoir un comportement similaire, mais deux applications qui n'ont rien en commun peuvent-elles faire de même ?

3 votes

Pour une bonne réponse détaillée sur la réutilisation des adresses/ports avec des sockets multiples : stackoverflow.com/questions/14388706/

280voto

Chris Dail Points 11406

La réponse diffère selon le système d'exploitation envisagé. Mais en général :

Pour TCP, non. Vous ne pouvez avoir qu'une seule application écoutant sur le même port à la fois. Maintenant, si vous avez 2 cartes réseau, vous pouvez avoir une application qui écoute sur la première IP et la seconde sur la seconde IP en utilisant le même numéro de port.

Pour UDP (Multicast), plusieurs applications peuvent s'abonner au même port.

Edition : Depuis le noyau Linux 3.9 et les versions ultérieures, la prise en charge de plusieurs applications écoutant sur le même port a été ajoutée à l'aide de la commande SO_REUSEPORT option. De plus amples informations sont disponibles à l'adresse suivante cet article de lwn.net.

27 votes

"une application écoutant sur un seul port" c'est la raison pour laquelle les ports existent -- pour permettre à plusieurs applications de partager le réseau sans conflits.

53 votes

Un auditeur par port et par adresse IP. L'ajout d'une autre interface réseau est un moyen d'obtenir une deuxième adresse IP. Votre plate-forme prend probablement en charge les interfaces virtuelles, qui sont un autre moyen d'obtenir deux adresses IP avec une seule carte réseau physique.

10 votes

Bien que j'étais de la même opinion jusqu'à présent, il s'avère que j'ai pu lier deux processus différents à la même adresse IP et au même port TCP ! Cela est possible si vous définissez ServerSocket.setReuseAddress(true) en Java avant de vous y lier. Un comportement vraiment inattendu.

137voto

JNewton Points 177

Oui (pour TCP), vous pouvez avoir deux programmes qui écoutent sur le même socket, si les programmes sont conçus pour le faire. Lorsque le socket est créé par le premier programme, assurez-vous que la balise SO_REUSEADDR est définie sur la socket avant que vous bind() . Cependant, ce n'est peut-être pas ce que vous voulez. Ce que cela fait, c'est qu'une connexion TCP entrante sera dirigée vers un des programmes, et non les deux, de sorte qu'il ne duplique pas la connexion, mais permet simplement à deux programmes de traiter la demande entrante. Par exemple, les serveurs Web ont plusieurs processus qui écoutent tous le port 80, et le système d'exploitation envoie une nouvelle connexion au processus qui est prêt à accepter de nouvelles connexions.

SO_REUSEADDR

Permet aux autres sockets de bind() à ce port, à moins qu'il n'existe déjà un socket en écoute active lié à ce port. Cela vous permet de contourner les messages d'erreur "Adresse déjà utilisée" lorsque vous essayez de redémarrer votre serveur après un crash.

1 votes

TCP + UDP fonctionne maintenant (avec un noyau suffisamment neuf). Voir le lien que j'ai ajouté à la réponse.

3 votes

Cette réponse n'est pas correcte, sauf si tous les sockets sont liés à des adresses IP distinctes dont aucune n'est INADDR_ANY, ou si vous êtes sous Windows, où le résultat est indéfini.

2 votes

Pouvez-vous nous expliquer comment les données sont transmises à une application spécifique sur le même port ? Y a-t-il des problèmes de sécurité à prendre en compte lorsque les applications utilisent SO_REUSEADDR ou SO_REUSEPORT ?

58voto

EJP Points 113412

Sí.

  1. Plusieurs sockets TCP en écoute, tous liés au même port, peuvent coexister, à condition qu'ils soient tous liés à des adresses IP locales différentes. Les clients peuvent se connecter à celui qu'ils veulent. Ceci exclut 0.0.0.0 ( INADDR_ANY ).

  2. Multiple accepté peuvent coexister, toutes acceptées depuis le même socket d'écoute, toutes montrant le même numéro de port local que le socket d'écoute.

  3. Plusieurs sockets UDP, tous liés au même port, peuvent coexister à condition que la condition soit la même qu'au point (1) ou qu'ils aient tous reçu le code d'accès à l'Internet. SO_REUSEADDR définie avant la liaison.

  4. Les ports TCP et les ports UDP occupent des espaces de noms différents, de sorte que l'utilisation d'un port pour TCP n'exclut pas son utilisation pour UDP, et et vice versa.

Référence : Stevens & Wright, TCP/IP Illustré, Volume II.

1 votes

Avez-vous un lien à portée de main ? L'opportunité de la coexistence TCP-UDP est ma question même. Merci d'avance :)

1 votes

@Wolf Essayez-le. C'est la seule preuve dont vous avez vraiment besoin. Ma citation est Stevens & Wright : on ne peut pas faire mieux que ça.

1 votes

Merci pour la réponse, je dois lire encore plus attentivement. Vous avez déjà écrit que UDP et TCP peuvent coexister .

48voto

Javier Points 33134

En principe, non.

Ce n'est pas gravé dans la pierre, mais c'est ainsi que toutes les API sont écrites : l'application ouvre un port, obtient un identifiant pour ce port, et le système d'exploitation la notifie (via cet identifiant) lorsqu'une connexion client (ou un paquet dans le cas d'UDP) arrive.

Si le système d'exploitation permettait à deux applications d'ouvrir le même port, comment saurait-il laquelle notifier ?

Mais... il y a des moyens de le contourner :

  1. En tant que Jed noté vous pourriez écrire un processus "maître", qui serait le seul à écouter réellement sur le port et à notifier les autres, en utilisant la logique qu'il souhaite pour séparer les demandes des clients.
    • Sous Linux et BSD (au moins), vous pouvez configurer des règles de "remappage" qui redirigent les paquets du port "visible" vers d'autres ports (où les applications écoutent), en fonction de n'importe quel critère lié au réseau (peut-être le réseau d'origine, ou certaines formes simples d'équilibrage de charge).

37 votes

iptables -m statistic --mode random --probability 0.5 est amusant.

2 votes

Que signifie exactement "Ouvre un port" ? Je comprends la phrase mais savez-vous ce que le système fait exactement quand il ouvre un port et le gère ? Je sais que lorsque vous voulez ouvrir un port avec TCP, vous obtenez un flux et ce flux est votre connexion avec le distant mais j'ai cherché sur le web et je n'ai pas trouvé une très bonne explication.

7 votes

@Samuel : ouvrir un port (en mode serveur) signifie obtenir un descripteur de fichier, et lorsque le système reçoit un paquet SYN vers ce numéro de port, il répond avec SYN+ACK et génère un événement sur le descripteur de fichier associé. l'application répond à cet événement avec un appel accept(), qui crée un nouveau descripteur de fichier associé au flux spécifique, laissant le descripteur serveur d'origine libre pour obtenir de nouvelles connexions des clients.

19voto

Jed Smith Points 9022

Non. Une seule application peut se lier à un port à la fois, et le comportement si la liaison est forcée est indéterminé.

Avec les sockets multicast -- qui semblent être loin de ce que vous voulez -- plus d'une application peut se lier à un port tant que SO_REUSEADDR est défini dans les options de chaque socket.

Pour ce faire, vous pouvez écrire un processus "maître" qui accepte et traite toutes les connexions, puis les transmet à vos deux applications qui doivent écouter sur le même port. C'est l'approche adoptée par les serveurs Web et autres, puisque de nombreux processus doivent écouter le port 80.

Au-delà, nous entrons dans les détails - vous avez marqué à la fois TCP et UDP, lequel des deux ? Aussi, quelle plateforme ?

0 votes

Les deux sont d'intérêt pour moi. La plate-forme est Windows, mais si la réponse est différente pour Linux, il serait bon de le savoir.

8 votes

Il n'existe pas de socket multicast. Il existe des sockets UDP. La multidiffusion n'est pas une condition préalable à SO_REUSEADDR.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X