65536 +1 Conexión en un sistema

35

Hay 65536 puertos para cada sistema en la red, y cada conexión o envío / recepción utilizará uno de esos.

Mi pregunta es: ¿qué pasa si tenemos 65536 + 1 conexiones?

Sé que no sucede de manera normal, pero tengo curiosidad por saber cómo lo manejan los sistemas operativos.

Omid Golparvar
fuente
12
La conexión sería rechazada. Pero en realidad tendrá problemas mucho, mucho antes de que 65535 abra las conexiones.
ChrisInEdmonton
1
@ChrisInEdmonton No. Si se trata de una conexión saliente, recibirá un error de enlace ya que no puede asignar un puerto local. Si es una conexión entrante, el límite de puerto no se aplica.
usuario207421
si la conexión es aproximada, recibirá una conexión rechazada, si es saliente, su llamada de socket tendrá un error. No pondré esto como respuesta porque no estoy seguro.
Jorge Aldo

Respuestas:

61

Tenga en cuenta que un sistema puede manejar más de 65536 conexiones concurrentes, ya que no necesariamente utilizan un puerto separado.

Una conexión TCP o flujo UDP se define mediante la 4-tupla:

(source IP address, source port, destination IP address, destination port)

Por lo tanto, incluso si tiene una máquina de servidor web con una sola dirección IP y un solo paquete de software de servidor HTTP que solo escucha en el puerto 80, en teoría podría manejar 65536 conexiones por dirección IP de cliente que se conecta a ella . Entonces, las conexiones de 64Ki desde la dirección IP 1 del cliente, más las conexiones de 64Ki desde la dirección IP 2 del cliente, etc.

Por lo tanto, los protocolos admiten, en una primera aproximación, 2 48 conexiones / flujos a un solo puerto TCP o UDP en una sola dirección IPv4. Considere juntos TCP y UDP, y tanto el espacio de direcciones de IPv4 como el espacio de direcciones cósmicamente / cómicamente grande de IPv6, y puede ver que es probable que los protocolos en sí mismos nunca sean la fuente del límite para el número de conexiones concurrentes que un host puede manejar.

Del mismo modo, no hay nada en los protocolos TCP o UDP que impida que una máquina cliente use un solo puerto de origen en una sola dirección IP para realizar múltiples conexiones salientes a varias direcciones y puertos de servidor. A veces, las API de red de un sistema operativo dado pueden no facilitar esto, pero es importante recordar que, digamos, la antigua y venerable API "[BSD] Sockets" es solo una API para TCP y UDP. TCP y UDP pueden tener capacidades que no están expuestas por la API de Sockets tradicional.

Por lo tanto, la cantidad de conexiones TCP concurrentes o flujos UDP que puede manejar un host determinado está limitada no tanto por los números de puerto, sino por los recursos del sistema, como el espacio RAM y el tiempo de CPU que se necesita para realizar un seguimiento de todas esas conexiones y atenderlas a todas. Además, los detalles específicos de la implementación de un sistema operativo pueden imponer límites artificiales. Por ejemplo, en la filosofía "todo es un archivo" de Unix, puede haber un descriptor de archivo para cada conexión TCP o flujo UDP. Si su núcleo Unix tiene un límite en la cantidad de descriptores de archivo que puede rastrear, ese límite de descriptor de archivo es un límite artificial en la cantidad de conexiones TCP concurrentes o flujos UDP que su núcleo puede manejar.

Spiff
fuente
2
Puede valer la pena vincular a en.wikipedia.org/wiki/C10k_problem en esta excelente respuesta.
ChrisInEdmonton
1
Implementé un servidor TCP que podía acomodar 65.534 conexiones desde cada dirección IP posible simultáneamente. No hace mucho, simplemente hace eco del texto entrante con algunas sustituciones de caracteres, pero se ejecuta en una plataforma de hardware muy pequeña. No creo que sea bastante compatible con RFC, pero parece funcionar bastante bien, a pesar de no saber ni importar cuántas conexiones TCP están abiertas en la mayoría de sus puertos.
supercat
2
Si realmente necesita conectar más de 65536 conexiones entre dos máquinas, puede configurar las máquinas para que usen varias direcciones IP. Cada dirección IP que agregue a las dos máquinas aumenta el número máximo de conexiones de forma cuadrática (al menos en teoría, es más probable que encuentre otros problemas primero).
Lie Ryan