Red de conocimientos turísticos - Conocimientos sobre calendario chino - Un artículo le explica cómo se agita TCP.

Un artículo le explica cómo se agita TCP.

Se requieren cuatro ondas cuando se desconecta TCP. Ambas partes en comunicación pueden desconectarse activamente y los recursos ocupados por ambas partes en comunicación se liberarán.

¿Por qué reciclar se tarda cuatro veces?

La razón es que después de que el cliente inicia activamente el mensaje FIN, solo significa que el cliente ya no puede enviar datos activamente pero aún puede recibir datos. Después de que el servidor responde al mensaje ACK, es posible que aún se estén procesando datos que deban enviarse al cliente, por lo que el mensaje FIN solo se puede enviar después de que el servidor haya procesado los datos y haya expresado su acuerdo para cerrar la conexión.

Por lo tanto, los mensajes ACK y FIN en el servidor deben enviarse por separado y la onda se vuelve cuatro veces.

¿Qué son MSL y TTL?

TTL es un campo en el encabezado IP que hace referencia al número máximo de rutas que puede pasar un datagrama IP. Cada enrutador debe restarse 1. Cuando el valor TTL es 0, el datagrama se descartará y el mensaje ICMP se enviará al host de origen. La unidad de TTL es el número de saltos de enrutamiento.

MSL es el tiempo máximo que un mensaje puede existir en la red, transcurrido el cual será descartado.

¿Por qué TIME_WAIT necesita 2MSL para cerrarse?

El paquete de datos del remitente en la red debe enviarse primero al servidor y luego al cliente después de ser procesado por el servidor, por lo que lleva el doble de tiempo.

Cuando el cliente recibe el mensaje FIN y envía el mensaje ACK, comienza el tiempo 2MSL. Si el servidor no recibe el mensaje ACK en este momento, lo que hace que el servidor agote el tiempo de espera y retransmita, y el cliente recibe el mensaje FIN nuevamente, entonces 2MSL iniciará el temporizador nuevamente.

El MSL predeterminado en LINUX es 30 s, lo que significa que el tiempo TIME_WAIT es 60 s.

¿Por qué necesitamos el estado TIME_WAIT?

La parte que inicia la interrupción de la conexión necesita tener el estado TIME_WAIT por las siguientes razones:

Evitar la recepción de paquetes de datos de conexiones antiguas.

Suponiendo que no existe el estado TIME_WAIT, si se utiliza una conexión TCP en el mismo puerto, el paquete de datos retrasado con SEQ=301 en la figura anterior llega al cliente y el cliente puede recibir el mensaje normalmente. , y se producirá confusión de datos en este momento.

Pero a través del tiempo de espera de 2MSL, los paquetes de datos de ambas partes pueden desaparecer en la red y los nuevos paquetes de datos deben ser para la nueva conexión.

Asegúrate de que la conexión esté cerrada correctamente.

Al esperar 2MSL, se garantiza que la parte desconectada pasivamente reciba el último mensaje ACK y se apague normalmente.

Arriba, si el servidor no recibe el último mensaje ACK, estará en el estado LAST_ACK. Si el cliente inicia un nuevo mensaje SYN para solicitar una conexión, el servidor enviará un mensaje RST al cliente y no se podrá establecer la conexión.

Pero esperar 2MSL resolverá el problema anterior, porque suponiendo que el servidor no reciba el último mensaje ACK, activará una retransmisión de tiempo de espera y reenviará el mensaje FIN, esperando un nuevo mensaje ACK. Cuando el cliente recibe un nuevo mensaje FIN, reenviará el mensaje ACK y actualizará el temporizador 2MSL, lo que en última instancia garantiza que la conexión del servidor se pueda cerrar normalmente.

Las desventajas de demasiado time_waiting

Si el servidor tiene una conexión en el estado TIME_WAIT, significa que la desconexión de la conexión TCP es iniciada por el servidor. En este momento, si hay demasiadas conexiones en TIME_WAIT, ocurrirán los siguientes problemas:

Hay varias formas de optimizar TIME_WAIT, cada método tiene ventajas y desventajas:

Abrir red Opciones .ipv4.tcp_tw_reuse y net.ipv4.tcp_timestamps.

Después de activar este parámetro, el socket en TIME_WAIT se puede reutilizar para nuevas conexiones.

La función de tcp_tw_reuse solo se puede utilizar para el iniciador de conexión. Después de activar este parámetro, al llamar a la función de conexión, el kernel buscará aleatoriamente conexiones con un tiempo de espera de más de 1 segundo para la reutilización de nuevas conexiones.

Net.ipv4.tcp_timestamp está activado de forma predeterminada, lo que significa que la compatibilidad con marcas de tiempo tcp está activada.

El campo de marca de tiempo se almacena en el campo de opción del encabezado TCP y se utiliza para registrar la marca de tiempo del remitente TCP y la última marca de tiempo recibida del par.

tcp_max_tw_buckets

Cuando el número de conexiones TIME_WAIT en el sistema excede el valor de este elemento, el sistema restablecerá las conexiones TIME_WAIT en el futuro. Esto no se recomienda.

El programa utiliza SO_LINGER

Al configurar algunas opciones de Sokcet, algunos comportamientos del método de cierre se verán afectados.

Si onoff en SO_LINGER no es cero y LINGER es cero, entonces el mensaje RST se enviará a la otra parte inmediatamente después de llamar al método de cierre, omitiendo el protocolo de enlace de cuatro vías y cerrando directamente la conexión TCP. Demasiado violento y no recomendado.

Si no hay actividad en la conexión TCP dentro de un cierto período de tiempo, el mecanismo de mantenimiento de conexión de TCP entrará en vigor y se enviará un mensaje de detección de vez en cuando. Si no se recibe respuesta durante varios mensajes de prueba consecutivos, la conexión TCP se considera inactiva y el núcleo del sistema notificará a la aplicación con un mensaje de error.

Los tres anteriores son los valores predeterminados en Linux, lo que significa que se necesitan al menos 2 horas, 11 minutos y 15 segundos para encontrar una conexión inactiva en el sistema operativo Linux.

Hay un parámetro backlog en el método de inicialización de ServerSokcet en Java, que representa el tamaño de la cola SYN antes de Linux 2.2, pero después de Linux 2.2 es el tamaño de la cola de conexión completa (el tamaño de la cola de aceptación).

Pasos de conexión TCP correspondientes a algunas operaciones de conexión de Socket

Método de cierre correspondiente de cuatro ondas TCP