En el protocolo de enlace de 4 vías, tenemos lo siguiente:
FIN ------->
<------- ACK
<---x--- FIN (what if this packet is lost?)
ACK ------->
¿Qué pasa si se pierde el tercer paquete? ¿Será retransmitido? Tenga en cuenta que para cuando se envíe el tercer paquete, el programa probablemente habrá destruido el socket y, por lo tanto, ¡ya no podrá enviar nada!
Respuesta1
La respuesta corta es que no se garantiza que lleguen paquetes. Cualquier cantidad de condiciones puede hacer que los paquetes se descarten o se pierdan en tránsito. TCP incluye reglas de reintento para garantizar que lleguen los datos.
Su escenario es una conexión medio cerrada. Un lado cierra la conexión y solo puede leer datos hasta que el otro lado cierra la conexión.
FIN ------>
<------ ACK
El lado que envía el paquete FIN recorrerá los estados FIN_WAIT1, FIN_WAIT2 y TIME_WAIT a medida que se cierra la conexión. El lado que recibe el paquete FIN ingresará CLOSE_WAIT. Cuando cierra la conexión, reintentará los paquetes FIN de acuerdo con sus reglas de reintento hasta que reciba un ACK o se agote el tiempo de espera. Hasta que se envía el segundo FIN, la conexión está en un estado medio cerrado.
<------ FIN
ACK ------>
Las conexiones se pueden cerrar con 3 paquetes. Estos son comunes en los volcados de protocolos que veo. En algunos casos, la respuesta al primer FIN será un RST (reinicio) y el ACK final se reemplazará con un RST.
FIN ------>
<------ FIN,ACK
ACK ------>
En algunos casos, se envía un RST (reinicio) en lugar del ACK y el ACK final se reemplaza con un RST.
FIN ------>
<------ RST
RST ------>
Debido al retraso de la red, es posible que ambos extremos cierren una conexión activa. En este caso, los paquetes ACK pueden entregarse en cualquier orden.
<------ FIN
FIN ------>
<------ ACK
ACK ------>
Respuesta2
DeRFC 793:
Conexiones medio abiertas y otras anomalías
Se dice que una conexión establecida está "medio abierta" si uno de los TCP ha cerrado o abortado la conexión en su extremo sin el conocimiento del otro, o si los dos extremos de la conexión se han desincronizado debido a una falla resultante. en la pérdida de la memoria. Dichas conexiones se restablecerán automáticamente si se intenta enviar datos en cualquier dirección. Sin embargo, se espera que las conexiones entreabiertas sean inusuales y el procedimiento de recuperación sea levemente complicado.