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? Plus loin, une application peut-elle écouter des requêtes 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 est-ce que deux applications qui n'ont rien en commun peuvent faire la même chose?
16 réponses
pour TCP, no. Vous ne pouvez avoir qu'une seule application écoutant sur le même port à la fois. Maintenant, si vous aviez 2 cartes réseau, vous pourriez avoir une application listen 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.
Oui (pour TCP) vous pouvez avoir deux programmes écouter sur le même socket, si les programmes sont conçus pour faire. Lorsque la socket est créée par le premier programme, assurez-vous que l'option SO_REUSEADDR
est positionnée sur la socket avant bind()
. Cependant, ce n'est peut-être pas ce que vous voulez. Ce que cela fait est une connexion TCP entrante sera dirigée à un des programmes, pas les deux, de sorte qu'il ne duplique pas la connexion, il permet juste deux programmes pour servir le demande entrante. Par exemple, les serveurs web auront des processus multiples tous écoutés sur le port 80, et L'O/s envoie une nouvelle connexion au processus qui est prêt à accepter de nouvelles connexions.
SO_REUSEADDR
permet d'autres sockets à bind()
à ce port, à moins qu'il n'y ait déjà une socket d'écoute active reliée au port. Cela vous permet de contourner les messages d'erreur "Address already in use" lorsque vous essayez de redémarrer votre serveur après un crash.
En principe, non.
ce n'est pas écrit dans la pierre, mais c'est la façon dont tous les API sont écrites: l'application ouvre un port, reçoit une poignée vers lui, et L'OS l'avertit (via cette poignée) quand 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 y a des moyens de l'éviter:
- Comme Jed a noté , vous pourriez écrire un processus "maître", qui serait le seul qui écoute vraiment sur le port et en avertit les autres, en utilisant toute logique qu'il veut séparer les requêtes des clients.
- sur Linux et BSD (au moins) vous pouvez configurer des règles de "remapping" qui redirigent les paquets du port "visible" vers différents ports (où les applications sont à l'écoute), selon des critères liés au réseau (peut-être réseau d'origine, ou certaines formes simples d'équilibrage de charge).
Oui.
-
les sockets TCP d'écoute Multiple, tous reliés au même port, peuvent coexister, à condition qu'ils soient tous reliés à des adresses IP locales différentes. Les Clients peuvent se connecter à celui dont ils ont besoin. Cela exclut
0.0.0.0
(INADDR_ANY
). -
Multiple accepté sockets peuvent co-exister, acceptés à partir de la même socket d'écoute, tout en montrant le même local numéro de port comme prise d'écoute.
-
les sockets UDP multiples tous reliés au même port peuvent coexister à condition qu'ils soient dans la même condition qu'en (1) ou qu'ils aient tous eu l'option
SO_REUSEADDR
avant de se lier. -
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.
Pas de. Une seule application peut se lier à un port à la fois, et le comportement si la liaison est forcée est indéterminé.
avec des sockets multicast -- qui sonnent comme nulle part près de ce que vous voulez -- plus d'une application peut se lier à un port aussi longtemps que SO_REUSEADDR est défini dans les options de chaque socket.
vous pourriez accomplir ceci en écrivant un processus "maître", qui accepte et traite toutes les connexions, puis les remet à vos deux applications qui ont besoin d'écouter sur le même port. C'est l'approche que les serveurs Web et d'autres prennent, puisque de nombreux processus doivent écouter 80.
au-delà de cela, nous entrons dans les détails -- vous avez étiqueté TCP et UDP, qui est-ce? Aussi, quelle plate-forme?
Oui Certainement . Pour autant que je me souvienne de la version 3.9 du noyau (pas sûr sur la version), le support pour le SO_REUSEPORT
a été introduit. SO_RESUEPORT
permet de lier le même port et la même adresse, à condition que le premier serveur règle cette option avant de lier sa socket.
il fonctionne à la fois pour TCP et UDP . Voir le lien pour plus de détails: SO_REUSEPORT
Note : la réponse acceptée n'est plus valable à mon avis.
vous pouvez avoir une application d'écoute sur un port pour une interface réseau. Vous auriez donc pu:
-
httpd
écoute sur une interface accessible à distance, p.ex.192.168.1.1:80
- un autre démon écoutant
127.0.0.1:80
cas D'utilisation de L'échantillon pourrait être d'utiliser httpd
comme un équilibreur de charge ou une approximation.
une autre façon 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 service" réel " écoute.
par exemple, pour Linux, sslh: https://github.com/yrutschle/sslh
si au moins un des IPs distants est déjà connu, statique et dédié à parler uniquement à l'une de vos applications, vous pouvez utiliser la règle iptables (table nat, chaîne PREROUTING) pour rediriger le trafic provenant de cette adresse vers un port local" partagé " vers tout autre port où l'application appropriée écoute réellement.
Oui et non. Une seule application peut écouter activement sur un port. Mais cette application peut léguer son lien à un autre processus. Vous pouvez donc avoir plusieurs processus travaillant sur le même port.
Oui.
de cet article:
https://lwn.net/Articles/542629 /
la nouvelle option socket permet à plusieurs sockets sur le même hôte de se lier au même port
lorsque vous créez une connexion TCP, vous demandez à 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 pour des connexions, il peut informer le noyau qu'il souhaite écouter une adresse IP et un port spécifiques, c'est-à-dire une adresse IP, ou sur toutes les adresses IP des hôtes, chacune sur un port spécifique, qui est effectivement à l'écoute sur beaucoup de TCP différents " les adresses" (par exemple, 192.168.1.10:8000, 127.0.0.1:8000, etc.)
Non, vous ne pouvez pas avoir deux applications écoutant sur la même "adresse TCP", parce que quand un message arrive, comment le noyau pourrait-il savoir à quelle application donner le message?
vous, Cependant, dans la plupart des systèmes d'exploitation, vous pouvez configurer plusieurs adresses IP sur une interface unique (par exemple, si vous avez 192.168.1.10 sur une interface, vous pouvez également configurer 192.168.1.11, si personne d'autre sur le réseau dans ces cas, vous pouvez avoir des applications séparées écoutant sur le port 8000 sur chacune de ces deux adresses IP.
si par applications vous voulez dire 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).C'est fait en désignant un des processus pour se lier réellement au port et ensuite utiliser ce processus pour faire des transferts à divers processus qui acceptent les connexions.
vous pouvez faire écouter deux applications pour le même port sur la même interface réseau.
il ne peut y avoir qu'une seule socket d'écoute pour l'interface réseau et le port spécifiés, mais cette socket peut être partagée entre plusieurs applications.
si vous avez une socket d'écoute dans un processus de demande et vous fork
ce processus, la socket sera hérité, donc techniquement il y aura maintenant deux processus écoutant le même port.
j'ai essayé ce qui suit, avec socat
:
socat TCP-L:8080,fork,reuseaddr -
et même si je n'ai pas fait de connexion avec la socket, Je ne peux pas écouter deux fois sur le même port, malgré l'option reuseaddr
.
je reçois ce message (auquel je m'attendais avant):
2016/02/23 09:56:49 socat[2667] E bind(5, {AF=2 0.0.0.0:8080}, 16): Address already in use
brève réponse:
selon la réponse donnée ici . Vous pouvez avoir deux applications écoutant sur la même adresse IP, et le numéro de port, donc tant que l'une du port est un port UDP, tandis que l'autre est un port TCP.
explication:
le concept de port est pertinent sur la couche transport de la pile TCP/IP, donc aussi longtemps que vous utilisez différents protocoles de couche de transport de la pile, vous pouvez avoir plusieurs processus d'écoute sur la même combinaison <ip-address>:<port>
.
un doute que les gens ont est si deux applications sont en cours d'exécution sur la même combinaison <ip-address>:<port>
, comment un client courant sur une machine distante distinguer entre les deux? Si vous regardez l'en-tête de paquet de la 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 comment la distinction peut être faite.
si toutefois vous voulez avoir deux applications sur la même combinaison TCP <ip-address>:<port>
, alors la réponse est non (un exercice intéressant sera de lancer deux VM, leur donner la même adresse IP, mais des adresses MAC différentes, et voir ce qui se passe - vous remarquerez que parfois VM1 va obtenir des paquets, et d'autres fois VM2 va obtenir des paquets - en fonction de l'ARP cache refresh).
je sens qu'en faisant deux les applications fonctionnent 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 eux.
Voir aussi la réponse de @user6169806.