Назад | Содержание | Вперед

Закрытие соединения

Состояние CLOSED означает "я не имею данных для передачи". Конечно, закрытие полнодуплексного соединения является предметом множества интерпретаций, поскольку не очевидно, как интерпретировать в соединении сторону, получающую информацию. Мы решили интерпретировать CLOSE в упрощенной манере. Клиент, находящийся в состоянии CLOSE, может все еще получать информацию (RECEIVE) до тех пор, пока партнер тоже не сообщит, что переходит в состояние CLOSE. Таким образом, клиент может изящно завершить работу на своем конце соединения. Программа протокола TCP гарантированно получит все буферы с информацией, отправленные до того, как соединение было закрыто. Поэтому клиенту, не ждущему информации с соединения, следует лишь ждать сообщения об успешном закрытии этого соединения, что означает, что все данные получены программой TCP, принимающей информацию. Клиенты должны сохранять уже закрытые ими для чтения информации соединения до тех пор, пока программа протокола TCP не сообщит им, что такой информации больше нет.

Особое значение имеют три случая:

1) клиент инициирует закрытие соединения, дав команду своей программе протокола TCP.
2) закрытие соединения начинается с того, что напарник посылает сюда управляющий сигнал FIN. .
3) оба клиента дают команду на закрытие одновременно.

Случай 1 Местный клиент инициирует закрытие
В этом случае создается сегмент с сигналом FIN и помещается в очередь сегментов, ждущих отправления. После этого программа TCP уже не будет принимать от этого клиента каких-либо команд на отправление данных по закрытому соединению, а сама переходит в со стояние FIN-WAIT-1. Тем не менее, в этом состоянии еще возможно получение клиентом данных с этого соединения. Все сегменты, стоящие в очереди, и сам сегмент с сигналом FIN будут в случае необходимости посылаться напарнику вновь и вновь, пока не получат своего подтверждения. .

Когда программа TCP партнера подтвердит получение сигнала FIN, и сама отправит сюда свой сигнал FIN, местная программа может подтвердить получение последнего. Заметим, что программа TCP, получающая сигнал FIN, будет подтверждать его, но не будет посылать своего собственного сигнала FIN до тех пор, пока ее клиент тоже не закроет соединения.

Случай 2 Программа TCP получает из сети сигнал FIN.
Если из сети приходит невостребованный сигнал FIN, то принимающая его программа TCP может подтвердить получение такого сигнала и оповестить своего клиента о том, что соединение закрыто. Клиент ответит командой CLOSE, по которой программа TCP может после пересылки оставшихся данных послать партнеру сигнал FIN. После этого программа TCP ждет, пока не придет подтверждение на отправленный ею сигнал FIN, после чего она ликвидирует соединение. Если подтверждения не было по истечении отведенного времени, то соединение ликвидируется в принудительном порядке, о чем дается сообщение клиенту.

Случай 3 Оба клиента закрывают соединение одновременно.
Одновременное закрытие соединения клиентами на обоих концах приводит к обмену сегментами с сигналом FIN. Когда все сегменты, стоящие в очереди перед сегментом с FIN, будут переданы и получат подтверждение, каждая программа TCP может послать подтверждение на полученный ею сигнал 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
.

Рис. 11 Нормальная процедура закрытия

. 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

Рис. 12 Процедура одновременного закрытия соединения с обоих концов

Назад | Содержание | Вперед
Hosted by uCoz