Данное учебное пособие посвящено изучению средств программирования сетевых приложений в среде операционной системы UNIX.
Основным средством построения информационно-вычислительных сетей из ЭВМ, работающих под управлением ОС UNIX, является комплекс протоколов TCP/IP. Программное обеспечение, реализующее данные протоколы информационного обмена, как правило, входит в состав базового варианта любой современной версии этой ОС.
Для создания распределенных приложений в среде ОС UNIX наибольшее распространение получили следующие три средства:
Причем socket-интерфейс и TLI обеспечивают возможность прикладным программам взаимодействовать, используя стандартные (или очень похожие на них) средства ввода-вывода ОС UNIX. RPC позволяет одной прикладной программе обращаться к другой (но функционирующей на другом узле сети) фактически так же, как одна функция традиционной программы на языке СИ обращается к другой.
Примечание. Перечисленные средства программирования универcальны и могут быть использованы для работы с различными протоколами сетевого взаимодействия, однако в данном учебном пособии они рассматриваются применительно только к протоколам TCP/IP.
Рассматриваемые средства предназначены для создания распределенных приложений, функционирующих, в первую очередь, согласно модели взаимодействия "клиент-сервер". Эта модель подразумевает, что из двух (в простейшем случае) параллельно выполняющихся на разных (а, возможно, на одном и том же) узлах сети программ одна является сервером (поставщиком услуг), способным решать некоторую задачу вычислительного или информационного характера, а другая - клиентом (потребителем услуг), который в ходе решения собственной проблемы сталкивается с необходимостью получения ответа на задачи, решаемые сервером. Программа-сервер пассивна - непосредственно к решению своей задачи она приступает только при поступлении к ней запроса от клиента, остальное же время она находится в состоянии ожидания такого запроса. После решения поставленной задачи сервер возвращает клиенту найденный ответ. В типичной ситуации программа-клиент приостанавливает свою работу после выдачи запроса серверу в ожидании получения ответа.
Одна программа-сервер может обслуживать (последовательно) несколько клиентов, организуя очередь запросов от них. Клиент и сервер могут меняться местами ролями (если того, конечно, требует логика решаемой проблемы) в разные моменты времени. Сервер, обрабатывая запрос какого-либо клиента, в свою очередь может стать клиентом, обращаясь за некоторой услугой к другому серверу.
Двумя наиболее общими режимами взаимодействия прикладных программ в вычислительной сети являются:
Первый режим подразумевает, что взаимодействие осуществляется в три этапа:
В режиме без установления соединения обмен информацией ведется отдельными блоками данных, часто называемых дейтаграммами и содержащими в себе помимо собственно данных еще и адрес их получателя (соответственно, клиента или сервера). В этом режиме, как правило, не гарантируется надежность доставки данных (они могут быть потеряны или продублированы), может быть нарушена правильная последовательность дейтаграмм на принимающей стороне, но, очевидно, явно присутствуют границы в передаваемых данных.
Программист имеет возможность выбрать режим взаимодействия, отвечающий специфике создаваемого приложения.
Одним из аспектов сетевого программирования является манипулирование адресами, идентифицирующими узлы в вычислительной сети и прикладные программы на этих узлах. К сожалению, способы адресации в сетях, построенных на базе различных протоколов, также различны. Ниже рассматриваются механизмы адресации, принятые в стеке протоколов TCP/IP.
В сетях на основе TCP/IP для идентификации отдельного узла используется уникальное четырехбайтовое число. Только для удобства пользователей сети этим адресам (числам) в соответствие могут быть поставлены символические имена узлов сети. Информация о таком соответствии хранится в одной или нескольких специальных базах данных. Система программирования ОС UNIX предоставляет библиотеку вспомогательных функций, позволяющих работать с этими база- ми (транслируя, например, имена узлов в адреса и обратно).
Каналом выхода в коммуникационную среду, образуемую вычислительной сетью TCP/IP, для любой прикладной программы является так называемый "порт" - чисто абстрактное ("программное") понятие, не имеющее какого-либо соответствия в аппаратуре ЭВМ. Прикладная программа может использовать для общения с другими программами в сети любое количество портов. Каждый порт должен иметь уникальный номер. Номера портов от 1 до 1024 зарезервированы для "широко известных" приложений. Любой номер, больший 1024, может быть использован программистом для идентификации порта его приложения, необходимо лишь следить за его уникальностью в рамках отдельного узла сети.
В сетях TCP/IP для организации режима взаимодействия с логическим соединением используется протокол транспортного уровня TCP, а режима без установления соединения - протокол UDP. Причем два порта с одинаковым номером, но открытые для взаимодействия по разным протоколам транспортного уровня, считаются различными.
Таким образом: для идентификации партнера по взаимодействию любая сетевая прикладная программа должна специфицировать:
Ниже кратко рассматриваются перечисленные ранее средства программирования сетевых приложений.