Состояние CLOSED означает "я не имею данных для передачи". Конечно, закрытие полнодуплексного соединения является предметом множества интерпретаций, поскольку не очевидно, как интерпретировать в соединении сторону, получающую информацию. Мы решили интерпретировать CLOSE в упрощенной манере. Клиент, находящийся в состоянии CLOSE, может все еще получать информацию (RECEIVE) до тех пор, пока партнер тоже не сообщит, что переходит в состояние CLOSE. Таким образом, клиент может изящно завершить работу на своем конце соединения. Программа протокола TCP гарантированно получит все буферы с информацией, отправленные до того, как соединение было закрыто. Поэтому клиенту, не ждущему информации с соединения, следует лишь ждать сообщения об успешном закрытии этого соединения, что означает, что все данные получены программой TCP, принимающей информацию. Клиенты должны сохранять уже закрытые ими для чтения информации соединения до тех пор, пока программа протокола TCP не сообщит им, что такой информации больше нет.
Особое значение имеют три случая:
1) | клиент инициирует закрытие соединения, дав команду своей программе протокола TCP. |
2) | закрытие соединения начинается с того, что напарник посылает сюда управляющий сигнал FIN. . |
3) | оба клиента дают команду на закрытие одновременно. |
Случай 1 Местный клиент инициирует закрытие
В этом случае создается сегмент с сигналом FIN и помещается в очередь сегментов, ждущих отправления. После этого программа TCP уже не будет принимать от этого клиента каких-либо команд на отправление данных по закрытому соединению, а сама переходит в со стояние FIN-WAIT-1. Тем не менее, в этом состоянии еще возможно получение клиентом данных с этого соединения. Все сегменты, стоящие в очереди, и сам сегмент с сигналом FIN будут в случае необходимости посылаться напарнику вновь и вновь, пока не получат своего подтверждения. .
Когда программа TCP партнера подтвердит получение сигнала FIN, и сама отправит сюда свой сигнал FIN, местная программа может подтвердить получение последнего.
. | 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 |
. |
. | TCP A | . | TCP B | ||
1. | ESTABLISHED | . | ESTABLISHED | ||
2. | (Close) | . | (Close) | ||
. | FIN-WAIT-1 | --> | <SEQ=100><ACK=300><CTL=FIN,ACK> | ... | FIN-WAIT-1 |
. | <-- | <SEQ=300><ACK=100><CTL=FIN,ACK> | <-- | . | |
. | ... | <SEQ=100><ACK=300><CTL=FIN,ACK> | --> | . | |
3. | CLOSING | --> | <SEQ=101><ACK=301><CTL=ACK> | ... | CLOSING |
. | <-- | <SEQ=301><ACK=101><CTL=ACK> | <-- | . | |
. | ... | <SEQ=101><ACK=301><CTL=ACK> | --> | . | |
4. | TIME-WAIT | . | TIME-WAIT | ||
. | (2 MSL) | . | (2 MSL) | ||
. | CLOSED | . | CLOSED |