Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
493.doc
Скачиваний:
21
Добавлен:
30.04.2022
Размер:
8.68 Mб
Скачать

2.1.2.6 Состояния соединения

Деятельность программы протокола TCP можно рассматривать как реагирование на события в зависимости от состояния соединения (так называемый конечный автомат, finite state machine).

Ниже описаны состояния соединения и приведены диаграммы переходов. Под термином «процесс» здесь понимается процесс ТСР­ модуля, работающий с данным соединением на локальном узле; термин «чужой» относится к процессу, работающему с данным TCP-соединением на удаленном узле [30].

LISTEN— процесс пассивно ждет запроса со стороны чужих сокетов. SYN-SENT — процесс отправил свой SYN и ждет чужого SYN.

SYN-RECEIVED — процесс получил чужой SYN, отправил (раньше или только что) свой SYN и ждет АСК на свой SYN.

ESTABLISHED — процесс отправил АСК на чужой SYN, получил АСК на свой SYN; соединение установлено.

FIN-WAIT-1 — процесс первым отправил свой FIN и ждет реакцию той стороны; при этом он, возможно, продолжает получать данные.

FIN- WAIT-2 — процесс получил АСК на свой ранее отправленный FIN, но не получил чужой FIN; ждет чужой FIN; при этом, возможно, про­должает получать данные.

CLOSE-WAIT — процесс, не отправив свой FIN (возможно, не собираясь прекращать соединение), получает чужой FIN; он отправляет АСК на чужой FIN, но при этом, возможно, продолжает отправлять данные.

LAST-ACK— процесс отправил свой FIN, но ранее он уже получил FIN с той стороны и отправил на него АСК; поэтому процесс ожидает чужой АСК на свой FIN для окончательного закрытия соединения.

CLOSING — процесс ранее отправил свой FIN и еще не получил на него подтверждение, но получил чужой FIN (и отправил на него АСК); ждет АСК на свой FIN.

TIME-WAIT — процесс ранее отправил свой FIN и получил на него подтверждение, получил чужой FIN и только что отправил на него ACK Теперь процесс ждет некоторое время (два времени жизни сегмента, обычно 4 минуты) для гарантии того, что та сторона получит отправленный АСК (если АСК потеряется, то чужой FIN будет выслан еще раз), после чего соединение будет окончательно закрыто. Некоторые приложения, попадая в состояние TIIME-WAIT, предпочитают не ждать, а вместо этого вдогонку последнему АСК отправляют для надежности несколько RST-сегментов и немедленно ликвидируют соединение.

Однако, гарантия доставки последнего АСК— не единственная цель пребывания в состоянии TIME_WAIT. В сети могут находиться «заблудившиеся» сегменты соединения, которые считались потерянными, но на самом деле были задержаны каким-то промежуточным маршрутизатором. Если соединение слишком быстро перешло в состояние CLOSED, а модуль TCP тут же открыл новое соединение между теми же самыми сокетами, то заблудившийся сегмент в принципе может попасть в окно нового соединения, подменив собой легитимные данные, что может привести к серьезным последствиям для процесса-получателя. Удержание соединения в состоянии TIME-WAIT гарантирует, что все заблудившиеся сегменты будут либо получены (и проигнорированы), либо уничтожены по истечении времени жизни.

CLOSED — соединение отсутствует.

В диаграммах на рисунок 2.5 и 2.6 состояния соединения заключены в прямоугольники, переходы между ними показаны стрелками, с каждой стрелкой соотносится овал, поясняющий причину перехода. В овале над горизонтальной чертой указывается событие, вызвавшее переход; под горизонтальной чертой — действие, сопутствующее переходу.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]