Cuando una conexión TCP se cierra en un extremo de la conexión, el otro extremo recibe un FIN
y responde con un ACK
. Este extremo de la conexión entra entonces en el CLOSE_WAIT
estado. Una vez que close()
se llama a este extremo, el TCP envía un FIN
paquete y entra en el LAST_ACK
estado. Sin embargo, nunca ingresa al TIME_WAIT
estado.
Ahora, supongamos que el Host A llama close()
al socket y envía un FIN
paquete al Host B. El Host A ingresa al FIN_WAIT_1
estado. El host B recibe el FIN
paquete, envía un ACK
y luego ingresa al CLOSE_WAIT
estado. Sin embargo, el ACK se coloca en algún lugar de un enrutador ascendente.
Mientras tanto, el Host B llama close()
(recuerde que el Host B está en el CLOSE_WAIT
estado) y envía un FIN
paquete al Host A. El Host B ahora ingresa al LAST_ACK
estado. El host A recibe el FIN
paquete y responde con un archivo ACK
. Luego ingresa al CLOSING
estado.
En el otro extremo, el anfitrión B todavía está en el LAST_ACK
estado. Luego recibe el ACK
mensaje del Host A y entra en el CLOSED
estado. Recuerde que el ACK
envío del Host B al Host A se eliminó y que el Host A no ha reenviado su FIN
paquete. El host A reenvía su FIN
paquete cuando se agotó el tiempo de espera; sin embargo, el host B cerró la conexión.
¿El Host A ahora está atrapado en el CLOSING
estado? ¿Puede continuar la interrupción de la conexión? ¿Qué pasa después?
Respuesta1
Mi TCP está un poco oxidado pero creo que funciona así:
Cuando el Host B llama close()
y envía su mensaje FIN
, el número de secuencia FIN
le revelará al Host A que perdió un paquete del Host B. Por lo tanto, el Host A no confirmará el Host B FIN
, seguirá confirmando el último segmento TCP que recibió. recibido exitosamente del Host B. Esto solicitará al Host B que retransmita el archivo faltante ACK
.
Por lo tanto, el Host A no alcanzará el CLOSING
estado, porque no considerará que el desorden FIN
se haya recibido verdaderamente hasta que reciba el estado faltante ACK
que lo precedió.