Descubrí que la razón por la que el cerrador activo ingresa TIME WAIT es para asegurarse de que el ACK final no se pierda. Pero, ¿cómo sabe si se pierde el ACK final? ¿El cerrador pasivo reenviará el FIN y luego el cerrador activo sabrá que se perdió el ACK? Aquí hay una imagen del TCP FSM.
12
Respuestas:
Si. Citando de TCP / IP Ilustrado Volumen 1 , en la sección Administración de la conexión TCP:
Hay un tiempo de espera. Cuando está dentro
LAST_ACK
, el cerrador pasivo se reenviaráFIN
cuando haya un tiempo de espera, suponiendo que se haya perdido. Si realmente se perdió, el cerrador activo eventualmente recibirá el retransmitidoFIN
y entraráTIME_WAIT
. SiFIN
no se perdió pero se perdió la finalACK
, entonces el cerrador activo entraTIME_WAIT
y recibe deFIN
nuevo. Cuando esto sucede - recepción de unaFIN
enTIME_WAIT
- elACK
se retransmite.El valor de tiempo de espera
TIME_WAIT
es NO utiliza con fines de retransmisión. Cuando se agota el tiempo de esperaTIME_WAIT
, se supone que la finalACK
se entregó correctamente porque el cerrador pasivo no retransmitió losFIN
paquetes. Entonces, el tiempo de esperaTIME_WAIT
es solo una cantidad de tiempo después del cual podemos asumir con seguridad que si el otro extremo no envió nada, es porque recibió la finalACK
y cerró la conexión.fuente
Porque no lo recibió dentro del período de tiempo de espera. Sé que es una respuesta "duh", pero eso es exactamente por qué existen estos estados y tiempos de espera.
No. No, a menos que lleguen más paquetes para ese flujo, y eso resultaría en el envío de "RST" (reinicio).
Todo el proceso es una máquina de estado complicada para ejecutar un apagado ordenado a pesar de la posibilidad de fallas en la red. Las redes se rompen, los enlaces experimentan errores, los enlaces se saturan y tienen que soltar paquetes, los dispositivos fallan, etc. Como ejercicio, ejecute el árbol de estado para una conexión activa cuando uno de los puntos finales simplemente desaparece (por ejemplo, falla de energía).
TL; DR Ese árbol de estado está diseñado para manejar todos los modos de falla posibles.
fuente
El propósito de TIME_WAIT es permitir que la red distinga los paquetes que llegan como pertenecientes a la conexión 'antigua y existente' de una nueva. La recomendación es configurar el temporizador TIME_WAIT al doble de la vida útil máxima del segmento (MSL), en mi sistema el MSL es de 1 minuto, por lo que las conexiones permanecen en el estado TIME_WAIT durante 2 minutos.
Después de este período de tiempo, los paquetes que llegan ya no están asociados con la conexión anterior.
TIME_WAIT no se espera directamente para enviar paquetes ACK; eso es impulsado por los estados CLOSE_WAIT y FIN_WAIT. Cuando llegas al estado TIME_WAIT, el socket ya está cerrado.
Referencias: http://www.tcpipguide.com/free/t_TCPConnectionTermination-3.htm https://en.wikipedia.org/wiki/Maximum_segment_lifetime http://www.lognormal.com/blog/2012/09/27/ linux-tcpip-tuning /
fuente