Московский Государственный Технический Университет
имени Н.Э.Баумана
Кафедра САПР
Федорук В.Г.
rk6fed@wwwcdl.bmstu.ru
263-65-26
Сетевое программирование в ОС UNIX
Данное учебное пособие посвящено
изучению средств программирования
сетевых приложений в среде
операционной системы UNIX.
Основным средством построения
информационно-вычислительных
сетей из ЭВМ, работающих под
управлением ОС UNIX, является
комплекс протоколов TCP/IP.
Программное обеспечение,
реализующее данные протоколы
информационного обмена, как
правило, входит в состав базового
варианта любой современной версии
этой ОС.
Для создания распределенных
приложений в среде ОС UNIX наибольшее
распространение получили
следующие три средства:
- socket-интерфейс прикладной
программы с модулем из состава
ОС, реализующим сетевое
взаимодействие;
- интерфейс транспортного
уровня (TLI - Transport Level Interface);
- средства удаленного вызова
процедур (RPC - Remote Procedure Call).
Причем socket-интерфейс и TLI
обеспечивают возможность
прикладным программам
взаимодействовать, используя
стандартные (или очень похожие на
них) средства ввода-вывода ОС UNIX. RPC
позволяет одной прикладной
программе обращаться к другой (но
функционирующей на другом узле
сети) фактически так же, как одна
функция традиционной программы на
языке СИ обращается к другой.
Примечание. Перечисленные
средства программирования
универcальны и могут быть
использованы для работы с
различными протоколами сетевого
взаимодействия, однако в данном
учебном пособии они
рассматриваются применительно
только к протоколам TCP/IP.
Рассматриваемые средства
предназначены для создания
распределенных приложений,
функционирующих, в первую очередь,
согласно модели взаимодействия
"клиент-сервер". Эта модель
подразумевает, что из двух (в
простейшем случае) параллельно
выполняющихся на разных (а,
возможно, на одном и том же) узлах
сети программ одна является
сервером (поставщиком услуг),
способным решать некоторую задачу
вычислительного или
информационного характера, а
другая - клиентом (потребителем
услуг), который в ходе решения
собственной проблемы сталкивается
с необходимостью получения ответа
на задачи, решаемые сервером.
Программа-сервер пассивна -
непосредственно к решению своей
задачи она приступает только при
поступлении к ней запроса от
клиента, остальное же время она
находится в состоянии ожидания
такого запроса. После решения
поставленной задачи сервер
возвращает клиенту найденный
ответ. В типичной ситуации
программа-клиент приостанавливает
свою работу после выдачи запроса
серверу в ожидании получения
ответа.
Одна программа-сервер может
обслуживать (последовательно)
несколько клиентов, организуя
очередь запросов от них. Клиент и
сервер могут меняться местами
ролями (если того, конечно, требует
логика решаемой проблемы) в разные
моменты времени. Сервер,
обрабатывая запрос какого-либо
клиента, в свою очередь может стать
клиентом, обращаясь за некоторой
услугой к другому серверу.
Двумя наиболее общими режимами
взаимодействия прикладных
программ в вычислительной сети являются:
- режим с установлением
соединения;
- режим без установления
соединения.
Первый режим подразумевает, что
взаимодействие осуществляется в
три этапа:
- установление логической связи
между прикладными программами
(по инициативе клиента);
- двусторонний,
последовательный (потоковый,
без учета каких-либо границ
записей), надежный (без потери и
дублирования) обмен данными;
- закрытие связи (экстренное или
с доставкой буферизованных на
передающей стороне данных).
В режиме без установления
соединения обмен информацией
ведется отдельными блоками данных,
часто называемых дейтаграммами
и содержащими в себе помимо
собственно данных еще и адрес их
получателя (соответственно,
клиента или сервера). В этом режиме,
как правило, не гарантируется
надежность доставки данных (они
могут быть потеряны или
продублированы), может быть
нарушена правильная
последовательность дейтаграмм на
принимающей стороне, но, очевидно,
явно присутствуют границы в
передаваемых данных.
Программист имеет возможность
выбрать режим взаимодействия,
отвечающий специфике создаваемого
приложения.
Одним из аспектов сетевого
программирования является
манипулирование адресами,
идентифицирующими узлы в
вычислительной сети и прикладные
программы на этих узлах. К
сожалению, способы адресации в
сетях, построенных на базе
различных протоколов, также
различны. Ниже рассматриваются
механизмы адресации, принятые в
стеке протоколов TCP/IP.
В сетях на основе TCP/IP для
идентификации отдельного узла
используется уникальное
четырехбайтовое число. Только для
удобства пользователей сети этим
адресам (числам) в соответствие
могут быть поставлены
символические имена узлов сети.
Информация о таком соответствии
хранится в одной или нескольких
специальных базах данных. Система
программирования ОС UNIX
предоставляет библиотеку
вспомогательных функций,
позволяющих работать с этими база-
ми (транслируя, например, имена
узлов в адреса и обратно).
Каналом выхода в
коммуникационную среду, образуемую
вычислительной сетью TCP/IP, для любой
прикладной программы является так
называемый "порт" - чисто
абстрактное ("программное")
понятие, не имеющее какого-либо
соответствия в аппаратуре ЭВМ.
Прикладная программа может
использовать для общения с другими
программами в сети любое
количество портов. Каждый порт
должен иметь уникальный номер.
Номера портов от 1 до 1024
зарезервированы для "широко
известных" приложений. Любой
номер, больший 1024, может быть
использован программистом для
идентификации порта его
приложения, необходимо лишь
следить за его уникальностью в
рамках отдельного узла сети.
В сетях TCP/IP для организации
режима взаимодействия с логическим
соединением используется протокол
транспортного уровня TCP, а режима без
установления соединения - протокол UDP. Причем два порта
с одинаковым номером, но открытые
для взаимодействия по разным
протоколам транспортного уровня,
считаются различными.
Таким образом: для идентификации
партнера по взаимодействию любая
сетевая прикладная программа
должна специфицировать:
- адрес узла сети, на котором
функционирует партнер;
- используемый для
взаимодействия протокол
транспортного уровня (TCP или UDP);
- номер порта, открытого
партнером на его узле сети.
Ниже кратко рассматриваются
перечисленные ранее средства
программирования сетевых
приложений.
|