¿Pueden dos aplicaciones escuchar el mismo puerto?


¿Pueden dos aplicaciones en la misma máquina enlazarse 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 comienza con dos subprocesos (o bifurcaciones) para tener un comportamiento similar, pero ¿pueden hacer lo mismo dos aplicaciones que no tienen nada en común?

Author: ROMANIA_engineer, 2009-11-07

16 answers

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 tener una aplicación que escuchara en la primera IP y la segunda en la segunda IP utilizando el mismo número de puerto.

Para UDP (multidifusión), varias aplicaciones pueden suscribirse al mismo puerto.

 212
Author: Chris Dail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-06 18:44:03

Sí (para TCP) puede hacer que dos programas escuchen en el mismo socket, si los programas están diseñados para hacerlo. Cuando el socket sea creado por el primer programa, asegúrese de que la opción SO_REUSEADDR esté configurada en el socket antes que usted bind(). 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, web los servidores 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á listo para aceptar nuevas conexiones.

SO_REUSEADDR

Permite que otros sockets bind() a este puerto, a menos que ya haya un socket de escucha activo vinculado al puerto. Esto le permite evitar los mensajes de error de" Dirección ya en uso " cuando intenta reiniciar su servidor después de un bloqueo.

 85
Author: JNewton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 20:45:48

En principio, no.

No está escrito en stone; pero es la forma en que se escriben todas las API: la aplicación abre un puerto, recibe un controlador y el sistema operativo lo notifica (a través de ese controlador) cuando llega una conexión de cliente (o un paquete en el caso UDP).

Si el sistema operativo permitía que dos aplicaciones abrieran el mismo puerto, ¿cómo sabría cuál notificar?

Pero... hay formas de evitarlo:

  1. Como Jed señaló , podría escribir un proceso 'maestro', que sería el único que realmente escucha en el puerto y notifica a los demás, utilizando cualquier lógica que desee para separar las solicitudes de los clientes.
    • En Linux y BSD (al menos) puede configurar reglas de 'reasignación' que redirigen paquetes desde el puerto 'visible' a otros diferentes (donde las aplicaciones están escuchando), de acuerdo con cualquier criterio relacionado con la red (tal vez la red de origen, o algunas formas simples de equilibrio de carga).
 45
Author: Javier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:48

Sí.

  1. Múltiples sockets TCP de escucha, todos vinculados al mismo puerto, pueden coexistir, siempre que todos estén vinculados a diferentes direcciones IP locales. Los clientes pueden conectarse a la que necesiten. Esto excluye 0.0.0.0 (INADDR_ANY).

  2. Múltiples sockets aceptados pueden coexistir, todos aceptados desde el mismo socket de escucha, todos mostrando el mismo número de puerto local que el socket de escucha.

  3. Múltiples sockets UDP enlazados al mismo puerto todos pueden coexistir siempre que se cumpla la misma condición que en (1) o que todos hayan tenido la opción SO_REUSEADDR establecida antes del enlace.

  4. Los puertos TCP y los puertos UDP ocupan diferentes espacios de nombres, por lo que el uso de un puerto para TCP no excluye su uso para UDP, y viceversa.

Referencia: Stevens & Wright, TCP / IP Illustrated, Volume II.

 42
Author: user207421,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-30 08:47:16

No. Solo una aplicación puede enlazar a un puerto a la vez, y el comportamiento si el enlace es forzado es indeterminado.

Con sockets multicast which que suenan muy lejos de lo que quieres more más de una aplicación puede enlazarse a un puerto siempre y cuando SO_REUSEADDR esté configurado en las opciones de cada socket.

Puede lograr esto escribiendo un proceso "maestro", que acepta y procesa todas las conexiones, y luego las entrega a sus dos aplicaciones que necesitan escuchar en el mismo puerto. Este es el enfoque que los servidores web y tales toman, ya que muchos procesos necesitan escuchar 80.

Más allá de esto, estamos entrando en detalles you etiquetaste tanto TCP como UDP, ¿cuál es? Además, ¿qué plataforma?

 18
Author: Jed Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-07 19:39:54

Sí, Definitivamente. Por lo que recuerdo, desde la versión 3.9 del kernel (No estoy seguro de la versión) en adelante se introdujo el soporte para SO_REUSEPORT. SO_RESUEPORT permite enlazar exactamente al mismo puerto y dirección, siempre y cuando el primer servidor establezca esta opción antes de enlazar su socket.

Funciona tanto para TCPcomo 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.

 12
Author: piyush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-13 08:47:33

Puede tener una aplicación escuchando en un puerto para una interfaz de red. Por lo tanto usted podría tener:

  1. httpd escuchar en una interfaz de acceso remoto, por ejemplo, 192.168.1.1:80
  2. otro demonio escuchando en 127.0.0.1:80

Ejemplo de caso de uso podría ser usar httpd como un balanceador de carga o un proxy.

 3
Author: SummerBreeze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-20 06:52:53

Otra forma es utilizar 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 el servicio "real" está escuchando.

Por ejemplo, para Linux, sslh: https://github.com/yrutschle/sslh

 3
Author: Mitchbcn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-28 09:37:03

Si al menos una de las IPs remotas ya es conocida, estática y dedicada a hablar solo con una de sus aplicaciones, puede usar la regla iptables (tabla nat, cadena PREROUTING) para redirigir el tráfico entrante desde esta dirección al puerto local "compartido" a cualquier otro puerto donde la aplicación apropiada realmente escuche.

 2
Author: Stemar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-05 21:24:48

Sí y no. Solo una aplicación puede escuchar activamente en un puerto. Pero esa aplicación puede legar su conexión a otro proceso. Por lo que podría tener varios procesos trabajando en el mismo puerto.

 1
Author: rajesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-15 16:56:25

Sí.

De este artículo:
https://lwn.net/Articles/542629/

La opción nuevo socket permite que varios sockets en el mismo host se vinculen al mismo puerto

 1
Author: user6169806,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-07 02:46:36

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é utilizando) y un puerto.

Cuando un servidor escucha conexiones, puede informar al núcleo que le gustaría escuchar una dirección IP y un puerto específicos, es decir, una dirección IP, o en todas las direcciones IP de los hosts, cada una en un puerto específico, que efectivamente está escuchando en muchas "direcciones TCP" diferentes (p. ej., 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 entra un mensaje, ¿cómo sabría el núcleo a qué aplicación dar 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 en una interfaz, también puede configurar 192.168.1.11, si nadie más en la red lo usa), y en esos casos puede tener separe las aplicaciones que escuchan en el puerto 8000 en cada una de esas dos direcciones IP.

 1
Author: Curt J. Sampson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-18 07:53:46

Si por aplicaciones se refiere a múltiples procesos, entonces sí, pero generalmente NO. Por ejemplo, el servidor Apache ejecuta varios procesos en el mismo puerto (generalmente 80). Se hace designando uno de los procesos para que se vincule al puerto y luego use ese proceso para hacer transferencias a varios procesos que aceptan conexiones.

 0
Author: nitinsh99,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-23 00:19:51

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.

 0
Author: warvariuc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-30 09:28:54

He intentado lo siguiente, con socat:

socat TCP-L:8080,fork,reuseaddr -

Y aunque no he hecho una conexión al socket, no puedo escuchar dos veces en el mismo puerto, a pesar de la opción reuseaddr.

Recibo este mensaje (que esperaba antes):

2016/02/23 09:56:49 socat[2667] E bind(5, {AF=2 0.0.0.0:8080}, 16): Address already in use
 0
Author: aDoN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-23 10:00:17

Respuesta Corta:

Siguiendo la respuesta dada aquí. Puede tener dos aplicaciones escuchando en la misma dirección IP y número de puerto, siempre que uno de los puertos sea un puerto UDP, mientras que el 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 y cuando esté utilizando diferentes protocolos de capa de transporte de la pila, puede tener varios procesos escuchando en la misma <ip-address>:<port> combinado.

Una duda que tienen las personas es si dos aplicaciones se ejecutan en la misma combinación <ip-address>:<port>, ¿cómo distinguirá un cliente que se ejecuta en una máquina remota entre las dos? Si nos fijamos en el encabezado del paquete de 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 combinación TCP <ip-address>:<port>, 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 lo que sucede-se dará cuenta de que algunas veces VM1 obtendrá paquetes, y otras veces VM2 obtendrá paquetes - dependiendo de la actualización de caché ARP).

Siento que al hacer que dos aplicaciones se ejecuten en el mismo <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 ellos.

También vea la respuesta de @user6169806.

 -1
Author: Sahil Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:48