Читаем Linux API. Исчерпывающее руководство полностью

На рис. 57.4 показана диаграмма перехода состояний для протокола TCP (за основу взяты диаграммы из RFC 793 и книги [Stevens et al., 2004]). Она описывает то, как одна из сторон TCP-соединения переходит от одного состояния к другому в зависимости от различных событий. Каждая стрелка символизирует потенциальный переход и помечена событием, которое инициирует данный переход. Это может быть действие приложения (выделяется жирным шрифтом) или строка recv, сигнализирующая о получении сегмента от удаленного сокета. По мере перехода от одного состояния к другому сокет может передавать сегменты удаленной стороне; в таком случае указывается метка send. Например, стрелка для перехода из ESTABLISHED в FIN_WAIT1 показывает, что инициатором является вызов close(), выполненный локальным приложением, и при этом удаленному сокету передается сегмент с битом FIN.

Обычное для TCP-клиента направление перехода показано на рис. 57.4 в виде сплошной стрелки, а пунктирной обозначено направление, которое, как правило, выбирает TCP-сервер (другие стрелки изображают направления, используемые не так часто). Глядя на номера, указанные в скобках рядом с этими стрелками, можно сделать вывод: отправляемые и принимаемые сегменты на обоих концах соединения являются зеркальным отражением друг друга. (После прохождения состояния ESTABLISHED маршруты, выбираемые сервером и клиентом, могут оказаться обратными тем, что изображены на диаграмме; так происходит, если активное закрытие выполняет серверная сторона.)

На рис. 57.4 показаны не все возможные переходы машины состояний протокола TCP, а только представляющие особый интерес. Больше подробностей о диаграмме перехода состояний для протокола TCP можно найти на www.cl.cam.ac.uk/~pes20/Netsem/poster.pdf.

Рис. 57.4.Диаграмма перехода состояний для протокола TCP

57.6.4. Установка TCP-соединения

На уровне своих программных интерфейсов два потоковых сокета соединяются, выполняя два следующих шага (см. рис. 52.1).

1. Сервер делает вызов listen(), чтобы выполнить пассивное открытие сокета, и затем вызывает операцию accept(), которая блокируется до тех пор, пока соединение не будет установлено.

2. Клиент делает вызов connect() с целью выполнить активное открытие сокета и установить соединение с пассивным сокетом на стороне сервера.

Этапы установки TCP-соединения изображены на рис. 57.5. Данную процедуру часто называют трехэтапным согласованием (англ. three-way handshake), так как между двумя концами соединения проходят три сегмента.

Рис. 57.5.Трехэтапное согласование при установке TCP-соединения

В процессе выполняются следующие шаги.

1. Вызов connect() заставляет TCP-клиент послать сегмент SYN, который информирует сервер о начальном порядковом номере клиента (на диаграмме обозначен как M). Эта информация является необходимой, поскольку, как было отмечено в подразделе 54.6.3, порядковые номера не начинаются с 0.

2. TCP-сервер должен подтвердить получение сегмента SYN и проинформировать клиента о своем собственном начальном порядковом номере (на диаграмме обозначен как N). Оба номера необходимы, так как потоковый сокет является двунаправленным. Для выполнения этих двух операций сервер может вернуть единственный сегмент с установленными битами SYN и ACK (мы как бы цепляем бит ACK к SYN).

3. TCP-клиент отправляет сегмент ACK, чтобы подтвердить получение сегмента SYN, посланного сервером.

Сегменты SYN, чей обмен происходит на первых двух шагах трехэтапного согласования, могут содержать в TCP-заголовке параметры, на основе которых определяются свойства соединения. Подробности можно найти в [Stevens et al., 2004], [Stevens, 1994] и [Wright & Stevens, 1995].

Метки в угловых скобках (например, ) на рис. 57.5 обозначают состояния обоих концов соединения.

Флаг SYN занимает один байт от места, выделенного для порядкового номера соединения. Это позволяет однозначно подтвердить получение SYN, так как сегмент, вместе с которым он передан, может также содержать какие-то данные. Вот почему подтверждение получения сегмента SYN M на рис. 57.5 изображено как ACK M+1.

57.6.5. Разрыв TCP-соединения

Закрытие TCP-соединения обычно происходит следующим образом.

1. Приложение на одном из концов соединения выполняет вызов close() (часто это делает клиент). Считается, что таким образом производится активное закрытие.

2. Позже приложение на другом конце соединения (сервер) тоже выполняет вызов close(). Данное действие называется пассивным закрытием.

На рис. 57.6 показано, какие действия выполняют соответствующие TCP-сокеты (подразумевается, что активное закрытие производит клиент).

1. Клиент выполняет активное закрытие, это заставляет его сокет отправить серверу сегмент FIN.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных