- •6.4. Внешние коммуникации
- •6.4.1. Протоколы тср/ip
- •6.4.1.1. Определение и достоинства протокола tcp/ip
- •6.4.1.2. Архитектура tcp/ip
- •6.4.1.3. Соответствие между моделями tcp/ip и iso osi
- •6.4.2. Протокол ip
- •6.4.2.1. Структура заголовка ip-пакета
- •Ip-датаграмма
- •6.4.2.2. Ip-адресация
- •190.50.1.1
- •190.50.1.2
- •190.50.2.1
- •190.50.2.2
- •6.4.3. Протокол udp
- •6.4.4. Протокол tcp
- •6.4.4.1. Структура tcp-сегмента
- •6.4.4.2. Этапы tcp-сеанса
- •6.4.5. Программные средства поддержки сетей
- •6.4.5.1. Состав программных средств поддержки сетей
- •1. Почтовые ящики
- •2. Именованные каналы
- •3. Удаленные вызовы процедур
- •4. Протокол NetBios
- •6.4.5.2. Программные средства работы с сокетами
- •6.4.6. Сетевое программное обеспечение уровня приложений
- •6.4.6.1. Протокол ftp
- •6.4.6.2. Протокол smtp
- •Заключение
3. Удаленные вызовы процедур
Вспомним опять традиционную модель процедурного программирования. Прикладная программа выглядит как последовательность вызовов процедур, следующим образом:
Begin
...
Call1;
Call2;
...
End.
Удаленные вызовы процедур – это средство расширения традиционной модели программирования на распределенные системы.
Хотя и можно использовать УВП сами по себе, чаще они все-таки являются средством реализации COM и DCOM.
Понятия интерфейса и глобально уникальных идентификаторов являются фундаментальными для RPC, COM и DCOM.
В технологии RPC также есть клиент и сервер. При этом запрос от клиента выглядит по форме как вызов процедуры, но эта процедура включает в себя всю последовательность действий по передаче данных на сервер, обработке запроса и посылке ответа клиенту.
Процедурный интерфейс скрывает все эти действия.
Базовым недостатком RPC является синхронность. Т.е. когда клиент обращается с RPC-запросами к процедуре сервера, то он блокируется до момента, пока сервер не выполнит функцию и не возвратит результаты.
Существуют усовершенствованные RPC, обеспечивающие асинхронные вызовы. В них для оповещения клиента о выполнении RPC используются обратные вызовы. Хотя структура синхронной программы существенно проще асинхронной.
Программа, реализующая технологию клиент/сервер с помощью RPC, будет выглядеть следующим образом:
Begin
...
CSInterface(Call1);
CSInterface(Call2);
...
End.
Процедура CSInterface() - интерфейсная процедура, первый аргумент которой - это, обычно, имя серверной процедуры, которую необходимо выполнить. Могут передаваться и дополнительные параметры в процедуру CSInterface().
Структура удаленного вызова процедуры может выглядеть следующим образом:
Обобщенная структура интерфейсной процедуры, написанной на псевдокоде, может выглядеть следующим образом:
Procedure CSInterface(P : Procedure);
Begin
Case P Of
Call1 : Begin
Создание структур данных для передачи по сети;
Посылка запроса на сервер;
Выполнение процедуры Call1 на сервере;
Подготовка ответа;
Посылка ответа клиенту;
Прием ответа;
End;
Call2 : Begin
...
End;
Else
...
End Case;
End CSInterface;
Синхронный характер процедурного интерфейса иллюстрируется следующим рисунком:
Клиент Сервер
------------------- -------------------
| | | |
|1. ServerRequest | -----> 2. ------> |-----> 3. |
| (приостанов | | . |
| выполнения) | | . |
| 6.<-----| <----- 5. <------ |4. RespondClient;|
| . | | |
| . | | |
------------------- -------------------
Цифры показывают порядок происходящих событий:
Запрос;
Передача запроса;
Начало обработки запроса;
Ответ;
Посылка ответа;
Получение результата клиентом.
Реализация без ожидания иллюстрируется следующим образом:
Клиент Сервер
------------------- -------------------
| | | |
|1. ServerRequest | -----> 2. ------> |-----> 3. |
| . | | . |
| . | | . |
| 6.<-----| <----- 5. <------ |4. RespondClient;|
| . | | |
| . | | |
------------------- -------------------
Клиент дает запрос серверу и асинхронно продолжает работать одновременно с серверным приложением. Позднее клиент либо запрашивает сервер, либо получает уведомление через специальное средство процедуру обратного вызова.
Структура программы клиента с процедурой обратного вызова включает в себя следующие элементы:
1) Описание процедуры обратного вызова. Содержание процедуры обратного вызова полностью определяется характером задач уровнем протокола. На сетевом уровне (3) - это может быть простая установка флага, извещающего клиента о завершении операции. На уровне презентации (6), например, в протоколе DDE, - это достаточно сложные действия.
Procedure CallbackProc;
Begin
...
End CallbackProc;
2) Предусматривается передача адреса процедуры CallbackProc обратного вызова интерфейсной процедуре CSInterface. Если в качестве фактического параметра передается NULL, то выполнение процедуры CSInterface происходит синхронно, а если передается не NULL, а адрес CallbackProc, то выполнение происходит асинхронно.
Т.е. по выполнению запроса коммуникационная среда сама вызывает процедуру CallbackProc, и тем самым оповещает клиента о выполнении запроса.
Приведенная технология асинхронного взаимодействия клиента и сервера на основе процедуры обратного вызова широко используется на всех уровнях коммуникаций, и далее мы в этом убедимся.
Создание RPC начинается с описания интерфейса, экспортируемого сервером.
Интерфейс создается на языке описания интерфейсов IDL (Interface Definition Language). Язык описания интерфейса имеет строго определенные правила. Например:
Все функции имеют тип void
Параметры сопровождаются модификаторами [in], [out] (входной, выходной)
Типы данных стандартные (int, long). ANSI
Текст интерфейса обрабатывается специальным компилятором, в результате чего формируются так называемые суррогаты (stubs) клиента и сервера.
Суррогат клиента выполняет следующие действия:
Преобразует параметры в вид, пригодный для передачи по каналу
Устанавливает соединение с сервером
Передает серверу данные
Ждет ответа от сервера
Получает данные
Преобразует данные в вид, пригодный клиенту
Передает данные клиенту
Суррогат сервера выполняет следующие действия:
Ждет запросы от клиентов
Получив запрос, преобразует принятые данные в вид, пригодный для выполнения процедуры
Выполняет процедуру
Готовит данные-результаты к передаче по каналу
Передает данные по каналу.
Внешне программа клиента, вызывающего удаленную процедуру, очень похожа на программу, вызывающую локальную процедуру.
Программа сервер существенно сложнее реализуется, чем программа-клиент. Этапы инициализации сервера следующие:
Регистрирует в библиотеке RPC коммуникационный протокол, который будет поддерживать сервер (TCP/IP или именованные каналы)
Регистрирует в библиотеке RPC интерфейс, который поддерживает сервер
Получает набор ссылок, через которые сервер будет взаимодействовать с библиотекой RPC
Через полученные ссылки публикует свои возможности в специальной базе данных “RPC name service database”. Клиент запрашивает специальный сервис “RPC name service” при поиске сервера, способного выполнить запрос.
Переходит в состояние ожидания запросов.
Непосредственное соединение обеспечивают специальные библиотеки. При этом возможна передача как по протоколам TCP/IP (сокеты), так и через именованные каналы.