14. Поддержка стека
протоколов TCP/IP
Введение
Поскольку роль
Интернета в повседневной жизни становится все более заметной,
протокол, на котором он основан IP (Internet Protocol),
становится все более важным. IP-протокол и связанные с ним
инструменты имеют широкое распространение, что делает его по
сути стандартом для многих частных сетей.
IP-протокол
способен выполнять множество задач: от простых (например,
удаленный доступ) до более сложных (например, передача в
реальном времени сводок с фондовых бирж). Многие предприятия
начинают использовать в своей работе Всемирную Сеть (которая,
как правило, основана на IP-протоколе) для взаимодействия с
клиентами, передачи рекламы и других целей. ОС QNX Neutrino
отлично подходит для самых разных применений, связанных с
глобальной сетью Интернет, начиная от встраиваемых сетевых
устройств и заканчивая маршрутизаторами, которые как раз и
служат для того, чтобы Интернет мог работать.
С учетом всех
этих и многих других требований, для ОС QNX Neutrino был
разработан стек протоколов TCP/IP (io-pkt*), который может работать с
минимальными ресурсами и использует обычный программный
интерфейс BSD.
Конфигурации
стека
Для ОС QNX
Neutrino поставляются три различных конфигурации стека:
-
Стек NetBSD TCP/IP. Поддерживает новейшие
спецификации RFC по протоколам UDP, IP, TCP и SCTP. Также
поддерживает перенаправление данных (forwarding),
широковещание (broadcast), многоадресную передачу
(multicast), функцию аппаратной контрольной суммы, сокеты
маршрутизации, сокеты доменов Unix, стандарт multilink
PPP, протокол PPPoE, протокол CIDR (бесклассовая
междоменная маршрутизация), фильтрацию NAT/IP, протокол
разрешения адресов ARP, протокол ICMP, протокол IGMP, а
также протоколы CIFS, DHCP, AutoIP, DNS, NFS (версию 2 и
версию 3 "сервер-клиент"), NTP, RIP, RIPv2 и встраиваемый
веб-сервер. Для создания приложений для этого стека
используется стандартный программный интерфейс BSD Socket.
Также включает в себя оптимизированный код для
перенаправления пакетов, позволяющий повысить
производительность и эффективность маршрутизации пакетов
при работе стека в качестве сетевого шлюза.
-
Расширенный стек NetBSD, включающий
протоколы IPsec и IPv6. Включает в себя все возможности
стандартного стека, а также функции, предназначенные для
работы с новым поколением мобильных и безопасных каналов
передачи. Этот стек обеспечивает полную поддержку
протоколов IPv6 и IPsec (для IPv4 и IPv6) посредством
расширений KAME. Кроме того, обеспечивается поддержка
виртуальных частных сетей (VPN) посредством
IPsec-туннелей. Этот двухрежимный стек поддерживает
одновременно протоколы IPv4 и IPv6, а также имеет
поддержку автоконфигурирования в IPv6, что позволяет
выполнять конфигурирование устройств в сетевых средах с
возможностями plug-and-play. Поддержка IPv6 включает в
себя утилиты для этого протокола, а также поддержку
протоколов RIP/RIPng для осуществления динамической
маршрутизации. Для обеспечения расширенных возможностей
протокола IPv6 в дополнение к стандартному программному
интерфейсу сокетов предоставляется расширенный программный
интерфейс Advanced Socket.
Поддержка IPsec
обеспечивает безопасное взаимодействие между узлами или сетями
посредством сервиса секретности данных на основе мощных
криптографических алгоритмов и средств аутентификации данных.
Поддержка IPsec также включает в себя протокол управления
ключами IKE (ISAKMP/Oakley), который позволяет устанавливать
безопасные связи между узлами.
Необходимо отметить, что стек протоколов QNX TCP/IP
является модульным. Например, сетевая файловая система NFS
включена в него как отдельный модуль. Благодаря такой
модульности, а также компактности модулей, разработчики
встраиваемых систем могут легко и быстро создавать небольшие
системы с поддержкой протокола TCP/IP.
Структура администратора
протокола TCP/IP
Ценной особенностью модуля io-pkt*, как, впрочем, и всех администраторов ресурсов в ОС
QNX Neutrino, является его компактность и стандартный
интерфейс. Благодаря естественному наследованию приоритетов в
механизме межзадачного взаимодействия ОС QNX Neutrino, клиенты
обслуживаются с учетом приоритета и в определенном временном
порядке, что позволяет естественным образом распределять
вычислительные ресурсы.
Рис. 14.1. Модуль io-pkt*
и зависимые компоненты
PPP реализован как часть io-pkt-*. Поскольку io-pkt*
управляет передачей пакетов PPP, копирование пакетов данных в
память не требуется. Такой подход позволяет реализовывать по
протоколу PPPoE высокопроизводительные соединения.
Другие
компоненты стека протоколов TCP/IP (например, файловая система
NFS, snmpd-демон и т. д.)
реализуются вне модуля io-pkt-*. Это повышает уровень
модульности и отказоустойчивости системы.
Программный интерфейс
Socket
Программный
интерфейс BSD Socket был очевидным выбором для ОС QNX
Neutrino. Socket API является стандартным программным
интерфейсом по программированию TCP/IP в мире UNIX. Что
касается мира Windows, то в нем существует Winsock API,
который создан на основе BSD Socket API и имеет много общего с
ним, что делает оба эти API совместимыми между собой.
В приложениях,
разрабатываемых с помощью этих программных интерфейсов, могут
использоваться все существующие функции, в том числе:
accept()
bind()
bindresvport()
connect()
dn_comp()
dn_expand()
endprotoent()
endservent()
gethostbyaddr()
gethostbyname()
getpeername()
getprotobyname()
getprotobynumber()
getprotoent()
getservbyname()
getservent()
getsockname()
getsockport()
herror()
hstrerror()
htonl()
htons()
h_errlist()
h_errno()
h_nerr()
inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
ioctl()
listen()
ntohl()
ntohs()
recv()
recvfrom()
res_init()
res_mkquery()
res_query()
res_querydomain()
res_search()
res_send()
select()
send()
sendto()
setprotoent()
setservent()
setsockopt()
shutdown()
socket()
Для получения более подробной информации см.
электронный документ «QNX Neutrino Realtime Operation System. Library Reference».
Обычные демоны
и утилиты, которые можно найти в Интернете, легко переносятся
в эту среду (или компилируются в ней). Таким образом, для
своих приложений можно легко использовать уже существующие
программы.
Функции работы с
базами данных
Функции работы
с базами данных были изменены для большего соответствия
требованиям встраиваемых систем.
/etc/resolv.conf
Посредством
функции confstr() можно использовать
конфигурационные строки для переопределения данных, которые
обычно содержатся в файле /etc/resolv.conf. Также для этих целей можно использовать переменную
окружения RESCONF. И тот и другой метод позволяет использовать
сервер имен без файла /etc/resolv.conf. Это влияет на функцию преобразования имен gethostbyname() и другие функции разрешения
адресов.
/etc/protocols
Функции getprotobyname() и getprotobynumber() были изменены, чтобы включить
небольшое число встроенных протоколов, в том числе IP, ICNP,
UDP и TCP. Для многих приложений это означает, что файл /etc/protocols не требуется.
/etc/services
Функция getservbyname() была изменена, чтобы включить
небольшое число встроенных служб, в том числе ftp, telnet, smtp,
domain, nntp,
netbios-ns, netbios-ssn, sunrpc и nfsd.
Для многих приложений это означает, что файл /etc/services не требуется.
Множественные стеки
протоколов
Сетевой
администратор (io-pkt) в ОС QNX Neutrino позволяет
загружать множество модулей протоколов в виде
разделяемых объектов. Это означает, например, что можно
загружать несколько экземпляров стека TCP/IP на одном и том же физическом
интерфейсе,
что позволяет создавать множество виртуальных сетей (VLAN).
Можно даже запускать множество независимых экземпляров самого
сетевого администратора io-pkt*. Как и
все системные компоненты ОС QNX Neutrino, каждый экземпляр
модуля io-pkt*, естественно, изолирован в памяти, благодаря
особенностям микроядерной архитектуры.
IP-фильтрация
и преобразование сетевых адресов (NAT)
Модуль lsm-pf-*.so сетевого администратора io-pkt* предназначен для IP-фильтрации и преобразования
сетевых адресов (Network Address Translation, NAT) и является динамически загружаемым модулем стека TCP/IP. Он обеспечивает
высокоэффективный межсетевой экран (firewall) и имеет
следующие возможности:
-
группирование правил — позволяет
применять разные наборы правил к разным пакетам данных;
-
фильтрация с отслеживанием состояний
(stateful filtering) — вспомогательная конфигурация,
которая позволяет не применять правила фильтрации к
пакетам данных, проходящих по ранее авторизованному
соединению;
-
преобразование сетевых адресов
(NAT) — отображение нескольких внутренних адресов во
внешний IP-адрес, что позволяет нескольким внутренним
системам использовать один общий IP-адрес;
-
прокси-службы — позволяют применять
NAT-преобразование для ftp,
netbios и H.323;
-
переадресация портов — служит для
переадресации входящего трафика на внутренний сервер или
группу (пул) серверов.
Правила IP-фильтрации и преобразования сетевых адресов
можно добавлять и удалять динамически в процессе работы системы. Службы регистрации событий
также входят в этот комплект утилит для того, чтобы вести
журнал работы этого модуля.
Протокол сетевого времени
(NTP)
Протокол
сетевого времени (Network Time Protocol, NTP) позволяет
устанавливать системное время на сетевых устройствах с помощью
стандартных серверов времени Интернета. NTP-сервис в ОС QNX
Neutrino поддерживает как серверный, так и клиентский режим.
В серверном
режиме NTP-сервис в локальной сети синхронизируется со
стандартными серверами времени, а затем передает полученную
информацию клиентам в локальной сети методом широковещательной
или многоадресной рассылки или ожидает соответствующего
запроса от клиентов, после чего клиентские NTP-системы
синхронизируются с серверной NTP-системой. NTP-служба
реализует протокол NTP версии 4, а также совместима с версиями
3, 2 и 1.
Динамическое
конфигурирование узлов
В ОС QNX Neutrino поддерживается протокол динамического
конфигурирования узла (Dynamic Host Configuration Protocol,
DHCP), который используется для получения конфигурационных
параметров TCP/IP. Клиент DHCP (dhcp.client) получает конфигурационные
параметры от DHCP-сервера и в соответствии с ними
конфигурирует узел TCP/IP. Это позволяет пользователю
присоединить узел к сети, не задумываясь о значениях
необходимых параметров (IP-адрес, шлюз и т. д.).
Служба DHCP также позволяет системному администратору
управлять присоединением узлов к сети. Для управления этими
клиентами также используется DHCP-демон (dhcpd) и агент перенаправления (relay agent) (dhcprelay).
Более подробные
сведения об утилитах dhcp.client, dhcpd и dhcprelay можно найти в справочнике по утилитам.
Модуль AutoIP
Модуль lsm-autoip.so был разработан на основе проекта
стандарта Zeroconf комитета IETF (Internet Engineering Task
Force, Комитет по инженерным вопросам Интернета). Этот модуль
загружается сетевым менеджером io-pkt* и предназначен для автоматического
конфигурирования IPv4-адреса без помощи сервера (как в случае
использования службы DHCP) посредством прямого однорангового
взаимодействия. Этот модуль может работать одновременно с
модулем dhcp.client, что позволяет получать
одновременно как локальный IP-адрес, так и IP-адрес,
назначенный службой DHCP.
Протокол PPPoE
В ОС QNX
Neutrino поддерживается протокол PPPoE (Point to Point
Protocol over Ethernet, Протокол канала связи с
непосредственным соединением (точка-точка) через сеть
Ethernet), который обычно применяется провайдерами
широкополосных сетей. Поддержка PPPoE в ОС QNX Neutrino
включает в себя стек io-pkt-*,
а также сервис pppoed, который согласовывает сессию
по протоколу PPPoE. После установления сессии PPPoE сервис pppd создает PPP-соединение.
При
использовании протокола PPPoE не нужно задавать какие-либо
конфигурационные параметры, так как соответствующие модули
автоматически получают необходимые конфигурационные данные у
интернет-провайдера и выполняют настройку.
Дополнительная информация по применению соответствующих программных компонентов содержится в руководстве "Справочник по утилитам".
-
io-pkt — сетевой менеджер.
-
pppoed — демон,
согласовывающий сессию PPPoE.
-
phlip — утилита в
графической оболочке Photon, предназначенная для
конфигурирования коммутируемых и TCP/IP-соединений.
-
phdialer — утилита установления
соединения в графической оболочке Photon.
/etc/autoconnect
Службы автоматической установки
соединения (autoconnect) позволяет соединяться с
интернет-провайдером при запуске TCP/IP-приложений. Например,
необходимо установить коммутируемое соединение с Интернетом.
При запуске веб-браузера происходит пауза, во время которой
автоматически выполняется скрипт /etc/autoconnect для соединения с заданным интернет-провайдером.
После начала PPP-сессии браузер продолжает свою работу.
Более подробные сведения о
службе автоматической установки соединения можно найти в руководстве "Справочник по утилитам".
Встраиваемый веб-сервер
Встраиваемый веб-сервер, slinger, в ОС QNX Neutrino очень экономно использует ресурсы
памяти и взаимодействует с помощью сокетов TCP/IP
(рис. 14.2). Встраиваемый веб-сервер поддерживает
интерфейс CGI 1.1, протокол http 1.1 и динамический
HTML (посредством команд SSI).
Рис. 14.2. Встраиваемый веб-сервер.
Во многих встраиваемых серверах для того, чтобы
добавить страницы, пользователь вынужден перекомпоновывать
его, что снижает уровень надежности во время конкурентного
исполнения пользовательского кода и кода поставщика в
пространстве разделяемой памяти.
Несмотря на
свою компактность, встраиваемый веб-сервер QNX обеспечивает
достаточную функциональность для поддержки возможности доступа
к генерируемым (динамическим) HTML-страницам через CGI или
SSI.
Метод CGI
Встраиваемый
веб-сервер поддерживает интерфейс CGI 1.1 (Common Gateway
Interface, Общий шлюзовой интерфейс), который является удобным
средством обработки динамических данных. Недостатком
интерфейса CGI является то, что он требователен к ресурсам
из-за использования интерпретируемых языков.
Метод SSI
Технология SSI
(Server Side Includes , Вставки на стороне сервера)
представляет собой разновидность командного языка и позволяет
вставлять инструкции в HTML-текст для реализации в нем
динамического содержания. Например, благодаря технологии SSI,
встраиваемый сервер может:
-
выполнять утилиты в указанных
пользователем точках в HTML-документе (т. е. выходные
данные этих утилит можно поместить в HTML-документ);
-
вставлять содержание других
HTML-файлов в заданные пользователем точки;
-
обрабатывать условные операторы (if, break,
goto), что позволяет
пользователю определять, какие части HTML-файла могут быть
переданы.
Следует отметить,
что SSI-теги могут взаимодействовать с сервером данных.
Метод сервера данных
Вы также можете обрабатывать динамический HTML с
помощью так называемого сервера данных (data server). Сервер данных позволяет
множеству потоков совместно использовать данные независимо от
того, к каким процессам они относятся. Встраиваемый веб-сервер
поддерживает не только технологию SSI, но и возможность
взаимодействия с сервером данных.
Таким образом,
можно, например, создать процесс, обновляющий на сервере
данных информацию о состоянии оборудования, в то время как
встраиваемый веб-сервер может использовать эту информацию
независимым образом, не снижая уровня надежности.
Замечание
возможно
написать простой администратор ввода/вывода для передачи
динамических данных. Необходимо отметить, что этот метод не
ограничивается только встраиваемым веб-сервером, администратор
ввода/вывода может только обрабатывать выходные данные, не
изменяя самих данных.