¿El puerto de origen TCP debe ser único por host?

10

Aprendí que la tupla identifica una conexión TCP (IP de origen, puerto de origen, IP de destino, puerto de destino). Teóricamente, debería ser posible tener un cliente de host1: puerto1 conectado al servidor1: puerto1 y al mismo tiempo otro cliente (ejecutándose en host1) de host1: puerto1 a servidor2: puerto1.

He probado un poco en Java, y hasta ahora parece posible.

Sin embargo, he leído varias veces que el puerto de origen debe ser único para la dirección del host, lo que básicamente significa que hay un límite estricto de como máximo 65536 conexiones TCP salientes concurrentes. ¿Es eso cierto?

Actualización: Aquí está mi código Java. Esto parece funcionar, y netstat -t muestra claramente dos conexiones salientes activas desde el puerto 9990 (una a 9997, una a 9998). Al menos en un Linux moderno, ¿parece posible?

Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);


Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);

Y la salida netstat -t (truncada):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 
lxgr
fuente
"Si está preguntando acerca de los límites superiores de los sistemas bien diseñados, es casi seguro que lo está haciendo mal "
Chris S

Respuestas:

16

No es un requisito de TCP. En lo que respecta a TCP, solo la combinación de IP de origen, puerto de origen, IP de destino y puerto de destino debe ser única. Sin embargo, en la práctica, la mayoría de las API de TCP no proporcionan ninguna forma de crear más de una conexión con el mismo puerto de origen, a menos que tengan direcciones IP de origen diferentes.

David Schwartz
fuente
2
¡Gracias, eso responde completamente a la parte teórica de mi pregunta! Supongo que tendré que probar para cada implementación de TCP.
lxgr
5

Eso es lo máximo en la práctica, generalmente es más bajo. Por ejemplo, Linux usa el net.ipv4.ip_local_portparámetro del kernel para definir los puertos que se usan para las conexiones salientes. Esto suele ser algo así como

sysctl net.ipv4.ip_local_port_range 32768 to 61000

Puede aumentar el número disponible con sysctl, p. Ej.

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

o puede editar /etc/sysctl.conf con la misma información

net.ipv4.ip_local_port_range = 10000 65535

Todos los ejemplos que he encontrado muestran que el valor mínimo también es 1024.

usuario9517
fuente
1

Además de la respuesta de Iain (arriba), que solo puede haber 10,000 puertos permitidos para conexiones salientes por su núcleo, en teoría, al menos está limitado a un conjunto de puertos XX, XXX por dirección IP en el adaptador. Dado que 127.1 no está disponible para el mundo exterior, al estar en la red local, entonces para cada dirección IP ( externa ) tienen un conjunto de puertos de salida dentro de su rango de puertos de 65K.

Entonces el límite saliente es realmente:

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

Para que esto funcione, necesitará leer la respuesta a este hilo .

djangofan
fuente
0

Si. Esto es verdad.

Los puertos deben vincularse y las aplicaciones con la red.

No puede tener más de 65553 aplicaciones conectadas por TCP y 65535 conectadas por UDP en el mismo host. Los sistemas operativos normalmente administraban dinámicamente los puertos y asignan uno para cada aplicación que se conecta a la red.

Si tiene dos aplicaciones que escuchan en el mismo puerto cuando llega un paquete de red, la computadora no podría saber a qué aplicación entregará los datos. Como ejemplo, si tiene Messenger y Skype en el mismo puerto en el mismo puerto, su mensaje de Messenger aparecerá en Skype y viceversa :)

Ricardo Polo
fuente
Creo que la pregunta no era sobre el límite superior en la cantidad de aplicaciones de escucha, que, como usted señala, está limitado por la cantidad de números de puerto únicos, sino sobre la cantidad de sockets que funcionan a la vez. Los servidores web a menudo tienen docenas de sockets, todos dirigidos a su único puerto 80 o 443. Si muchos servidores en un host lo hicieron, entonces no hay razón para que el número de sockets abiertos no pueda exceder 2 ^ 32.
Brandon Rhodes
0

Aunque un sistema puede tener un límite en la cantidad de conexiones TCP abiertas, normalmente no tiene restricciones con respecto a los números de puerto utilizados. Sin embargo, una buena implementación de TCP debe evitar usar el mismo par de sockets dos veces. (socket = dirección IP + puerto). Sin embargo, se asigna un puerto a un proceso para evitar el robo de conexiones, y el método habitual es solicitar un puerto libre para un puerto de escucha o para uno saliente. Esto evita duplicar sockets salientes y por lo tanto duplicar conexiones. Si no se usa ese método, la aplicación en sí debe evitar la creación de conexiones duplicadas.

Papou
fuente
3
¿Cómo agrega esto algo nuevo a las respuestas ya publicadas en esta vieja pregunta?
Chris S