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. Таким образом, сокет продолжает существовать до тех пор, пока на него ссылается либо дескриптор файла, либо управляющий блок протокола.
- 31/01/2010 15:39 - Отложенные подтверждения и обновления окон
- 31/01/2010 15:30 - Избежание небольших пакетов
- 30/01/2010 12:15 - Избегание синдрома незначительного окна
- 30/01/2010 12:10 - Обработка вывода TCP
- 30/01/2010 11:58 - Обработка ввода TCP
- 30/01/2010 11:53 - Кеш SYN
- 24/01/2010 19:31 - MTU. Установление соединения
- 21/01/2010 09:34 - Оценка времени обращения
- 19/01/2010 14:04 - Таймеры. TCP Timer.
- 17/01/2010 12:06 - Алгоритмы TCP. Состояние соединения.