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

236

Suponiendo un rendimiento infinito del hardware, ¿puede una caja Linux admitir> 65536 abrir conexiones TCP?

Entiendo que la cantidad de puertos efímeros (<65536) limita la cantidad 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 exclusiva una conexión TCP; ¿esto implica que se pueden admitir más de 65K conexiones si más de uno de estos parámetros están libres? 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?

fadedbee
fuente

Respuestas:

350

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 usan como una clave compuesta para unir paquetes con 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 source_portvarí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 64K.

Sin embargo, varios clientes pueden tener hasta 64K conexiones con el puerto de algún servidor, y si el servidor tiene múltiples puertos o cualquiera de ellos está alojado, entonces puede multiplicarlo aún más.

Entonces, el límite real son los descriptores de archivo. Cada conexión de socket individual recibe 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 para manejar. El límite máximo suele ser superior a 300 K, pero es configurable, por ejemplo, con sysctl .

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

Será
fuente
3
Teóricamente puede tener más de 64K conexiones salientes si (a) usa SO_REUSEADDR y (b) apunta a diferentes direcciones IP de destino. Pero los límites de memoria del kernel probablemente lo detendrán primero.
Darron
44
El límite de sysctl es para todo el sistema, ¿verdad? También hay un límite configurable con ulimit, que limita el número máximo de descriptores de archivo para un proceso. Eso es por defecto mucho menos de 300K, generalmente 1024.
pacoverflow
1
Un ligero tecnicismo: una máquina cliente también puede tener múltiples direcciones IP asignadas desde un enrutador. Todos estos pueden asignarse a un solo MAC, o esa máquina puede tener múltiples interfaces de red físicas para direcciones IP adicionales. El OP especificó 1 IP, pero es importante que otros no descarten más direcciones IP.
Todd
2
@Will Bellamente explicado !! Muy útil ... Me gustaría dar +100 votos a favor ... gracias :-)
Tom Taylor
1
Tenga en cuenta que tcp_fin_timeout bloquea el mismo socket (fuente, destino, combinación de puerto) durante otros 60 segundos de forma predeterminada, lo que reduce en gran medida el número de conexiones tcp realmente disponibles entre dos sistemas, si las conexiones se desconectan y se vuelven a conectar con frecuencia. Este problema se puede minimizar permitiendo reutilizar (tcp_tw_reuse = 1) sockets en el estado TIME_WAIT (no siempre compatible) o rompiendo el estándar TCP / IP para reducir este tiempo de espera a un valor inferior (generalmente funciona bien de todos modos).
fgwaller
17

Si está pensando en ejecutar un servidor y está tratando de decidir cuántas conexiones se pueden servir desde una máquina, es posible que desee leer sobre el problema C10k y los posibles problemas relacionados con el servicio simultáneo de muchos clientes.

Spaceghost
fuente
14
C10k tiene 10 años y ya no es divertido. [Lea esto] para ver cómo se puede abordar C1024K.
Chandranshu
@Chandranshu: ¿quiso decir metabrew.com/article/… ?
Mikko Rantalainen
1
@MikkoRantalainen: sí. Creo que hay mejores puntos de referencia disponibles ahora. Los muchachos de Phoenix ya lo han llevado a 2 millones de conexiones simultáneas.
Chandranshu
3
@Chandranshu - hay una demostración de Dell con conexiones de 12M: mrotaru.wordpress.com/2013/06/20/…
Mikko Rantalainen
1
Hace unos años: Intel Atom D2700, 2 GB de RAM, 1,2 millones de conexiones concurrentes. Los únicos problemas que tuve fueron con los cuadros de Windows en el trabajo de prueba; estos regularmente se arruinaron al intentar hacer DoS la caja Intel Atom ...
Klaws
12

Si utilizó un socket sin procesar ( SOCK_RAW) y volvió a implementar TCP en el país de usuario, creo que la respuesta está limitada en este caso solo por el número de (local address, source port, destination address, destination port)tuplas (~ 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 núcleo se altere y / o responda en su nombre.

sbirch
fuente