Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Т2. Связь_Таненбаум_СРС_ПРИС.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.59 Mб
Скачать

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). Эти протоколы требуют интерфейса, обла­дающего множеством дополнительных возможностей, таких как различные вари­анты буферизации и синхронизации.