
- •Глава 2 Связь
- •2.1. Уровни протоколов
- •2.1. Уровни протоколов 83
- •84 Глава 2. Связь
- •2.1. Уровни протоколов 85
- •2.1.1. Низкоуровневые протоколы
- •86 Глава 2. Связь
- •2.1. Уровни протоколов 87
- •2.1.2. Транспортные протоколы (метод_Метелап лр_1)
- •88 Глава 2. Связь
- •2.1. Уровни протоколов 89
- •92 Глава 2. Связь
- •2.1.3. Протоколы верхнего уровня
- •2.1. Уровни протоколов 91
- •92 Глава 2. Связь
- •2.2. Удаленный вызов процедур 93
- •2.2. Удаленный вызов процедур
- •94 Глава 2. Связь
- •2.2.1. Базовые операции rpc
- •2.2. Удаленный вызов процедур 95
- •96 Глава 2. Связь
- •2.2. Удаленный вызов процедур 97
- •98 Глава 2. Связь
- •2.2.2. Передача параметров
- •2.2. Удаленный вызов процедур 99
- •100 Глава 2. Связь
- •2.2. Удаленный вызов процедур 101
- •102 Глава 2. Связь
- •2.2. Удаленный вызов процедур 103
- •2 .2.3. Расширенные модели rpc
- •104 Глава 2. Связь
- •2.2. Удаленный вызов процедур 105
- •106 Глава 2. Связь
- •2.2.4. Пример — dce rpc
- •2.2. Удаленный вызов процедур 107
- •108 Глава 2. Связь
- •2.2. Удаленный вызов процедур 109
- •110 Глава 2. Связь
- •2.3. Обращение к удаленным объектам 111
- •2.3. Обращение к удаленным объектам
- •112 Глава 2. Связь
- •2.3.1. Распределенные объекты
- •2.3. Обращение к удаленным объектам 113
- •114 Глава 2. Связь
- •2.3.2. Привязка клиента к объекту
- •2.3. Обращение к удаленным объектам 115
- •116 Глава 2. Связь
- •2.3. Обращение к удаленным объектам 117
- •2.3.3. Статическое и динамическое удаленное обращение к методам
- •118 Глава 2. Связь
- •2.3.4. Передача параметров
- •2.3. Обращение к удаленным объектам 119
- •120 Глава 2. Связь
- •2.3.5. Пример 1 — удаленные объекты dce
- •2.3. Обращение к удаленным объектам 121
- •122 Глава 2. Связь
- •2.3.6. Пример 2 — Java rmi
- •2.3. Обращение к удаленным объектам 123
- •124 Глава 2. Связь
- •2.3. Обращение к удаленным объектам 125
- •126 Глава 2. Связь
- •2.4. Связь посредством сообщений
- •2.4.1. Сохранность и синхронность во взаимодействиях
- •2 .4. Связь посредством сообщений 127
- •128 Глава 2. Связь
- •2.4. Связь посредством сообщений 129
- •130 Глава 2. Связь
- •2.4. Связь посредством сообщений 131
- •2.4.2. Нерезидентная связь на основе сообщений
- •132 Глава 2. Связь
- •2.4. Связь посредством сообщений 133
- •134 Глава 2. Связь
- •2.4. Связь посредством сообщений 135
- •136 Глава 2. Связь
- •2.4.3. Сохранная связь на основе сообщений
- •2.4. Связь посредством сообщений 137
- •1 38 Глава 2. Связь
- •2.4. Связь посредством сообщений 139
- •140 Глава 2. Связь
132 Глава 2. Связь
в ажный интерфейс, XTI, присутствующий в транспортном интерфейсе Х/Ореп, который официально именуется интерфейсом транспортного уровня {Transport Layer Interface, ТЫ), разработан организацией AT&T. Сокеты и XTI хорошо подходят к своим моделям сетевого программирования, но имеют разный набор примитивов.
Концептуально сокет {socket) — это конечная точка коммуникации. В эту точку приложение может записывать данные, которые следует переслать по базовой сети, и из этой точки оно может читать приходящие данные. Сокеты образуют абстракцию, лежащую поверх реальной конечной точки сети, которая работает с локальной операционной системой по некоторому транспортному протоколу. Далее мы сосредоточимся на примитивах сокетов для TCP, показанных в табл. 2.1.
Серверы обычно выполняют первые четыре примитива, чаще всего в приведенном в таблице порядке. При вызове примитива socket вызывающий процесс создает новую конечную точку для некоторого транспортного протокола. Изнутри создание конечной точки коммуникации означает, что локальная операционная система резервирует ресурсы для размещения приходящих и отправляемых по некоторому протоколу сообщений.
Примитив bind выполняет привязку локального адреса к только что созданному сокету. Например, сервер должен связать IP-адрес своей машины с номером порта (возможно, общеизвестным) сокета. Привязка сообщает операционной системе, что сервер намерен получать сообщения только на указанные адрес и порт.
Примитив listen применяется только для коммуникаций, ориентированных на соединение. Это неблокирующий вызов, требующий от локальной операционной системы зарезервировать буфер для определенного максимального количества соединений, которое вызывающий процесс намерен поддерживать.
Вызов примитива accept блокирует вызывающий процесс до прихода запроса на соединение. Когда этот запрос придет, локальная операционная система создаст новый сокет с теми же свойствами, что и у базового, и возвратит его вызывающему процессу. Такой подход позволяет серверу, например, разветвить про-
2.4. Связь посредством сообщений 133
ц есс, который впоследствии будет поддерживать связь через новое соединение. Сервер в это время может вернуться в состояние ожидания следующего запроса на соединение с базовым сокетом.
Рассмотрим теперь, как все это выглядит со стороны клиента. И здесь все начинается с создания сокета при помощи примитива socket, однако в явной привязке сокета к локальному адресу нет необходимости, поскольку операционная система может динамически выделить порт при установлении соединения. Примитив connect требует, чтобы вызывающий процесс указал адрес транспортного уровня, на который будет отправлен запрос на соединение. Клиент блокируется до тех пор, пока соединение не будет установлено. После установления соединения стороны начинают обмениваться информацией при помощи примитивов write и read, предназначенных для посылки и приема данных соответственно. Наконец, закрытие соединения при использовании сокетов симметрично и может быть осуществлено как клиентом, так и сервером путем вызова примитива close. Общая схема взаимодействия клиента и сервера с использованием сокетов для коммуникаций, ориентированных на соединение, показана на рис. 2.22. Множество подробностей, относящихся к сетевому программированию с использованием сокетов и других интерфейсов в среде UNIX, можно найти в [438].
Интерфейс передачи сообщений
Работая на высокопроизводительных мультикомпьютерных системах, разработчики рассматривают примитивы, ориентированные на передачу сообщений, как средство, которое облегчит им написание высокоэффективных приложений. Это означает, что такие примитивы должны поддерживать подходящий уровень абстракции (для облегчения разработки приложений), а их реализация должна вызывать минимум дополнительных накладных расходов. Для сокетов это считается неосуществимым по двум причинам. Во-первых, их уровень абстракции явно недостаточен — они поддерживают только простейшие примитивы send и receive. Во-вторых, сокеты были разработаны для связи между сетями с использованием стеков протоколов общего назначения, таких как TCP/IP. Они не подходят для специальных протоколов, разработанных для высокоскоростных взаимодействующих сетей, например таких, которые используются в системе COW или МРР (мы рассматривали их в разделе 1.3). Эти протоколы требуют интерфейса, обладающего множеством дополнительных возможностей, таких как различные варианты буферизации и синхронизации.