Когда соединение 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 ? Разрыв соединения может продолжаться? Что происходит дальше?

