¿Pueden dos aplicaciones en la misma máquina unirse al mismo puerto y dirección IP? Yendo un paso más allá, ¿puede una aplicación escuchar solicitudes provenientes de una determinada IP y la otra a otra IP remota? Sé que puedo tener una aplicación que comience dos hilos (o bifurcaciones) para tener un comportamiento similar, pero ¿pueden dos aplicaciones que no tienen nada en común hacer lo mismo?
283
Respuestas:
La respuesta difiere según qué sistema operativo se esté considerando. En general, sin embargo:
Para TCP, no. Solo puede tener una aplicación escuchando en el mismo puerto a la vez. Ahora, si tuviera 2 tarjetas de red, podría hacer que una aplicación escuche en la primera IP y la segunda en la segunda IP usando el mismo número de puerto.
Para UDP (Multicasts), varias aplicaciones pueden suscribirse al mismo puerto.
Editar: desde Linux Kernel 3.9 y posterior, se agregó soporte para múltiples aplicaciones que escuchan el mismo puerto usando la
SO_REUSEPORT
opción. Más información está disponible en este artículo de lwn.net.fuente
Sí (para TCP) puede hacer que dos programas escuchen en el mismo socket, si los programas están diseñados para hacerlo. Cuando el primer programa crea el socket, asegúrese de que la
SO_REUSEADDR
opción esté configurada en el socket antes que ustedbind()
. Sin embargo, esto puede no ser lo que quieres. Lo que esto hace es que una conexión TCP entrante se dirigirá a uno de los programas, no a ambos, por lo que no duplica la conexión, solo permite que dos programas atiendan la solicitud entrante. Por ejemplo, los servidores web tendrán múltiples procesos, todos escuchando en el puerto 80, y el O / S envía una nueva conexión al proceso que está lista para aceptar nuevas conexiones.Permite otros zócalos a
bind()
este puerto, a menos que ya haya un zócalo de escucha activo vinculado al puerto. Esto le permite evitar los mensajes de error "Dirección ya en uso" cuando intenta reiniciar su servidor después de un bloqueo.fuente
SO_REUSEADDR
ciertamente no le permite tener dos sockets TCP en estado de escucha al mismo tiempo, al menos en Unix. Está destinado a moverse porTIME_WAIT state
: unixguide.net/network/socketfaq/4.5.shtml . Puede funcionar en Windows, pero no está garantizado que la solicitud llegue al servidor correcto de todos modos).Si.
Pueden coexistir múltiples sockets TCP de escucha, todos vinculados al mismo puerto, siempre que estén vinculados a diferentes direcciones IP locales. Los clientes pueden conectarse a la que necesiten. Esto excluye
0.0.0.0
(INADDR_ANY
).Pueden existir múltiples sockets aceptados , todos aceptados desde el mismo socket de escucha, todos mostrando el mismo número de puerto local que el socket de escucha.
Múltiples zócalos UDP, todos vinculados al mismo puerto, pueden coexistir siempre que se cumpla la misma condición que en (1) o todos hayan establecido la
SO_REUSEADDR
opción antes del enlace.Los puertos TCP y los puertos UDP ocupan espacios de nombres diferentes, por lo que el uso de un puerto para TCP no impide su uso para UDP, y viceversa.
Referencia: Stevens & Wright, TCP / IP Ilustrado, Volumen II.
fuente
En principio, no.
No está escrito en piedra; pero es la forma en que se escriben todas las API: la aplicación abre un puerto, obtiene un identificador y el sistema operativo lo notifica (a través de ese identificador) cuando llega una conexión de cliente (o un paquete en caso UDP).
Si el sistema operativo permitiera que dos aplicaciones abrieran el mismo puerto, ¿cómo sabría cuál notificar?
Pero ... hay formas de evitarlo:
fuente
iptables -m statistic --mode random --probability 0.5
es divertido.listen()
conectar. Lo más probable es que la pregunta sea sobre abrirlo en el firewall. Demasiados errores aquí, y todos sin corregir en 7 años. La respuesta también omite el caso de enlace a diferentes direcciones locales con el mismo número de puerto. De hecho, es totalmente incorrecto.Si definitivamente . Por lo que recuerdo, desde la versión 3.9 del kernel (no estoy seguro de la versión)
SO_REUSEPORT
se introdujo el soporte para .SO_RESUEPORT
permite vincular exactamente al mismo puerto y dirección, siempre que el primer servidor configure esta opción antes de vincular su socket.Funciona tanto para TCP como para UDP . Consulte el enlace para más detalles: SO_REUSEPORT
Nota : La respuesta aceptada ya no es válida según mi opinión.
fuente
No. Solo una aplicación puede enlazarse a un puerto a la vez, y el comportamiento si el enlace es forzado es indeterminado.
Con sockets de multidifusión, que no parecen estar cerca de lo que desea, más de una aplicación puede vincularse a un puerto siempre que SO_REUSEADDR esté configurado en las opciones de cada socket.
Puede lograr esto escribiendo un proceso "maestro", que acepte y procese todas las conexiones, luego las entregue a sus dos aplicaciones que necesitan escuchar en el mismo puerto. Este es el enfoque que adoptan los servidores web y similares, ya que muchos procesos necesitan escuchar 80.
Más allá de esto, estamos entrando en detalles: etiquetó tanto TCP como UDP, ¿cuál es? Además, ¿qué plataforma?
fuente
Puede tener una aplicación escuchando en un puerto para una interfaz de red. Por lo tanto, podrías tener:
httpd
escuchando en una interfaz accesible remotamente, p. ej.192.168.1.1:80
127.0.0.1:80
Un caso de uso de muestra podría ser usar
httpd
como equilibrador de carga o proxy.fuente
Otra forma es usar un programa que escucha en un puerto que analiza el tipo de tráfico (ssh, https, etc.) que redirige internamente a otro puerto en el que escucha el servicio "real".
Por ejemplo, para Linux, sslh: https://github.com/yrutschle/sslh
fuente
Cuando crea una conexión TCP, solicita conectarse a una dirección TCP específica, que es una combinación de una dirección IP (v4 o v6, dependiendo del protocolo que esté usando) y un puerto.
Cuando un servidor escucha las conexiones, puede informar al kernel que le gustaría escuchar una dirección IP y un puerto específicos, es decir, una dirección TCP, o en el mismo puerto en cada una de las direcciones IP del host (generalmente especificado con la dirección IP
0.0.0.0
), que está a la escucha de manera efectiva en una gran cantidad de diferentes direcciones TCP "" (por ejemplo,192.168.1.10:8000
,127.0.0.1:8000
, etc.)No, no puede tener dos aplicaciones escuchando en la misma "dirección TCP", porque cuando llega un mensaje, ¿cómo sabría el núcleo a qué aplicación entregar el mensaje?
Sin embargo, en la mayoría de los sistemas operativos puede configurar varias direcciones IP en una sola interfaz (por ejemplo, si tiene
192.168.1.10
una interfaz, también puede configurarla192.168.1.11
, si nadie más en la red la está usando), y en esos casos usted podría tener aplicaciones separadas escuchando en el puerto8000
en cada una de esas dos direcciones IP.fuente
Si al menos una de las IP remotas ya es conocida, estática y dedicada a hablar solo con una de sus aplicaciones, puede usar la regla de iptables (tabla nat, PREROUTING en cadena) para redirigir el tráfico entrante de esta dirección al puerto local "compartido" a cualquier otro puerto donde realmente escuche la aplicación apropiada.
fuente
Si y no. Solo una aplicación puede escuchar activamente en un puerto. Pero esa aplicación puede dejar su conexión a otro proceso. Entonces podría tener múltiples procesos trabajando en el mismo puerto.
fuente
Si.
De este artículo:
https://lwn.net/Articles/542629/
fuente
Si por aplicaciones te refieres a múltiples procesos, sí, pero generalmente NO. Por ejemplo, el servidor Apache ejecuta múltiples procesos en el mismo puerto (generalmente 80). Se hace mediante la designación de uno de los procesos para que realmente se una al puerto y luego use ese proceso para realizar transferencias a varios procesos que aceptan conexiones.
fuente
Puede hacer que dos aplicaciones escuchen el mismo puerto en la misma interfaz de red.
Solo puede haber un socket de escucha para la interfaz de red y el puerto especificados, pero ese socket se puede compartir entre varias aplicaciones.
Si tiene un socket de escucha en un proceso de aplicación y
fork
ese proceso, el socket se heredará, por lo que técnicamente ahora habrá dos procesos escuchando el mismo puerto.fuente
He intentado lo siguiente, con
socat
:Y aunque no he realizado una conexión al socket, no puedo escuchar dos veces en el mismo puerto, a pesar de la
reuseaddr
opción.Recibo este mensaje (que esperaba antes):
fuente
Solo para compartir lo que @jnewton mencionó. Comencé un nginx y un proceso de tomcat incrustado en mi mac. Puedo ver que ambos procesos se ejecutan en 8080.
fuente
Respuesta corta:
Yendo por la respuesta dada aquí . Puede tener dos aplicaciones escuchando en la misma dirección IP y número de puerto, siempre que uno de ellos sea un puerto UDP, mientras que otro sea un puerto TCP.
Explicación:
El concepto de puerto es relevante en la capa de transporte de la pila TCP / IP, por lo tanto, siempre que utilice diferentes protocolos de la capa de transporte de la pila, puede tener múltiples procesos escuchando en la misma
<ip-address>:<port>
combinación.Una duda que la gente tiene es que si dos aplicaciones se ejecutan en la misma
<ip-address>:<port>
combinación, ¿cómo distinguirá un cliente que se ejecuta en una máquina remota entre las dos? Si observa el encabezado del paquete de la capa IP ( https://en.wikipedia.org/wiki/IPv4#Header ), verá que los bits 72 a 79 se utilizan para definir el protocolo, así es como se puede hacer la distinción.Sin embargo, si desea tener dos aplicaciones en la misma
<ip-address>:<port>
combinación de TCP , entonces la respuesta es no (un ejercicio interesante será lanzar dos máquinas virtuales, darles la misma dirección IP, pero diferentes direcciones MAC, y ver qué sucede; notará que algunas veces VM1 obtendrá paquetes, y otras veces VM2 obtendrá paquetes, dependiendo de la actualización de caché ARP).Creo que al hacer que dos aplicaciones se ejecuten en la misma
<op-address>:<port>
, desea lograr algún tipo de equilibrio de carga. Para esto, puede ejecutar las aplicaciones en diferentes puertos y escribir reglas de tabla IP para bifurcar el tráfico entre ellas.Ver también la respuesta de @ user6169806.
fuente