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
Respuestas:
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.
fuente
Eso es lo máximo en la práctica, generalmente es más bajo. Por ejemplo, Linux usa el
net.ipv4.ip_local_port
parámetro del kernel para definir los puertos que se usan para las conexiones salientes. Esto suele ser algo así comoPuede aumentar el número disponible con sysctl, p. Ej.
o puede editar /etc/sysctl.conf con la misma información
Todos los ejemplos que he encontrado muestran que el valor mínimo también es 1024.
fuente
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:
Para que esto funcione, necesitará leer la respuesta a este hilo .
fuente
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 :)
fuente
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.
fuente