Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cuántas conexiones TCP simultáneas puede tener un único servidor TCP?

¿Cuántas conexiones TCP simultáneas puede tener un único servidor TCP?

Una conexión larga significa que se pueden enviar varios paquetes de datos continuamente en una conexión TCP. Durante el período en que se mantiene la conexión TCP, si no se envían paquetes de datos, ambas partes deben enviar paquetes de detección para mantener la conexión. conexión. Generalmente, debe hacerlo usted mismo. Mantenido en línea.

Una conexión larga significa que cuando las partes comunicantes intercambian datos, se establece una conexión TCP. Después de enviar los datos, la conexión TCP se desconecta.

Salas de chat o sistemas de envío de mensajes instantáneos, etc., porque muchos mensajes deben enviarse al cliente hasta que se generan, por lo que cuando no se genera ningún mensaje, la conexión del cliente debe mantenerse en este. De esta manera, cuando hay una gran cantidad de Cuando se utiliza el cliente, se debe mantener una gran cantidad de conexiones largas.

Durante el proceso de prueba de rendimiento, a menudo me encuentro con problemas relacionados con la cantidad de conexiones. Hay una pregunta que me ha preocupado durante mucho tiempo, es decir, cuántas conexiones puede admitir un servidor como máximo. ?

Algunos amigos pueden decir que es 65535, porque el sistema operativo tiene 65535 puertos, entonces, ¿es correcta esta respuesta?

Primero, comprendamos cómo identificar un enlace (recuerde los siguientes conceptos, que se utilizarán más adelante en el artículo. El sistema operativo identifica un enlace TCP a través de una tupla de cuatro:

<). p> {ip local, puerto local, ip remota, puerto remoto}

Estos cuatro elementos determinan de forma única un enlace TCP. Si alguno de los elementos es diferente, se considera un enlace diferente.

En el sistema Linux, todo es un archivo. Cada enlace TCP ocupa un identificador de archivo. El número de enlaces que el sistema permite crear depende del límite superior del número de identificadores. Si crea un enlace más allá de este valor, obtendrá este error: "No se pueden abrir tantos archivos".

Puede ver el límite superior de la cantidad de archivos abiertos permitidos por el sistema actual mediante el comando ulimit -n. En Linux, este valor predeterminado es 1024, lo que significa que, de forma predeterminada, solo se pueden admitir 1024 enlaces. ser creado. Al mismo tiempo, este valor también se puede modificar. Al modificar el archivo /etc/security/limits.conf, puede cambiar este valor a un valor mayor. Generalmente, los servidores lo cambiarán a un valor grande. El servidor generalmente está configurado en 1000000.

¿Eso significa que mientras haga un gran cambio, el número de enlaces puede ser infinito?

De hecho, este no es el caso al crear un enlace, generalmente se divide en dos extremos, a saber, el extremo inicial del enlace y el extremo receptor del enlace.

Por ejemplo, ahora usamos Jmeter para pruebas de estrés. El sistema bajo prueba está implementado en el servidor Tomcat 10.0.0.3 y usa el puerto 8080.

Si utilizamos 5 concurrencias para las pruebas de estrés, el enlace creado se muestra a continuación:

Para Jmeter, es el iniciador del enlace y Jmeter crea 5 El enlace está conectado al puerto 8080 del servidor. Cada nuevo enlace ocupará un número de puerto, como 10001-10005 en la figura. En el sistema operativo, el rango de números de puerto es 0-65535, de los cuales 0-1024 son números de puerto reservados y no se pueden usar, y se pueden usar otros puertos. En otras palabras, en el extremo que inicia el enlace, teóricamente se pueden crear hasta unos 64.000 enlaces debido a la limitación del número de puerto.

Entonces, ¿hay alguna forma de superar este límite? ¡La respuesta es sí!

Se puede ver en las cuatro tuplas de identificación TCP que para el iniciador del enlace, la IP y el puerto locales afectan la cantidad de enlaces. El número de puerto está limitado a 65535 y no se puede aumentar. Luego podemos agregar IP local para lograr este propósito. En circunstancias normales, solo una IP está vinculada a una tarjeta de red del servidor y esta IP se utiliza para la comunicación externa. De hecho, la tarjeta de red admite un enlace a múltiples IP. Por supuesto, debe asegurarse de que las IP sean válidas y no se utilicen.

# ifconfig eth0: 1 10.0.0.5

El comando anterior puede agregar una ip 10.0.0.5 a la tarjeta de red eth0. Cada vez que la tarjeta de red del servidor agrega una ip, puede hacerlo. estar permitido en esta ip Cree otro número de enlaces alrededor de 65535.

Una vez hice una prueba de recuento de enlaces para una puerta de enlace de correo electrónico. El propósito era probar cuántas conexiones TCP largas podía recibir y mantener el servidor de la puerta de enlace. En circunstancias normales, limitado por el número de puerto 65535 de una sola máquina, si el cliente desea crear una conexión de 250.000 TCP de longitud, se necesitan al menos 4 máquinas. Al vincular varias direcciones IP a la tarjeta de red del cliente, se crearon con éxito 250.000 enlaces en una máquina.

Por supuesto, este método es solo una operación no convencional, solo para probar un determinado escenario especial. En circunstancias normales, no se recomienda vincular varias IP a la tarjeta de red.

Para el servidor Tomcat, es el extremo receptor de la conexión. ¿También está limitado a 65535?

No, como puede ver en la figura anterior, todos los enlaces iniciados por Jmeter se crean en el puerto 8080 del servidor Tomcat, lo que significa que para el extremo receptor del enlace, todos los enlaces ocupan el mismo puerto.

De acuerdo con la cuádruple identificación de TCP, se puede analizar que para un extremo receptor de un enlace, el número máximo de enlaces TCP = el número de todas las permutaciones de IP válidas * el número de puertos 64000. El resultado de esto El cálculo debe ser un número astronómico. Por lo tanto, el número de enlaces admitidos por el extremo receptor del enlace puede considerarse teóricamente infinito.

Algunos de los datos presentados anteriormente son teóricamente la cantidad de enlaces TCP que una sola máquina puede admitir. En circunstancias reales, cada enlace requiere crear una cierta cantidad de memoria, alrededor de 4-10 kb, por lo que la cantidad. El número de enlaces también está limitado por la memoria total de la máquina.

Para el iniciador de enlaces, solo hay alrededor de 64.000 enlaces cuando la vitalidad está completamente activada y la memoria máxima ocupada es de 640 M, que los clientes normales pueden satisfacer. El límite de memoria se considera principalmente en el. lado del servidor.

Aunque el clúster actual y la tecnología distribuida pueden compartir la carga concurrente en múltiples servidores para nosotros, entonces solo necesitamos expandir docenas de computadoras para resolver el problema, pero esperamos ser más grandes. Para un solo servidor, primero esfuércese por expandirse verticalmente y luego horizontalmente, lo que puede ahorrar efectivamente los gastos relacionados con el servidor (recursos de hardware, salas de computadoras, mano de obra de operación y mantenimiento y electricidad son en realidad una gran cantidad de gastos).

En primer lugar, debes considerar las limitaciones de los identificadores de archivos. Los amigos que escriben programas de servidor de red en Linux deben saber que cada conexión TCP ocupa un descriptor de archivo. Una vez que este descriptor de archivo se agota, el error que se nos devuelve cuando llega una nueva conexión es "Socket/Archivo: no se pueden abrir tantos archivos". ". En este momento es necesario comprender las limitaciones del sistema operativo en cuanto a la cantidad máxima de archivos que se pueden abrir.

Podemos modificar el número de identificadores de archivos mediante el comando ulimit -n, el archivo /etc/security/limits.conf y el archivo /etc/sysctl.conf.

Lo segundo que hay que considerar es la restricción del rango de puertos. En el sistema operativo, los números de puerto inferiores a 1024 están reservados por el sistema y los usuarios utilizan 1024-65535.

Dado que cada conexión TCP ocupa un número de puerto, podemos tener hasta más de 60.000 conexiones simultáneas.

Creo que hay muchos amigos que tienen esta idea equivocada, ¿verdad?

Los entrevistadores también prefieren guiar la investigación aquí. Preguntas similares incluyen: ¿Puede una conexión UDP reutilizar un puerto ya ocupado por una conexión TCP?

¿Cómo identificar una conexión TCP?

El sistema utiliza una tupla de 4 para identificar de forma única una conexión TCP:

Número de puerto local, dirección IP local ip local, número de puerto remoto puerto remoto, dirección IP remotaip remota.

El servidor normalmente escucha en un puerto local y espera la solicitud de conexión del cliente. Sin considerar la reutilización de direcciones (opción SO_REUSEADDR de Unix), incluso si hay varias IP en el lado del servidor, el puerto de escucha local es exclusivo, por lo que la conexión tcp del lado del servidor 4-tuple solo tiene una IP remota (es decir, la IP del cliente). y el puerto remoto (puerto del cliente) es variable, por lo que la conexión TCP máxima es la cantidad de IP del cliente × la cantidad de puertos del cliente. Para IPV4, independientemente de factores como la clasificación de la dirección IP, la cantidad máxima de conexiones TCP es aproximadamente 2. elevado a la 32.ª potencia (número de IP))×2 a la 16.ª potencia (número de puertos), es decir, el número máximo de conexiones TCP en una sola máquina en el lado del servidor es aproximadamente 2 elevado a la 48.ª potencia.

Las conclusiones dadas anteriormente se refieren al número teórico de conexiones TCP simultáneas en una sola máquina. De hecho, la cantidad de conexiones simultáneas en una sola máquina debe estar limitada por los recursos de hardware (memoria) y los recursos de red. (ancho de banda).

¿Cuál es el número máximo de conexiones admitidas por un único servidor?

blogs.com/zlingh/p/4814836.html

Prueba de estrés de un millón de conexiones largas Pregunta sobre desbordamiento de memoria de Nginx

blogs.com/liuyong/archive/2011/07/01/2095487.html

Configuración del sistema Linux –ulimit

blogs.com /cswuyg/ p/3653263.html

¿Qué significan las conexiones largas y los enlaces cortos en las conexiones de red?

/question/22677800

Optimización del rendimiento: uso de enlaces largos conexiones Mejorar el rendimiento del servicio

/p/118946284