Когда соединение TCP закрыто на одном конце соединения - другой конец получает FIN
и отвечает ACK
. Этот конец соединения переходит в состояние CLOSE_WAIT
. После вызова close()
на этом конце TCP отправляет пакет FIN
и переходит в состояние LAST_ACK
. Однако он никогда не переходит в TIME_WAIT
.
Теперь предположим, что узел A вызывает сокет close()
и отправляет пакет FIN
узлу B. Узел A переходит в состояние FIN_WAIT_1
. Хост B получает пакет FIN
, отправляет ACK
и затем переходит в состояние CLOSE_WAIT
. Однако ACK сбрасывается где-то в восходящем маршрутизаторе.
Между тем, узел B вызывает метод close()
(напомним, что узел B находится в состоянии CLOSE_WAIT
) и отправляет пакет FIN
узлу A. Теперь узел B переходит в состояние LAST_ACK
. Хост A получает пакет FIN
и отвечает ACK
. Затем он переходит в состояние CLOSING
.
На другом конце хост B все еще находится в состоянии LAST_ACK
. Затем он получает ACK
от хоста A и переходит в состояние CLOSED
. Вспомните, что ACK
от хоста B к хосту A был отброшен и что хост A не повторно отправил свой пакет FIN
. Узел A повторно отправляет свой пакет FIN
по истечении времени ожидания, однако узел B закрыл соединение.
Хост А теперь застрял в состоянии CLOSING
? Разрыв соединения может продолжаться? Что происходит дальше?