Revise el establecimiento y la desconexión de la conexión TCP / IP y las causas comunes de una gran cantidad de estados TIME_WAIT y CLOSE_WAIT

Proceso de establecimiento y desconexión de la conexión:

 

CERRADO : Indica el estado inicial.
ESCUCHAR : Este es también un estado que es muy fácil de entender, significa que un SOCKET en el lado del servidor está en estado de escucha y puede aceptar conexiones.
SYN_RCVD : este estado indica que se ha recibido un mensaje SYN. ​​En circunstancias normales, este estado es un estado intermedio durante la sesión de protocolo de enlace de tres vías del SOCKET en el lado del servidor al establecer una conexión TCP. Es muy breve. Básicamente, apenas se puede ver con netstat En este estado, a menos que escriba deliberadamente un programa de prueba del cliente, no envíe deliberadamente el último mensaje ACK en el proceso de protocolo de enlace TCP de tres vías. Por lo tanto, en este estado, después de recibir el mensaje ACK del cliente, entrará en el estado ESTABLECIDO.
SYN_SENT : este estado se hace eco de la telepresencia SYN_RCVD. Cuando el cliente SOCKET ejecuta una conexión CONNECT, primero envía un mensaje SYN, por lo que ingresará inmediatamente al estado SYN_SENT y esperará a que el servidor envíe el segundo mensaje en el protocolo de enlace de tres vías. . El estado SYN_SENT indica que el cliente ha enviado un mensaje SYN.
ESTABLECIDO : Esto es fácil de entender, lo que indica que se ha establecido la conexión.
FIN_WAIT_1 : Este estado debe explicarse. De hecho, el verdadero significado de los estados FIN_WAIT_1 y FIN_WAIT_2 es ​​esperar el mensaje FIN de la otra parte. La diferencia entre estos dos estados es: el estado FIN_WAIT_1 en realidad significa que cuando el SOCKET está en el estado ESTABLISHED, quiere cerrar activamente la conexión y envía un mensaje FIN a la otra parte. En este momento, el SOCKET entra en el estado FIN_WAIT_1 . Cuando la otra parte responde al mensaje ACK, ingresa al estado FIN_WAIT_2. Por supuesto, en circunstancias normales reales, sin importar cuál sea la situación de la otra parte, debe responder inmediatamente al mensaje ACK, por lo que el estado FIN_WAIT_1 es generalmente más difícil de identificar. ver. El estado de FIN_WAIT_2 a menudo se puede ver con netstat a veces.
FIN_WAIT_2 : Este estado se ha explicado en detalle anteriormente. De hecho, el SOCKET en el estado FIN_WAIT_2 significa semi-conectado, es decir, una de las partes solicita cerrar la conexión, pero también le dice a la otra parte que todavía tengo algunos datos para enviar a usted por el momento. Cierre la conexión.
TIME_WAIT : Indica que se ha recibido el mensaje FIN de la otra parte y se ha enviado un mensaje ACK. Después de 2MSL, puede volver al estado disponible CERRADO. Si está en el estado FIN_WAIT_1, al recibir un mensaje con la bandera FIN y la bandera ACK al mismo tiempo, puede ingresar directamente al estado TIME_WAIT sin pasar por el estado FIN_WAIT_2.
CIERRE : Este estado es bastante especial, debería ser raro en situaciones reales y pertenece a un estado excepcional relativamente raro. En circunstancias normales, cuando envía un mensaje FIN, es lógico que primero reciba (o al mismo tiempo) el mensaje ACK de la otra parte y luego reciba el mensaje FIN de la otra parte. Pero el estado CLOSING significa que después de enviar el mensaje FIN, no recibió el mensaje ACK de la otra parte, sino que recibió el mensaje FIN de la otra parte. ¿En qué circunstancias sucederá esto? De hecho, si lo piensa detenidamente, no es difícil concluir: si ambas partes cierran un SOCKET casi al mismo tiempo, entonces habrá una situación en la que ambas partes envían mensajes FIN al mismo tiempo, es decir, el Aparecerá el estado CLOSING, indicando que ambas partes están cerrando la conexión SOCKET.
CLOSE_WAIT : El significado de este estado en realidad está esperando a cerrarse. ¿Cómo entenderlo? Cuando la otra parte cierra un SOCKET y se envía un mensaje FIN a sí mismo, su sistema sin duda responderá con un mensaje ACK a la otra parte y entrará en el estado CLOSE_WAIT en este momento. A continuación, lo que realmente debe considerar es ver si todavía tiene datos para enviar a la otra parte. Si no es así, puede cerrar el SOCKET y enviar un mensaje FIN a la otra parte, es decir, cerrar la conexión. Entonces, en el estado CLOSE_WAIT, lo que debe hacerse es esperar a que cierre la conexión.
LAST_ACK: Este estado es relativamente fácil de entender, es que después de que la parte cerrada pasivamente envía un mensaje FIN, finalmente espera el mensaje ACK de la otra parte. Después de recibir el mensaje ACK, puede ingresar al estado disponible CERRADO

 

El número de conexiones está relacionado con el identificador del sistema de archivos.

Ver con ulimt -n

Puede modificar /etc/security/limit.conf

Establecer el número de nofiles para un usuario

 

En algunos sistemas de alta concurrencia, a menudo hay una gran cantidad de estados TIME_WAIT y CLOSE_WAIT. Lo siguiente se enfoca en optimizar estos dos estados.

TIEMPO DE ESPERA:

Una gran cantidad de este estado a menudo indica que la simultaneidad del sistema es relativamente alta y que se establece y libera una gran cantidad de conexiones. Puede utilizar conexiones largas o recuperación rápida de conexiones cortas.

/etc/sysctl.conf

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

Luego ejecute para    /sbin/sysctl -p  que los parámetros surtan efecto.

net.ipv4.tcp_syncookies = 1   significa habilitar las cookies SYN. Cuando la cola de espera SYN se desborda, las cookies se habilitan para el procesamiento, lo que puede prevenir una pequeña cantidad de ataques SYN. ​​El valor predeterminado es 0, lo que significa que está cerrado;

net.ipv4.tcp_tw_reuse = 1   significa habilitar la reutilización. Permitir que los sockets TIME-WAIT se reutilicen para nuevas conexiones TCP, el valor predeterminado es 0, lo que significa que está cerrado;

net.ipv4.tcp_tw_recycle = 1   significa activar el reciclaje rápido de sockets TIME-WAIT en la conexión TCP, el valor predeterminado es 0, lo que significa cerrar.

net.ipv4.tcp_fin_timeout   modificar el tiempo de tiempo de espera predeterminado del sistema

 

CLOSE_WAIT:

El programa del servidor está en el estado CLOSE_WAIT en lugar del estado LAST_ACK, lo que indica que el FIN no se ha enviado al cliente, por lo que puede haber muchos datos que enviar u otras cosas que hacer antes de cerrar la conexión, lo que resulta el paquete FIN no se envía.

Pero el enchufe del cliente se ha desconectado.
En términos generales, CLOSE_WAIT durará al menos 2 horas. Si un pícaro escribió un programa especialmente para causarle un montón de CLOSE_WAIT y consumir
sus recursos, entonces, por lo general, el sistema habrá resuelto el bloqueo antes del momento del lanzamiento.
Este tiempo solo se puede acortar modificando los parámetros de TCP / IP: la modificación de la serie de parámetros tcp_keepalive_ * puede ayudar a resolver este problema.

Supongo que te gusta

Origin blog.csdn.net/yyws2039725/article/details/113826698
Recomendado
Clasificación