Книга: TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security)
10.17 Состояния TCP
Соединение TCP проходит несколько стадий: устанавливается соединение посредством обмена сообщениями, затем пересылаются данные, а далее соединение закрывается с помощью обмена специальными сообщениями. Каждый шаг в работе соединения соответствует определенному состоянию этого соединения. Программное обеспечение TCP на каждом конце соединения постоянно отслеживает текущее состояние другой стороны соединения.
Ниже мы кратко рассмотрим типичную смену состояний сервера и клиента, расположенных на разных концах соединения. Мы не ставим целью дать исчерпывающее описание всех возможных состояний при пересылке данных. Оно приведено в RFC 793 и документе Host Requirements.
Во время установки соединений сервер и клиент проходят схожие последовательности состояний. Состояния сервера показаны в таблице 10.3, а состояния клиента — в таблице 10.4.
Таблица 10.3 Последовательность состояний сервера
Состояние сервера | Событие | Описание |
---|---|---|
CLOSED (закрыто) | Фиктивное состояние перед началом установки соединения. | |
Пассивное открытие серверным приложением. | ||
LISTEN (отслеживание) | Сервер ожидает соединения с клиентом. | |
Сервер TCP получает SYN и посылает SYN/ACK. | Сервер получил SYN и послал SYN/ACK. Переходит к ожиданию ACK. | |
SYN-RECEIVED | Сервер TCP получает ACK. | |
ESTABLISHED (установлено) | Получен ACK, открыто соединение. |
Таблица 10.4 Последовательность состояний клиента
Состояние сервера | Событие | Описание |
---|---|---|
CLOSED | Фиктивное состояние перед началом соединения. | |
Клиентское приложение запрашивает соединение. Клиент TCP посылает SYN. | ||
SYN-SENT | Клиент TCP послал SYN серверу. | |
Клиент TCP получает SYN/ACK и посылает ACK. Клиент получил SYN/ACK от сервера и отправил обратно ACK. | ||
ESTABLISHED (установлено) | Можно перейти к пересылке данных. |
Если бы партнеры одновременно пытались установить соединение друг с другом (что случается крайне редко), каждый прошел бы через состояния CLOSED, SYN-SENT, SYN-RECEIVED и ESTABLISHED.
Конечные стороны соединения остаются в состоянии ESTABLISHED, пока одна из сторон не приступит к закрытию соединения, послав сегмент FIN. В процессе обычного закрытия сторона, инициирующая это закрытие, проходит через состояния, показанные в таблице 10.5. Ее партнер проходит через состояния, представленные в таблице 10.6.
Таблица 10.5 Последовательность состояний стороны, закрывающей соединение
Состояния закрывающей стороны | Событие | Описание |
---|---|---|
ESTABLISHED | Локальное приложение запрашивает закрытие соединения. | |
TCP посылает FIN/ACK. | ||
FIN-WAIT-1 | Закрывающая сторона ожидает ответа партнера. Напомним, что от партнера все еще могут прибывать новые данные. | |
TCP получает ACK. | ||
FIN-WAIT-2 | Закрывающая сторона получила ACK от партнера, но еще не пришел FIN. Закрывающая сторона ожидает FIN, принимая поступающие данные. | |
TCP получает FIN/ACK. | ||
Посылает ACK. | ||
TIME-WAIT | Соединение поддерживается в неопределенном состоянии, чтобы позволить прибыть или отбросить все еще существующие в сети дублированные данные или дублированный FIN. Период ожидания вдвое больше оценки максимального времени жизни сегмента. | |
CLOSED | Удалена вся информация о соединении. |
Таблица 10.6 Последовательность состояний партнера по закрытию соединения
Состояние партнера | Событие | Описание |
---|---|---|
ESTABLISHED | TCP получает FIN/ACK. | |
CLOSE-WAIT | Прибыл FIN. | |
TCP посылает ACK. | ||
TCP ожидает от своего приложения закрытия соединения. В этот момент приложение может посылать достаточно большое количество данных. | ||
Локальное приложение инициализирует закрытие соединения. | ||
TCP посылает FIN/ACK. | ||
LAST-ACK | TCP ожидает конечный ACK. | |
TCP получает ACK. | ||
CLOSED | Удалена вся информация о соединении. |