Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сетевые средства операционных систем. Учебное пособие
.pdf
Ларина Т.Б. Сетевые средства операционных систем
51
2.1.2 Алгоритмы сокетного взаимодействия удаленных
процессов
Алгоритм взаимодействия процессов через дейтаграммный
сокет
Логику взаимодействия процессов через дейтаграммный сокет
можно сравнить с общением людей через письма (сообщения),
помещаемые в почтовые ящики (сокеты).
Логика процесса-клиента
1. Создание UDP-сокета («изготовление почтового ящика»)
2. Настройка сокета
Надо связать сокет с IP-адресом сетевого интерфейса и
определенным номером порта («установить почтовый ящик»).
В адресе сокета можно указать конкретный IP-адрес сетевого
интерфейса (адаптера) узла или указать операционной системе, что
информация может поступать через любой сетевой интерфейс узла.
3. Передача сообщения с указанием адреса сервера, то есть, IPадресом сетевого интерфейса и номером порта сервера
4. Ожидание ответа от сервера
5. Продолжение работы клиентской программы.
Логика процесса-сервера
1. Создание UDP-сокета
2. Настройка сокета
3. Ожидание поступления сообщения
4. Чтение сообщения, определение адреса отправителя, обработка
полученной информации и отправка результата по обратному адресу
5. Процесс-сервер готов к приему новой информации, то есть
переход к пункту 3.

Ларина Т.Б. Сетевые средства операционных систем
52
Схематично логика взаимодействия через дейтаграммный сокет
показана на рис.2-1.
Каждому из сетевых действий клиента и сервера соответствует
определенный системный вызов программного интерфейса сокетов.
На рисунке справа от блоков действий приведены названия
соответствующих системных вызовов библиотеки WinSock: socket,
bind, sendto, recfrom.
Рис. 2-1. Логика взаимодействия клиента и сервера через
дейтаграммные сокеты

Ларина Т.Б. Сетевые средства операционных систем
53
Алгоритм взаимодействия процессов через потоковый сокет
Взаимодействие сокетов по протоколу ТСР с установлением
соединения имеет свою специфику. Его можно сравнить с общением
людей по телефону – со звонком и поднятием / опусканием трубки.
Логика процесса-клиента
1. Создание ТСР -сокета
2. Настройка сокета на сетевой адрес узла и номер порта
3. Установление соединения с сервером («звонок»)
4. Обмен сообщениями с сервером
После установления соединения с сервером процесс-клиент
может многократно обмениваться с ним информацией.
5. Закрытие сокета («опускание трубки»)
По окончании взаимодействия нужно обязательно закрыть сокет.
Логика процесса-сервера
1. Создание ТСР -сокета
2. Настройка сокета на сетевой адрес узла и номер порта
3. Перевод сокета в пассивное состояние.
После создания и настройки любой TCP-сокет находится в
«активном состоянии» - он готов к приему/передаче сообщения. Для
установления соединения его надо перевести в «пассивное состояние».
После этого процесс-сервер создает очередь для обслуживания
запросов клиентов на установление соединения с ним, так как
клиентов может быть несколько.
4. Ожидание установления соединения («ожидание звонка»).
5. Установление соединения и создание «порожденного сокета»
для обмена информацией.
6. Чтение сообщения, определение адреса отправителя, обработка
полученной информации и отправка результата по обратному адресу.

Ларина Т.Б. Сетевые средства операционных систем
54
Обмен информацией через «порожденный сокет» по установленному
соединению может происходить многократно.
7. Закрытие сокета. Окончание соединения.
8. Ожидание нового соединения – переход к пункту 4
Переведенный в пассивное состояние для установления
соединения серверный сокет уже не будет использоваться для
операций собственно приема и отправления информации.
После установления соединения с клиентом на сервере
автоматически создается новый потоковый сокет - «порожденный
сокет», через который и будет производиться обмен сообщениями.
«Порожденных» сокетов создается столько, со сколькими
клиентами было установлено соединение.
Схематично взаимодействие через потоковые сокеты показано
на рисунке 2-2. На схеме видно появление новых программных
системных вызовов, которые реализуют особенности взаимодействия
через протокол TCP с установлением соединения: connect, listen,
accept.
Неравноправность процессов клиента и сервера наглядно видна
в различии используемых ими системных вызовов:
Механизм установления соединения
С точки зрения пользователя работа через протокол TCP
выглядит, как обычный обмен потоком данных.
На транспортном уровне поток данных отправителя нарезается
на пакеты, которые отправляются в сеть, а на узле-получателе они
собираются в единый поток данных.

Ларина Т.Б. Сетевые средства операционных систем
55
Рис.2-2. Логика сетевого взаимодействия через потоковые сокеты

Ларина Т.Б. Сетевые средства операционных систем
56
Для надежной передачи пакетов по сети в протоколе TCP
используется:
нумерация передаваемых пакетов и контроль порядка их
получения,
подтверждения о приеме пакета со стороны получателя
Согласование начальных номеров пакетов происходит по
инициативе клиента при выполнении системного вызова Сonnect .
Клиент посылает серверу служебный пакет SYN (synchronize –
синхронизировать). Он содержит, как минимум, начальный номер для
пакетов данных, который будет использовать клиент.
Сервер должен подтвердить получение пакета SYN от клиента и
отправить ему свой пакет SYN с тем же начальным номером пакетов
данных и пакет ACK (acknowledgement – подтверждение). В ответ
клиент пакетом данных ACK должен выполнить подтверждение
приема от сервера.
Описанная процедура получила название «трехэтапного
рукопожатия» (three-way handshake). Она изображена на рис.2-3.
Рис.2-3. Процедура трехэтапного рукопожатия

Ларина Т.Б. Сетевые средства операционных систем
57
В ответ на запрос клиента Connect на установление соединения
сервер будет считать его не полностью установленным, пока не будет
успешно выполнена процедура «трехэтапного рукопожатия».
Только после этого созданный «порожденный сокет» может
использоваться для обмена сообщениями.
2.1.3 Системные вызовы для работы с сокетами в API
WinSock
Рассмотрим основные системные вызовы для сокетного
взаимодействия, используя API Winsock и язык программирования С.
Использование тех или иных вызовов требует наличия
определенных библиотек функций. В языке С они подключаются
директивой #include.
Создание сокета. Системный вызов Socket
int socket (domain, type, protocol )
Параметры вызова:
domain - AF_INET – для стека протоколов TCP/IP,
PF_UNIX для семейства внутренних протоколов UNIX-доменов.
type - тип сокета: SOCK_STREAM - потоковый сокет,
SOCK_DGRAM – дейтаграммный сокет.
protocol: - для транспортных протоколов TCP/IP
игнорируется и равен 0.
При успешном завершении вызов socket возвращает дескриптор
сокета. Это целое положительное число или 0.
Дескриптор сокета будет использоваться, как ссылка на
созданный сокет при дальнейших сетевых вызовах.

Ларина Т.Б. Сетевые средства операционных систем
58
Настройка сокета. Системный вызов Bind
Этим вызовом созданный сокет «связывается» с полным
адресом процесса в сети: адресом сетевого интерфейса и адресом
порта.
int bind (sockd, struct sockaddr *addr, addrlen )
Параметры вызова:
sockd - дескриптор сокета. Должен содержать значение,
возвращенное вызовом создания сокета socket().
struct sockaddr *addr – указатель на структуру данных,
содержащую полный адрес процесса. Для сетей TCP/IP такой
структурой является sockaddr_in.
int addrlen - фактический размер структуры данных с
адресом процесса. Его можно вычислить, как sizeof (struct
sockaddr_in).
Системный вызов bind возвращает 0 при нормальном
завершении и отрицательное значение в случае ошибки.
До выполнения вызова Bind структура данных sockaddr_in
должна быть инициализирована.
Формат структуры sockaddr_in:
struct sockaddr _in {
short sin_family; /* тип домена - AF_INET */
unsigned short sin_port; /* 16-битный номер порта в сетевом
порядке байт */
struct in_addr sin_addr; /* IP-адрес сетевого интерфейса */
char sin_zero[8]; /* поле , заполненное нулями */
};
Поле sin_family задает семейство протоколов: для TCP/IP это
предопределенная константа - AF_INET.
Структура sin_addr (она имеет формат типа struct in_addr)
должна содержать IP-адрес.

Ларина Т.Б. Сетевые средства операционных систем
59
Поле sin_port должно содержать номер порта в сетевом порядке
байт. Если в качестве номер порта указать 0 , то операционная система
привяжет сокет к свободному номеру порта по своему усмотрению.
Последнее 8-байтное поле структуры содержит нули.
Варианты задания IP–адреса
IP–адрес в структуре sin_addr может быть задан двумя
способами. Он может быть привязан к конкретному сетевому
интерфейсу или к вычислительной системе в целом, то есть,
информация может быть получена или отослана через любой сетевой
интерфейс этого узла.
В первом случае в структуре sin_addr задается числовое
значение IP-адреса сетевого интерфейса в сетевом порядке байт.
Во втором случае это значение - предопределенная константа
INADDR_ANY, приведенная к сетевому порядку байт.
Посылка данных. Системный вызов Sendto
Системный вызов Sendto для посылки данных является
универсальным и может применяться для любого типа сокетов.
int sendto (sockd, *buff, nbytes, flags, struct sockaddr *to,
addrlen)
Параметры вызова:
int sockd - дескриптор сокета, через который посылаются
данные;
char *buff – указатель на область памяти, где размещены
данные;
int nbytes - длина данных в байтах;
int flags – флаги системного вызова (обычно 0 );
*to - указатель на структуру, содержащую полный адрес сокета-
получателя;
int аddrlen - фактическая длина этой структуры.

Ларина Т.Б. Сетевые средства операционных систем
60
Вызов Sendto при нормальном завершении возвращает
количество фактически посланных байт, при ошибке - отрицательное
значение.
Прием данных. Системный вызов Recvfrom
Системный вызов Recvfrom для приема данных является
универсальным. Он может применяться и для дейтаграммных и для
потоковых сокетов.
int recvfrom( sockd, *buff, nbytes, flags, struct sockaddr *from,
*addrlen)
Параметры вызова:
int sockd - дескриптор сокета, через который принимаются
данные;
char *buff – указатель на область памяти, где будут размещены
данные;
int nbytes – длина области данных в байтах;
int flags - флаги системного вызова (в нашем случае всегда 0 );
*from - указатель на структуру, куда будет помещен полный
адрес сокета- отправителя или NULL, если адрес отправителя не
важен;
int *аddrlen - указатель на переменную, куда при приеме будет
занесена длина структуры, содержащей адрес отправителя. Если
параметр *from имеет значение NULL, то и в этот параметр надо
занести NULL .
Вызов recvfrom при нормальном завершении возвращает
количество фактически принятых байт, при ошибке - отрицательное
значение.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
