¿Cómo es posible servir más de 65535 conexiones simultáneamente, cuando el número de puerto TCP es un número de 16 bits?

Respuesta corta: porque se usa más que solo el número de puerto del servidor para identificar una conexión.

Respuesta larga: cuando un sistema operativo obtiene un datagrama de IP entrante marcado como utilizando el protocolo TCP, los demultiplexa (los asigna a la conexión TCP apropiada) de acuerdo con el datagrama:

  • Dirección IP origen
  • puerto TCP de origen
  • Dirección IP de destino
  • puerto TCP de destino

Estos cuatro valores forman una clave, y todos deben ser iguales para que dos datagramas entrantes cuenten como pertenecientes a la “misma” conexión.

Un servidor web típico escuchará solo en los puertos 80 y quizás 443. Contrariamente a los detalles de la pregunta, el sistema operativo no “asigna un número de puerto aleatorio” cuando acepta una conexión. El socket creado recientemente devuelto por accept () seguirá estando en el puerto del servidor 80 o 443.

Pero el sistema operativo puede determinar a qué conexión está destinado un datagrama entrante (incluso si todos están destinados al puerto 80), porque los datagramas entrantes que pertenecen a diferentes conexiones tendrán diferentes direcciones IP de origen o números de puerto.

En otras palabras, incluso un servidor que solo escucha en un solo puerto y una dirección IP aún puede manejar una cantidad gigantesca de conexiones. El límite es de 60000+ de cada cliente en particular a un servidor en particular . Sin embargo, cualquier servidor puede manejar más de 60000 conexiones entre sí con una dirección IP (en otras palabras, miles de millones de conexiones entrantes, especialmente si cuenta IPv6).

(Esto podría ser un problema si tuviera más de 60,000 máquinas detrás de un solo traductor de direcciones de red, compartiendo una dirección IP, y todas quisieran hacer una conexión TCP al mismo servidor remoto. Esto es parte de por qué “NAT de nivel de operador “requiere cierto esfuerzo para hacerlo bien y por qué IPv6 sería una buena idea).

Las conexiones TCP se identifican mediante una tupla de 4 (Source_IP_Addr, Source_Port, Destination_IP_Addr, Destination_Port). La mayoría de los sistemas accesibles con acceso a Internet tendrán al menos dos direcciones IP (127.0.0.1 y otra). También hay dos protocolos IP: IPv4 (direcciones de 32 bits) e IPv6 (direcciones de 128 bits).

Incluso si solo está haciendo IPv4 con una dirección pública, sigue siendo un número ENORME: aproximadamente 2 a la 64a potencia como máximo, aunque probablemente podría reducirlo a la 60a o 56a potencia ignorando las direcciones IPv4 inutilizables.

He ejecutado sistemas de producción (Linux) con más de 40 direcciones IPv4 y 20 direcciones IPv6. Tengo sistemas FreeBSD en casa con 10 direcciones IPv4 más modestas (en mis redes internas).

Es posible con cierta cantidad de ajustes y posiblemente depende de la implementación del proceso del servidor.

Primero, recuerde que un servidor usa la misma dirección IP de escucha y el mismo puerto de escucha para todos los sockets: identifica cada socket por la IP del cliente y los puertos efímeros (puerto efímero).

Al igual que los descriptores de archivos, que son enteros que el kernel usa para identificar los archivos a los que accede un proceso, los descriptores de sockets se usan para identificar sockets. Cuantos más estén disponibles para un proceso, más se pueden abrir sockets. ( http://www.cs.dartmouth.edu/~cam …)

Puede aumentar el máximo no. de descriptores de socket con ulimit (por ejemplo, ulimit -n 20000000) en linux. También es posible que tenga que verificar / proc / sys / fs / nr_open ya que eso pone un máximo en el número de descriptores (¿Cómo se puede aumentar el número máximo de descriptores de archivos en Linux a más de 1040000?)

La implementación del proceso del servidor con respecto a qué tan eficiente maneja la memoria y la CPU y los núcleos de la CPU y la cantidad de hardware de memoria disponible en última instancia limita la cantidad de conexión de socket. Por ejemplo, si el proceso se basa en Java, es necesaria cierta cantidad de ajustes JVM.

Otros métodos para obtener muchas conexiones de socket es usar alias de dirección IP en la tarjeta de red ya que (como ya se mencionó en una respuesta, aquí), la identidad es una n-tupla.

Dependiendo de la extensión del número de conexiones, podría ser necesario otro ajuste del núcleo para mejorar la memoria y el rendimiento.

Estás pensando en esto al revés.

Un servidor web seguro, por ejemplo, generalmente escucha en 443 en el lado del servidor. Todas las conexiones a este servidor HTTPS se producen en 443 como el puerto de destino para clientes remotos. La razón por la que esto funciona es porque la IP del cliente es única y eso es todo lo que el servidor necesita saber.

¡El límite real sería 65535 conexiones, por cliente!

Sugiero echar un vistazo a la captura de paquetes de un servidor web y un cliente a través de Wireshark (o similar) para ver esto en acción.

El servidor utiliza el puerto de origen + la combinación de dirección IP para rastrear una conexión de cliente. Entonces, la limitación es más similar a “un cliente no puede conectarse a más de 65535- (menos puertos comunes) servidores”

Eso es 65,000 puertos de duplicación por dirección IP. Entonces simplemente vincula a su oyente a diferentes direcciones IP, o hace lo mismo para otros usos que requieren más de 2 múltiplos de 65 sockets.

Crea ranuras en el protocolo de aplicación y luego las usa para multiplexar varias conexiones en un puerto (por cierto, de la misma manera que UDP)

More Interesting

Bluetooth: ¿Cuál es la diferencia entre BluetoothSocket y TCP IP Socket?

¿Cuál es el mejor localizador de IP? ¿Por qué?

¿Cuánto cobrarías por un día cero dentro de la suite TCP / IP?

¿Qué es una dirección IP enrutable? ¿Cómo puedo determinar si estoy usando uno?

En TCP, cada vez que ocurre un tiempo de espera para un segmento en el remitente, ¿hacemos un inicio lento en lugar de una disminución multiplicativa?

¿Por qué TCP necesita cuatro temporizadores diferentes?

¿Funciona un socket de red en la capa 4 o 5 de un modelo OSI o un modelo TCP / IP? Si funciona en la capa 4, entonces qué hace realmente la capa de sesión, cuando los sockets son las conexiones reales que actúan como una interfaz entre la aplicación y las capas inferiores.

¿Por qué se inventó Internet?

¿Cómo funciona el servidor de chat de Facebook?

Alguien intenta constantemente hackear todas mis cuentas de Internet y todas las direcciones IP son de Filipinas. ¿Qué debería hacer ahora?

¿Hay algún escenario en el que podamos quedarnos sin direcciones IPv6?

¿Es posible saber cuántas personas están usando la misma dirección IP pública?

¿Cómo las VPN gratuitas como SecurityKiss, Hotspot Shield, DroidVPN, etc. pueden cambiar su dirección IP? Si está en un sistema normal si obtiene una dirección IP dinámica, ¿no tenemos la opción de cambiarla?

¿Cómo se deciden las direcciones IP privadas?

Cómo hacer un sistema TCP / IP mediante el cual cualquiera de las partes pueda iniciar una conexión