Во время установки соединений сервер и клиент проходят схожие последовательности состояний. Состояния сервера показаны в таблице 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 | Удалена вся информация о соединении. |
10.17.1 Анализ состояний соединения TCP
Команда netstat -an позволяет проверить текущее состояние соединения. Ниже показаны соединения в состояниях listen, startup, established, closing и time-wait.