Закрыть - это операция, означающая «У меня больше нет данных для отправки». см. RFC793 .
TCP A TCP B
1. ESTABLISHED ESTABLISHED
2. (Close)
FIN-WAIT-1 --> <SEQ=100><ACK=300><CTL=FIN,ACK> --> CLOSE-WAIT
3. FIN-WAIT-2 <-- <SEQ=300><ACK=101><CTL=ACK> <-- CLOSE-WAIT
4. (Close)
TIME-WAIT <-- <SEQ=300><ACK=101><CTL=FIN,ACK> <-- LAST-ACK
5. TIME-WAIT --> <SEQ=101><ACK=301><CTL=ACK> --> CLOSED
6. (2 MSL)
CLOSED
Таким образом, вы можете видеть, что клиент уже не имел данных для отправки на шаге 2, но у сервера не было данных для отправки до шага 4. Серверу нужен еще один FIN, чтобы сообщить клиенту «У меня нет данных для отправки». Вот почему он не может работать так же, как TCP-соединение в 3 этапа.