Deux applications sur la même machine peuvent-elles se lier au même port et à la même adresse IP? Pour aller plus loin, une application peut-elle écouter les demandes provenant d'une certaine IP et l'autre vers une autre IP distante? Je sais que je peux avoir une application qui démarre deux threads (ou fourches) pour avoir un comportement similaire, mais deux applications qui n'ont rien en commun peuvent-elles faire de même?
283
Réponses:
La réponse diffère selon le système d'exploitation envisagé. En général cependant:
Pour TCP, non. Vous ne pouvez avoir qu'une seule application à l'écoute sur le même port à la fois. Maintenant, si vous aviez 2 cartes réseau, vous pourriez avoir une application écouter sur la première IP et la seconde sur la deuxième IP en utilisant le même numéro de port.
Pour UDP (Multicasts), plusieurs applications peuvent s'abonner au même port.
Edit: Depuis Linux Kernel 3.9 et versions ultérieures, la prise en charge de plusieurs applications écoutant le même port a été ajoutée à l'aide de l'
SO_REUSEPORT
option. Plus d'informations sont disponibles sur cet article lwn.net.la source
Oui (pour TCP), deux programmes peuvent écouter sur la même socket, si les programmes sont conçus pour cela. Lorsque le socket est créé par le premier programme, assurez-vous que l'
SO_REUSEADDR
option est définie sur le socket avant vousbind()
. 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 l' un des programmes, pas les deux, donc elle ne duplique pas la connexion, elle permet simplement à deux programmes de répondre à la demande entrante. Par exemple, les serveurs Web auront plusieurs processus écoutant tous sur le port 80, et l'O / S envoie une nouvelle connexion au processus qui est prêt à accepter de nouvelles connexions.Permet à d'autres sockets d'accéder à
bind()
ce port, sauf s'il existe déjà un socket d'écoute actif lié au port. Cela vous permet de contourner ces messages d'erreur «Adresse déjà utilisée» lorsque vous essayez de redémarrer votre serveur après un plantage.la source
SO_REUSEADDR
ne vous permet certainement pas d'avoir deux sockets TCP en état d'écoute en même temps, au moins sur Unix. Il est destiné à contourner leTIME_WAIT state
: unixguide.net/network/socketfaq/4.5.shtml . Cela peut fonctionner sur Windows, mais vous n'êtes pas garanti que la demande atteindra le bon serveur de toute façon).Oui.
Plusieurs sockets TCP d'écoute, tous liés au même port, peuvent coexister, à condition qu'ils soient tous liés à différentes adresses IP locales. Les clients peuvent se connecter à celui dont ils ont besoin. Cela exclut
0.0.0.0
(INADDR_ANY
).Plusieurs sockets acceptés peuvent coexister, tous acceptés à partir du même socket d'écoute, tous affichant le même numéro de port local que le socket d'écoute.
Plusieurs sockets UDP tous liés au même port peuvent tous coexister à condition que la même condition soit en (1) ou qu'ils aient tous eu l'
SO_REUSEADDR
option définie avant la liaison.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'empêche pas son utilisation pour UDP, et vice versa.
Référence: Stevens & Wright, TCP / IP Illustrated, Volume II.
la source
En principe, non.
Ce n'est pas écrit dans la pierre; mais c'est la façon dont toutes les API sont écrites: l'application ouvre un port, obtient un descripteur et le système d'exploitation le notifie (via ce descripteur) lorsqu'une connexion client (ou un paquet dans le cas UDP) arrive.
Si le système d'exploitation permettait à deux applications d'ouvrir le même port, comment saurait-il laquelle notifier?
Mais ... il existe des moyens de contourner cela:
la source
iptables -m statistic --mode random --probability 0.5
est drole.listen()
. Plus probablement, la question est de l'ouvrir dans le pare-feu. Beaucoup trop d'erreurs ici, et toutes non corrigées en 7 ans. La réponse omet également le cas de la liaison à une adresse locale différente avec le même numéro de port. C'est en fait totalement incorrect.Oui certainement . Pour autant que je m'en souvienne A partir de la version 3.9 du noyau (je ne suis pas sûr de la version), le support pour le a
SO_REUSEPORT
été introduit.SO_RESUEPORT
permet de se lier au même port et à la même adresse, Tant que le premier serveur définit cette option avant de lier son socket.Cela fonctionne pour TCP et UDP . Reportez-vous au lien pour plus de détails: SO_REUSEPORT
Remarque : la réponse acceptée n'est plus vraie selon moi.
la source
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 ne ressemblent en rien à 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.
Vous pouvez accomplir cela en écrivant 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 que les serveurs Web et autres adoptent, car de nombreux processus doivent écouter 80.
Au-delà de cela, nous entrons dans les détails - vous avez marqué à la fois TCP et UDP, quel est-il? Et quelle plateforme?
la source
Vous pouvez avoir une application à l'écoute sur un port pour une interface réseau. Vous pourriez donc avoir:
httpd
écoute sur une interface accessible à distance, p.ex.192.168.1.1:80
127.0.0.1:80
Un exemple de cas d'utilisation pourrait être d'utiliser
httpd
comme équilibreur de charge ou proxy.la source
Une autre manière est d'utiliser un programme d'écoute dans un port qui analyse le type de trafic (ssh, https, etc.) qu'il redirige en interne vers un autre port sur lequel le "vrai" service écoute.
Par exemple, pour Linux, sslh: https://github.com/yrutschle/sslh
la source
Lorsque vous créez une connexion TCP, vous demandez de vous connecter à une adresse TCP spécifique, qui est une combinaison d'une adresse IP (v4 ou v6, selon le protocole que vous utilisez) et d'un port.
Lorsqu'un serveur écoute les connexions, il peut informer le noyau qu'il souhaite écouter une adresse IP et un port spécifiques, c'est-à-dire une adresse TCP, ou sur le même port sur chacune des adresses IP de l'hôte (généralement spécifié avec l'adresse IP
0.0.0.0
), qui écoute efficacement de nombreuses "adresses TCP" différentes (par exemple192.168.1.10:8000
,127.0.0.1:8000
, etc.)Non, vous ne pouvez pas avoir deux applications écoutant la même "adresse TCP", car lorsqu'un message arrive, comment le noyau pourrait-il savoir à quelle application transmettre le message?
Cependant, dans la plupart des systèmes d'exploitation, vous pouvez configurer plusieurs adresses IP sur une seule interface (par exemple, si vous avez
192.168.1.10
une interface, vous pouvez également configurer192.168.1.11
, si personne d'autre sur le réseau ne l'utilise), et dans ces cas, vous pourrait avoir des applications distinctes écoutant sur le port8000
de chacune de ces deux adresses IP.la source
Si au moins une des adresses IP distantes est déjà connue, statique et dédiée à ne parler qu'à l'une de vos applications, vous pouvez utiliser la règle iptables (table nat, chaîne PREROUTING) pour rediriger le trafic entrant de cette adresse vers le port local "partagé" vers tout autre port où l'application appropriée écoute réellement.
la source
Oui et non. Une seule application peut écouter activement sur un port. Mais cette application peut léguer sa connexion à un autre processus. Vous pouvez donc avoir plusieurs processus travaillant sur le même port.
la source
Oui.
De cet article:
https://lwn.net/Articles/542629/
la source
Si par applications, vous entendez plusieurs processus, alors oui, mais généralement NON. Par exemple, le serveur Apache exécute plusieurs processus sur le même port (généralement 80), en désignant l'un des processus pour se lier réellement au port, puis en utilisant ce processus pour effectuer des transferts vers divers processus qui acceptent les connexions.
la source
Vous pouvez faire en sorte que deux applications écoutent le même port sur la même interface réseau.
Il ne peut y avoir qu'un seul socket d'écoute pour l'interface réseau et le port spécifiés, mais ce socket peut être partagé entre plusieurs applications.
Si vous avez un socket d'écoute dans un processus d'application et vous
fork
ce processus, le socket sera hérité, donc techniquement il y aura maintenant deux processus écoutant le même port.la source
J'ai essayé ce qui suit, avec
socat
:Et même si je n'ai pas établi de connexion avec le socket, je ne peux pas écouter deux fois sur le même port, malgré l'
reuseaddr
option.Je reçois ce message (auquel je m'attendais auparavant):
la source
Juste pour partager ce que @jnewton a mentionné. J'ai commencé un nginx et un processus tomcat intégré sur mon mac. Je peux voir les deux processus s'exécuter à 8080.
la source
Réponse courte:
En passant par la réponse donnée ici . Vous pouvez avoir deux applications écoutant sur la même adresse IP et le même numéro de port, tant l'un des ports est un port UDP, tandis que l'autre est un port TCP.
Explication:
Le concept de port est pertinent sur la couche de transport de la pile TCP / IP, donc tant que vous utilisez différents protocoles de couche de transport de la pile, vous pouvez avoir plusieurs processus à l'écoute sur le même
<ip-address>:<port>
combinaison.Un doute que les gens ont est que si deux applications s'exécutent sur la même
<ip-address>:<port>
combinaison, comment un client s'exécutant sur une machine distante fera-t-il la distinction entre les deux? Si vous regardez l'en-tête du paquet de couche IP ( https://en.wikipedia.org/wiki/IPv4#Header ), vous verrez que les bits 72 à 79 sont utilisés pour définir le protocole, c'est ainsi que la distinction peut être faite.Si toutefois vous voulez avoir deux applications sur la même
<ip-address>:<port>
combinaison TCP , la réponse est non (un exercice intéressant sera de lancer deux machines virtuelles, de leur donner la même adresse IP, mais des adresses MAC différentes, et de voir ce qui se passe - vous remarquerez que parfois VM1 recevra des paquets, et d'autres fois VM2 recevra des paquets - en fonction de l'actualisation du cache ARP).Je pense qu'en faisant fonctionner deux applications sur le même
<op-address>:<port>
vous voulez obtenir une sorte d'équilibrage de charge. Pour cela, vous pouvez exécuter les applications sur différents ports et écrire des règles de table IP pour bifurquer le trafic entre elles.Voir également la réponse de @ user6169806.
la source