¿Cuál es el número máximo teórico de conexiones TCP abiertas que puede tener una caja Linux moderna?

Suponiendo un rendimiento infinito desde el hardware, ¿puede una caja Linux soportar> 65536 conexiones TCP abiertas?

Entiendo que el número de puertos efímeros (<65536) limita el número de conexiones de una IP local a un puerto en una IP remota.

La tupla (ip local, puerto local, IP remota, puerto remoto) es lo que define de manera única una conexión TCP; ¿Esto implica que se pueden admitir más de 65K conexiones si más de uno de estos parámetros son gratuitos? por ejemplo, conexiones a un solo número de puerto en múltiples hosts remotos desde múltiples IP locales.

¿Hay otro límite de 16 bits en el sistema? ¿Número de descriptores de archivos quizás?

Un solo puerto de escucha puede aceptar más de una conexión simultáneamente.

Hay un límite de ’64K’ que a menudo se cita, pero es por cliente por puerto de servidor y necesita aclaración.

Cada paquete TCP / IP tiene básicamente cuatro campos para direccionamiento; estos son:

source_ip source_port destination_ip destination_port < client > < server > 

Dentro de la stack TCP, estos cuatro campos se usan como una clave compuesta para unir paquetes a conexiones (por ejemplo, descriptores de archivos).

Si un cliente tiene muchas conexiones al mismo puerto en el mismo destino, tres de esos campos serán los mismos: solo el source_port varía para diferenciar las diferentes conexiones. Los puertos son números de 16 bits, por lo tanto, la cantidad máxima de conexiones que un cliente determinado puede tener con un puerto de host determinado es de 64 K.

Sin embargo, múltiples clientes pueden tener hasta 64K conexiones con el puerto de cada servidor, y si el servidor tiene múltiples puertos o cualquiera de ellos es multi-hogar, puede multiplicar eso más.

Entonces, el límite real son los descriptores de archivos. A cada conexión de socket individual se le asigna un descriptor de archivo, por lo que el límite es realmente el número de descriptores de archivo que el sistema ha sido configurado para permitir y los recursos manejar. El límite máximo es típicamente superior a 300 K, pero se puede configurar, por ejemplo, con sysctl .

Los límites realistas de los que se jactan para las cajas normales son alrededor de 80K, por ejemplo, los servidores de mensajería Jabber de subproceso único.

Si está pensando en ejecutar un servidor e intenta decidir cuántas conexiones se pueden atender desde una máquina, le recomendamos que lea sobre el problema C10k y los posibles problemas que implica atender a muchos clientes simultáneamente.

Si usó un socket raw ( SOCK_RAW ) y reimplementó TCP en userland, creo que la respuesta está limitada en este caso solo por el número de tuplas (~ (local address, source port, destination address, destination port) ^ (local address, source port, destination address, destination port) (~ 2 ^ 64 por dirección local).

Por supuesto, requerirá mucha memoria mantener el estado de todas esas conexiones, y creo que tendrías que configurar algunas reglas de iptables para evitar que la stack TCP del núcleo se disguste y / o responda en tu nombre.