tcp linux-kernel port file-descriptor

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



linux-kernel port (3)

Si está pensando en ejecutar un servidor e intentar decidir cuántas conexiones pueden servirse desde una máquina, es posible que desee leer sobre el problema de C10k y los posibles problemas relacionados con la entrega simultánea de muchos clientes.

Suponiendo un rendimiento infinito del hardware, ¿puede una caja de Linux admitir> 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 forma ú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 archivo quizás?


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

Por supuesto, se necesitaría mucha memoria para mantener el estado de todas esas conexiones, y creo que tendría que configurar algunas reglas de iptables para evitar que la pila TCP del kernel se enoje o responda en su nombre.


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 que 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 pila TCP, estos cuatro campos se utilizan como una clave compuesta para hacer coincidir los paquetes con las conexiones (por ejemplo, descriptores de archivos).

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

Sin embargo, varios clientes pueden tener hasta 64K de conexiones al puerto de algún servidor, y si el servidor tiene varios puertos o es multi-homed, entonces puede multiplicar eso.

Así que el límite real es descriptores de archivos. A cada conexión de socket 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 configurado para permitir y los recursos para manejar. El límite máximo suele ser superior a 300 K, pero es configurable, por ejemplo, con sysctl .

Los límites realistas que se ofrecen para las cajas normales son alrededor de 80K, por ejemplo, servidores de mensajería Jabber de un solo hilo.