Sunday, Feb 05th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Сетевые протоколы Отключение соединения в FreeBSD

Отключение соединения в FreeBSD

TCP-соединение является симметричным и полнодуплексным, поэтому любая сторона может инициировать разъединение независимо. Пока одно направление соединения может передавать данные, соединение остается открытым. Сокет может указать, что он завершил отправку данных, с помощью системного вызова shutdown, который приводит к вызову процедуры tcp_usr_shutdown().

Ответом на этот запрос является изменение состояния соединения; оно меняется с ESTABLISHED в FINWAIT1. Следующий вызов вывода отправит FIN, обозначая конец файла. Принимающий сокет перейдет в состояние CLOSEWAIT, но может продолжить отправлять данные. Процедура может отличаться, если процесс просто закрывает сокет.

 

В этом случае FIN отправляется немедленно, но если получены новые данные, они не могут быть доставлены. Обычно протоколы более высокого уровня завершают свои собственные транзакции, так что обе стороны знают, когда закрываться. Однако, если они этого не знают, TCP должен отвергать новые данные. Он делает это путем отправки пакета с установленным флагом RST, если получены новые данные после того, как пользователь закрылся. Если в буфере отправки сокета остаются данные, когда осуществляется close, TCP обычно пытается их доставить. Если была установлена опция сокета SO_LINGER с нулевым временем задержки, буфер отправки просто сбрасывается; в противном случае процессу пользователя разрешено продолжить и протокол ожидает завершения доставки.

При этих условиях сокет помечается битом состояния SSNOFDREF (no file-descriptor reference - нет ссылок на дескрипторы файлов). Завершение передачи данных и завершающее закрытие могут иметь место позже в произвольный момент времени. Когда TCP в конечном счете завершает соединение (или разрывает из-за тайм-аута или другой неудачи), он вызывает tcp_close(). Управляющие блоки протокола и другие динамически выделяемые структуры освобождаются в это время. Сокет также освобождается, если был установлен флаг SS_NOFDREF. Таким образом, сокет продолжает существовать до тех пор, пока на него ссылается либо дескриптор файла, либо управляющий блок протокола.


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 19 гостей онлайн