На рис. 57.4 показана
Обычное для TCP-клиента направление перехода показано на рис. 57.4 в виде сплошной стрелки, а пунктирной обозначено направление, которое, как правило, выбирает TCP-сервер (другие стрелки изображают направления, используемые не так часто). Глядя на номера, указанные в скобках рядом с этими стрелками, можно сделать вывод: отправляемые и принимаемые сегменты на обоих концах соединения являются зеркальным отражением друг друга. (После прохождения состояния ESTABLISHED маршруты, выбираемые сервером и клиентом, могут оказаться обратными тем, что изображены на диаграмме; так происходит, если активное закрытие выполняет серверная сторона.)
На рис. 57.4 показаны не все возможные переходы машины состояний протокола TCP, а только представляющие особый интерес. Больше подробностей о диаграмме перехода состояний для протокола TCP можно найти на www.cl.cam.ac.uk/~pes20/Netsem/poster.pdf.
Рис. 57.4.
57.6.4. Установка TCP-соединения
На уровне своих программных интерфейсов два потоковых сокета соединяются, выполняя два следующих шага (см. рис. 52.1).
1. Сервер делает вызов listen(), чтобы выполнить пассивное открытие сокета, и затем вызывает операцию accept(), которая блокируется до тех пор, пока соединение не будет установлено.
2. Клиент делает вызов connect() с целью выполнить активное открытие сокета и установить соединение с пассивным сокетом на стороне сервера.
Этапы установки TCP-соединения изображены на рис. 57.5. Данную процедуру часто называют
Рис. 57.5.
В процессе выполняются следующие шаги.
1. Вызов connect() заставляет TCP-клиент послать сегмент SYN, который информирует сервер о начальном порядковом номере клиента (на диаграмме обозначен как
2. TCP-сервер должен подтвердить получение сегмента SYN и проинформировать клиента о своем собственном начальном порядковом номере (на диаграмме обозначен как
3. TCP-клиент отправляет сегмент ACK, чтобы подтвердить получение сегмента SYN, посланного сервером.
Сегменты SYN, чей обмен происходит на первых двух шагах трехэтапного согласования, могут содержать в TCP-заголовке параметры, на основе которых определяются свойства соединения. Подробности можно найти в [Stevens et al., 2004], [Stevens, 1994] и [Wright & Stevens, 1995].
Метки в угловых скобках (например,
Флаг SYN занимает один байт от места, выделенного для порядкового номера соединения. Это позволяет однозначно подтвердить получение SYN, так как сегмент, вместе с которым он передан, может также содержать какие-то данные. Вот почему подтверждение получения сегмента SYN M на рис. 57.5 изображено как ACK M+1.
57.6.5. Разрыв TCP-соединения
Закрытие TCP-соединения обычно происходит следующим образом.
1. Приложение на одном из концов соединения выполняет вызов close() (часто это делает клиент). Считается, что таким образом производится
2. Позже приложение на другом конце соединения (сервер) тоже выполняет вызов close(). Данное действие называется
На рис. 57.6 показано, какие действия выполняют соответствующие TCP-сокеты (подразумевается, что активное закрытие производит клиент).
1. Клиент выполняет активное закрытие, это заставляет его сокет отправить серверу сегмент FIN.