Концепция сокетов

В основу API-интерфейса сетевых операций ввода-вывода системы UNIX положена концепция сокетов (sockets)3. Под сокетом будем подразумевать обобщенную форму механизма доступа к файлам системы UNIX, обеспечивающего конечную точку для взаимодействия. Как и при получении доступа к файлам, прикладные программы при необходимости посылают запрос операционной системе на создание сокета. Система возвращает небольшое целое число, которое затем используется в прикладной программе для идентификации только что созданного сокета. Основное отличие между дескриптором файла и дескриптором сокета заключается в том, что операционная система связывает дескриптор файла с определенным файлом или устройством при вызове прикладной программой функции open. Однако при создании сокета прикладная программа может и не привязывать его к определенному адресу получателя. Адрес получателя может указываться в прикладной программе каждый раз при использовании сокета (например, при отсылке дейтаграммы). Кроме того, можно связать с сокетом и адрес определенного получателя. Тогда при использовании сокета не нужно будет каждый раз указывать адрес получателя (как, например, при открытии ТСР-соединения).

Пока мы будем считать, что сокеты является частью операционной системы, и опишем концепцию их использования так, как они реализованы в UNIX. В последующих разделах будет показано, как в других операционных системах с помощью библиотечных процедур реализуется API-интерфейс сокетов.

В определенном смысле можно сказать, что сокеты функционируют аналогично файлам или устройствам системы UNIX. Поэтому их можно использовать совместно с традиционными функциями, такими как read или write. Например, после того, как прикладная программа создаст сокет и свяжет его с определенным ТСР-соединением, ведущим к получателю, который находится во внешней сети, она может использовать функцию write для отсылки по этому соединению потока данных. Прикладная программа, выполняющаяся на другом конце соединения, может использовать функцию read для получения этих данных. Чтобы обеспечить возможность использования элементарных функций, таких как read или write как с файлами, так и с сокетами, операционная система назначает в качестве дескрипторов сокета и файла целые числа, выбранные из одного набора. Причем, если данное число назначено в качестве дескриптора файла, то оно не может быть одновременно назначено дескриптором сокета, и наоборот.

Создание сокета

Сокеты создаются с помощью функции socket как только в них возникает потребность. Этой функции передается три целочисленных параметра, а возвращает она целое число:

результат = socket   (семейство,   тип, протокол)

Параметр семейство определяет семейство протоколов, которое будет использоваться с сокетом. Другими словами, этот параметр указывает операционной системе, как следует интерпретировать указанные в прикладной программе адреса. В настоящее время существует несколько семейств протоколов. Среди прочих можно выделить следующие4:

  • TCP/IP (PF_INET);
  • PUP (PF_PUP), разработанный корпорацией Xerox;
  • AppleTalk (PF_APPLETALK), созданный фирмой Apple Computer, Inc.
  • файловая система UNIX (PF_UNIX).

Параметр тип задает тип желаемого взаимодействия. Здесь можно указать:

  • надежную потоковую службу доставки (SOCK_STREAM);
  • службу доставки дейтаграмм, не требующую установки соединения с получателем (SOCK_DGRAM);
  • низкоуровневый тип (SOCK_RAW), с помощью которого привилегированные программы могут получить доступ к протоколам низкого уровня и драйверам сетевых интерфейсов.

Кроме перечисленных выше, планировалось создать еще два типа, но эти планы так и не были осуществлялись.

Хотя обобщенный подход, при котором семейство протоколов и тип желаемого взаимодействия рассматриваются независимо друг от друга, может показаться достаточным для того, чтобы учесть все возможные случаи, на самом деле это не так. Во-первых, бывает, что семейством протоколов не поддерживается один или несколько возможных типов служб. Например, в системе UNIX предусмотрен механизм межпроцессного взаимодействия, который называется каналом (pipe). Несмотря на то что в нем используется надежная потоковая служба доставки, однако в нем не предусмотрен механизм для упорядоченной доставки пакетов. Следовательно, не все комбинации семейства протоколов и типа службы имеют смысл. Во-вторых, в некоторые семейства могут быть включены несколько протоколов, поддерживающих один тип службы. Например, может случиться так, что одно семейство протоколов поддерживает две службы доставки дейтаграмм, не требующих установки соединения с получателем. Поэтому, чтобы можно было работать с несколькими протоколами, входящими в одно семейство, в функции socket был предусмотрен третий параметр, который используется для выбора определенного протокола. Чтобы указать значение третьего параметра, программист должен в достаточной степени разбираться в структуре семейства протоколов и располагать информацией о типе службы, предоставляемой каждым из протоколов.

Поскольку разработчики попытались охватить большинство стандартных операций системы UNIX с помощью одного механизма сокетов, возникала необходимость в методе, с помощью которого можно было бы смоделировать механизм каналов системы UNIX. Нам нет необходимости углубляться во все детали работы этого механизма, интерес представляет лишь одно его ярко выраженное свойство: механизм каналов отличается от стандартных сетевых операций, поскольку вызывающий процесс одновременно создает обе конечные точки взаимодействия. Для поддержки в системе сокетов механизма каналов разработчики добавили функцию socketpair, которая имеет следующий синтаксис: socketpair(семейство,   тип,  протокол, массив-сокетов)

По сравнению с функцией socket, функция socketpair имеет дополнительный параметр, называемый массив-сокетов. В нем указывается адрес двухэлементного массива целых чисел. Функция socketpair одновременно создает два сокета и помещает их дескрипторы в два элемента массива, адрес которого указан в качестве параметра массив-сокетов. Читатели должны понимать, что нет смысла использовать функцию socketpair для семейства протоколов TCP/IP. Мы упоминаем ее только для того, чтобы сделать наше описание интерфейса более полным.

В прикладных программах, написанных для системы UNIX, для обозначения семейства протоколов используются символические имена, например pf_inet. Соответствующие им числовые значения определены в системных заголовочных файлах.

Похожие статьи Меню Опрос Фото Популярное
rss