2011-05-10 26 views
6

Como los números de puerto están limitados a 65536, ¿existe un límite para la conexión num?Número de conexiones de red posibles

¿Cómo se diferencia cada conexión entre sí?

Si es por puerto, entonces nunca puede haber más de 65536 conexiones al mismo tiempo?

Respuesta

8

Hay muchas piezas diferentes en juego. Como una conexión está definida por (Src IP, Src Port, Dest IP, Dest Port) tuplas, se permiten 65536^2 conexiones entre dos pares dados en un momento dado: de 1 a 1, de 1 a 2, ... de 1 a 65535, etc. Y eso es solo entre dos pares: por supuesto, puede tener muchas conexiones abiertas para muchos compañeros al mismo tiempo.

PERO, la mayoría de los sistemas operativos limitan la cantidad de descriptores/identificadores de archivo abiertos por proceso. Este límite era históricamente bajo (20), pero ahora a menudo es más alto (1024 en mi sistema, ulimit -a mostrará los límites por proceso en bash(1)).

Además de los límites de setrlimit(3) en los sistemas Unix, también existen límites para todo el sistema; /proc/sys/fs/file-max en un sistema Linux informará la cantidad máxima de archivos abiertos permitidos en todo el sistema. (Esto es 596118 en mi sistema.) Otros sistemas tendrán límites diferentes.

Y, puede haber un límite en el número de conexiones abiertas impuestas por un stateful firewall en el medio. Dado que cada estado requiere memoria en las tablas del firewall, cualquiera probablemente imponga algún límite arbitrario para evitar quedarse sin memoria.

+0

'65536^2' es el número de conexiones entre ** 2 especificado ** IP, ¿verdad? – DriverBoy

+1

No es necesario aumentar el número de descriptores de archivos para usar muchos puertos porque los sockets LINGER están activos después de que se cierran. – ikegami

+0

@DriverBoy, sí, ese es el máximo teórico entre dos direcciones IP. En la práctica, el máximo puede ser más bajo. – ikegami

6

Una conexión TCP se identifica realmente por la dirección IP par + puerto par + dirección IP local + puerto local, por lo que podría tener mucho más de 64k, pero no sé si los SO hacen el trabajo para permitir más de 64k por dirección IP local. Windows no.

Una cosa de interés es que los puertos pueden permanecer reservados por un corto tiempo después de que se cierren. (Esto se hace para evitar la diafonía accidental o intencional entre las conexiones antiguas y las nuevas.) Simplemente creando y cerrando una conexión en lazo cerrado, puede hacer que su máquina se quede sin puertos. Consulte http://www.perlmonks.org/?node_id=897591 para ver el código de Perl que colgará las llamadas de conexión de socket (en algunas máquinas) al usar todos los sockets.

UDP también tiene puertos, pero UDP no tiene conexiones. Por lo tanto, el socket se identifica solo por su dirección IP local + puerto local, por lo que uno puede tener un máximo de 64k de puertos UPD en el camino por dirección IP local.

Actualización: Párrafo añadido en UDP.

Cuestiones relacionadas