13. Сеть TCP/IP

Обзор протокола TCP/IP

Термин "TCP/IP" обозначает два разных протокола — TCP и IP. Поскольку эти протоколы обычно используются совместно, понятие "TCP/IP" стало стандартным в современном Интернете. В сущности, оно характеризует сетевые средства связи, в которых данные передаются по IP-сетям с помощью протокола TCP.

Эта глава включает в себя сведения о том, как настроить протокол TCP/IP в сети на основе ОС QNX Neutrino. Кроме того, она содержит информацию о разрешении неполадок и другие подробности, которые важны с точки зрения системного администрирования. Сеть TCP/IP на основе QNX Neutrino обеспечивает доступ к ресурсам, которые расположены на любом удаленном компьютере, поддерживающем стек протоколов TCP/IP.

Клиенты и серверы

Существуют два типа TCP/IP-хостов: клиенты и серверы. Клиент запрашивает службу TCP/IP, а сервер предоставляет ее. При планировании сети необходимо решить, какие хосты будут серверами, а какие — клиентами.

Например, компьютер, который посылает запросы на соединение через протокол telnet, должен быть настроен как клиент, а компьютер, который принимает эти запросы — как сервер.

Хосты и шлюзы

В терминологии протокола TCP/IP компьютеры, которые доступны по сети, называются хостами (host) или шлюзами (gateway).

Примечание. Для того чтобы воспользоваться протоколом TCP/IP, необходимо знать IP-ад­рес локального хоста и IP-адрес хоста, к которому требуется подключиться. Обычно обращение к удаленному хосту осуществляется по текстовому имени, которое разрешается в IP-адрес с помощью сервера имен.

Серверы имен

Сервер имен (nameserver) представляет собой базу данных, которая содержит имена и IP-адреса хостов. Доступ к TCP/IP- и интернет-хостам обычно осуществляется через текстовое имя (например, www.qnx.com) и механизм, который преобразует имя в IP-адрес (например, 209.226.137.1).

Самый простой способ создать такую привязку — воспользоваться таблицей в файле /etc/hosts. Этот метод эффективен в сетях небольшого и среднего масштаба. Если сеть включает в себя много хостов или не является внутренней, то необходимо использовать сервер имен (например, для подключения к поставщику услуг Интернета).

При подключении к TCP/IP-хосту с использованием имени у сервера имен запрашивается соответствующий IP-адрес, а затем осуществляется соединение с этим IP-адресом. Сервер имен может быть задан следующими способами:

nameserver 10.0.0.2

nameserver 10.0.0.3

Для того чтобы сконфигурировать сеть и задать серверы имен, можно воспользоваться инструментом настройки протокола TCP/IP и коммутируемых соединений графической оболочки Photon под названием phlip. Утилита phlip присваивает значение конфигурационной строке _CS_RESOLVE. Эту конфигурационную строку можно также задавать вручную. Если строка _CS_RESOLVE существует, то она всегда используется для поиска сервера имен вместо файла /etc/resolv.conf.

Более подробные сведения о поиске имен хостов и серверов имен в TCP/IP-сетях см. в разделах /etc/hosts и /etc/resolv.conf справочника по утилитам.

Примечание. Если сервер имен не отвечает, то существует таймаут по 1,5 минуты на каждый сервер. Этот таймаут не может быть изменен, но многие утилиты TCP/IP имеют опцию -n, которую можно использовать, что бы избежать поиска имени.

Маршрутизация

Маршрутизация определяет, как пакет передается адресату. Существуют следующие категории маршрутизации.
Хост устанавливает соединения только с теми хостами, которые находятся в его сети. Например, минимальная маршрутизация используется в изолированной сети.
Если сеть включает в себя небольшое и постоянное число шлюзов, то можно настроить и сохранить таблицы маршрутизации протокола TCP/IP вручную с помощью команды route.

Эта конфигурация используется очень часто. Если хост имеет доступ к Интернету, то он обычно добавляет один статический маршрут, который называется маршрутом по умолчанию (default route). Этот маршрут направляет все TCP/IP-пакеты, которые отправляются данным хостом и не адресованы какому-либо хосту локальной сети, на шлюз, который обеспечивает доступ к Интернету.
Если в сети существует более одного пути к одному и тому же хосту, то, возможно, требуется использовать динамическую маршрутизацию. При динамической маршрутизации информация об изменении состояния сети распространяется с помощью протоколов маршрутизации. Если необходимо реагировать на эти изменения, то следует запустить утилиту routed, которая реализует протоколы RIP (Routing Information Protocol, протокол маршрутной информации) и RIPv2.

Маршрутизацию и протоколы маршрутизации часто путают друг с другом. Маршрутизация в стеке TCP/IP определяется с помощью таблиц маршрутизации, а протоколы маршрутизации позволяют изменять эти таблицы.

Программные компоненты сети TCP/IP

Для использования протокола TCP/IP необходимы следующие программные компоненты (рис. 13.1):

Параметры конфигурации задаются с помощью утилит ifconfig и route.

Если используется протокол динамического конфигурирования хостов (Dynamic Host Configuration Protocol, DHCP), то, независимо от версии стека TCP/IP, можно воспользоваться утилитой dhcp.client для того, чтобы автоматически задать конфигурационные параметры, которые предоставляет DHCP-сервер.

Примечание. Программа распознавания устройств автоматически запускает администратор io-pkt* при загрузке операционной системы, а затем загружает полнофункциональный стек TCP/IP и запускает драйверы обнаруженных устройств. Если при загрузке требуется использовать компактный стек или задавать какие-либо параметры (например, включать протокол IPSec), то необходимо отредактировать файлы распознавания устройств. Более подробные сведения и пример см. в подразд. "Распознавание устройств" раздела 8.


Рис. 13.1. Компоненты протокола TCP/IP в операционной системе QNX Neutrino

Стек TCP/IP, основан на стеке TCP/IP операционной системы NetBSD и поддерживает схожие с ним возможности. Если для конфигурирования полнофункционального стека не используется утилита phlip (инструмент настройки протокола TCP/IP и коммутируемых соединений графической оболочки Photon), то необходимо воспользоваться утилитами ifconfig и route, как показано далее, поскольку конфигурировать полнофункциональный стек с помощью командно-строковых аргументов по аналогии с компактным стеком нельзя.

Для задания IP-адреса интерфейса следует воспользоваться утилитой ifconfig. Чтобы назначить сетевому интерфейсу IP-адрес 10.0.0.100, необходимо ввести команду:

ifconfig if_name 10.0.0.100

where if_name is the interface name that the driver uses.


Если требуется также указать шлюз, следует ввести команду
route:

route add default 10.0.0.1


Эта команда устанавливает IP-адрес шлюза
10.0.0.1.

Чтобы затем просмотреть сетевую конфигурацию, следует воспользоваться командой netstat (команда netstat -in отображает информацию о сетевых интерфейсах):

Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll

lo0 32976 <Link> 0 0 0 0 0

lo0 32976 127 127.0.0.1 0 0 0 0 0

en0 1500 <Link> 00:50:da:c8:61:92 21 0 2 0 0

en0 1500 10 10.0.0.100 21 0 2 0 0


Чтобы отобразить информацию о таблице маршрутизации в полном стеке, следует воспользоваться командой netstat -rn. Ее результат выглядит так:

Routing tables


Internet:

Destination Gateway Flags Refs Use Mtu Interface

default 10.0.0.1 UGS 0 0  — en0

10 10.0.0.100 U 1 0  — en0

10.0.0.100 10.0.0.100 UH 0 0  — lo0

127.0.0.1 127.0.0.1 UH 0 0  — lo0


Эта таблица показывает, что маршрут по умолчанию задан и его IP-адрес равен
10.0.0.1.

Запуск интернет-серверов

Если хост является сервером, то он запускает соответствующий сервис для обслуживания клиентских запросов. Сервер TCP/IP обычно запускает сервис inetd, который также называют "суперсервером Интернета". Сервис inetd можно запустить из файла rc.local (см. описание файла /etc/rc.d/rc.sysinit в разделе 8).

Предупреждение.

Запуск сервиса inetd дает внешним пользователям возможность подключаться к локальному компьютеру, поэтому его ненадлежащая настройка способна вызвать проблемы с безопасностью.

В сети TCP/IP сервис inetd ожидает соединений через порты со стандартными номерами, которые указаны в файле /etc/inetd.conf. После получения запроса утилита inetd запускает соответствующий серверный сервис. Например, если клиент запрашивает удаленное подключение к хосту с помощью утилиты rlogin, то для обслуживания этого запроса сервер inetd запускает сервис удаленного подключения rlogind. В большинстве случаев клиентские запросы обслуживаются таким способом.

Сервисы, которые может запускать утилита inetd, задаются в конфигурационном файле суперсервера /etc/inetd.conf. Версия этого файла, которая входит в дистрибутив ОС QNX Neutrino, содержит все сервисы TCP/IP, имеющиеся в дистрибутиве, а также некоторые нестандартные службы утилиты pidin. Редактировать файл /etc/inetd.conf необходимо лишь тогда, когда требуется добавить или удалить определения сервисов. Утилита inetd считывает конфигурационную информацию из этого файла при запуске. Файл /etc/inetd.conf включает в себя следующие часто используемые сервисы.
Примечание. Сервисы, которые перечислены в этом файле, не следует запускать вручную; они должны запускаться сервером inetd.

Запуск сервисов rshd и rlogind открывает доступ к локальному компьютеру извне. Для задания доверенных пользователей необходимо воспользоваться файлом /etc/hosts.equiv или ˜/.rhosts, однако следует быть очень внимательным.

Существуют и другие резидентные сервисы, которые могут работать независимо от сервера inetd (их описания приведены в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01):

Эти сервисы прослушивают свои TCP-порты и управляют собственными транзакциями. Они обычно запускаются при загрузке компьютера и затем работают постоянно. Тем не менее, для экономии системных ресурсов можно запускать сервис bootpd с помощью сервера inetd только при получении запроса на загрузку.

Запуск нескольких экземпляров стека TCP/IP

В некоторых ситуациях необходимо запускать несколько экземпляров стека протоколов TCP/IP.

io-pkt-v4 -del900 pci=0x0

io-pkt-v4 -i1 -del900 pci=0x1 -ptcpip prefix=/sock2

Чтобы получить PCI-индексы сетевых плат, можно воспользоваться командой pci -vvv. Если используются различные типы сетевых плат, то указывать PCI-индекс не обязательно.

Параметр -i во втором экземпляре стека TCP/IP указывает утилите io-pkt-v4 зарегистрироваться под префиксом io-pkt1. Параметр prefix указывает на то, что второй стек должен быть зарегистрирован под префиксом /sock2/dev/socket вместо префикса по умолчанию /dev/socket. Приложения, которым необходимо использовать второй стек TCP/IP, должны задать переменную окружения SOCK. Пример:

SOCK=/sock2 telnet 10.59


или

SOCK=/sock2 netstat -in


или

SOCK=/sock2 ifconfig en0 192.168.2.10


Если переменная SOCK не задана, то команда использует первый стек TCP/IP.

Динамически назначаемые параметры TCP/IP

Когда хост добавляется в сеть или подключается к Интернету, необходимо задать его адрес и некоторые другие конфигурационные параметры. Для этого существует несколько распространенных механизмов:

Серверы, которые реализуют эти протоколы в корпоративной сети, предоставляют клиенту IP-адрес, шлюз, маску сети, серверы имен и даже принтер. Пользователям не обязательно конфигурировать свои хосты вручную для того, чтобы использовать сеть.

Операционная система QNX Neutrino реализует еще один протокол автоматического конфигурирования под названием AutoIP, который является проектом комитета IETF по автоматической настройке. Этот протокол используется в небольших сетях для назначения хостам IP-адресов, локальных для канала (link-local). Протокол AutoIP самостоятельно определяет IP-адрес, локальный для канала, используя схему согласования с другими хостами и не обращаясь к центральному серверу.

Использование протокола PPPoE

Сокращение PPPoE расшифровывается как "Point-to-Point Protocol over Ethernet" (протокол соединения "точка-точка" через среду Ethernet). Этот протокол инкапсулирует данные для передачи через сеть Ethernet с мостовой топологией.

PPPoE представляет собой спецификацию подключения пользователей сети Ethernet к Интернету через широкополосное соединение, например, выделенную цифровую абонентскую линию, беспроводное устройство или кабельный модем. Использование протокола PPPoE и широкополосного модема обеспечивает пользователям локальной компьютерной сети индивидуальный аутентифицированный доступ к высокоскоростным сетям передачи данных.

Протокол PPPoE объединяет технологию Ethernet с протоколом PPP, что позволяет эффективно создавать отдельное соединение с удаленным сервером для каждого пользователя. Управление доступом, учет соединений и выбор поставщика услуг определяется для пользователей, а не для узлов сети. Преимущество этого подхода заключается в том, что ни телефонная компания, ни поставщик услуг Интернета не должен обеспечивать для этого какую-либо специальную поддержку.

В отличие от коммутируемых соединений, соединения через цифровую абонентскую линию и кабельный модем всегда активны. Поскольку физическое соединение с удаленным поставщиком услуг совместно используется несколькими пользователями, необходим метод учета, который регистрирует отправителей и адресатов трафика, а также производит начисления пользователям. Протокол PPPoE позволяет пользователю и удаленному узлу, которые участвуют в сеансе связи, узнавать сетевые адреса друг друга во время начального обмена, который называется обнаружением (discovery). После того как сеанс между отдельным пользователем и удаленным узлом (например, поставщиком услуг Интернета) установлен, за этим сеансом можно вести наблюдение для того, чтобы производить начисления. Во многих домах, гостиницах и корпорациях общий доступ к Интернету предоставляется через цифровые абонентские линии с использованием технологии Ethernet и протокола PPPoE.

Соединение через протокол PPPoE состоит из клиента и сервера. Клиент и сервер работают с использованием любого интерфейса, который близок к спецификациям Ethernet. Этот интерфейс применяется для выдачи клиентам IP-адресов с привязкой этих IP-адресов к пользователям и, по желанию, к рабочим станциям, вместо аутентификации на основе только рабочей станции. Сервер PPPoE создает соединение "точка-точка" для каждого клиента.

Установка сеанса PPPoE

Для того чтобы создать сеанс PPPoE, следует воспользоваться сервисом pppoed. Модуль io-pkt-* предоставляет службы протокола PPPoE. Сначала необходимо запустить io-pkt-* с подходящим драйвером. Пример:

io-pkt-v6-hc -del900


Затем следует создать сеанс связи с любым сервером с помощью файла
/etc/ppp/pppoe-up для того, чтобы запустить сервис pppd:

pppoed


После этого следует создать сеанс связи с сервером, который имеет имя
PPPOE_GATEWAY:

pppoed name=PPPOE_GATEWAY


Когда сеанс PPPoE установлен, сервис pppoed использует сервис pppd для создания соединения "точка-точка" через этот сеанс. Сервис pppd получает локальную конфигурацию протокола TCP/IP от сервера (поставщика услуг Интернета).

Запуск соединения "точка-точка" через сеанс PPPoE

Для установления каналов связи "точка-точка" через протокол TCP/IP программе pppoed необходим сервис pppd. При запуске сервиса pppd необходимо воспользоваться несколькими параметрами, которые специфичны для его работы через сеанс PPPoE. Пример файла /etc/ppp/pppoe-up:

#!/bin/sh

pppd debug /dev/io-net/ppp_en -ac -pc -detach defaultroute \

require-ns mtu 1492 name username


Для работы сервиса
pppd с сервисом pppoed обязательны следующие параметры.


Примечание. Если при подключении сервиса pppoed к некоторым сайтам Интернета возникают проблемы, см. "PPPOE and Path MTU Discovery" в электронном руководстве "Neutrino Technotes".

Использование протокола DHCP

Хост TCP/IP использует протокол DHCP (Dynamic Host Configuration Protocol, динамический протокол конфигурирования хостов) для получения своих конфигурационных параметров (IP-адреса, шлюза, серверов имен и т. д.) у DHCP-сервера, который содержит конфигурационные параметры всех хостов сети.

Утилита dhcp.client, которая является DHCP-клиентом операционной системы QNX Neutrino, получает эти параметры и автоматически конфигурирует хост для использования Интернета или локальной сети.

Если утилита dhcp.client не может применить конфигурационные параметры, которые предоставлены DHCP-сервером, она передает эти параметры сценарию, который она исполняет. Этот сценарий можно использовать для применения любых параметров, которые не устанавливаются утилитой dhcp.client. Более подробные сведения см. в разделе о dhcp.client справочника по утилитам.

Использование протокола AutoIP

AutoIP представляет собой модуль, который необходимо смонтировать в администратор io-pkt*. Этот модуль используется для быстрого конфигурирования хостов в небольшой сети. Протокол AutoIP назначает своему интерфейсу IP-адрес, локальный для канала, из сети 169.254/16, если этот адрес не используется никаким другим хостом. Преимущество протокола AutoIP состоит в том, что необходимость в центральном конфигурационном сервере отсутствует. Хосты самостоятельно определяют, какие IP-адреса свободны для использования, и отслеживают возникновение конфликтов.

Обычно хост использует протоколы DHCP и AutoIP одновременно. Когда хост впервые подключается к сети, он не располагает информацией о наличии в сети DHCP-сервера. Если запустить программу dhcp.client с параметром –a (использовать IP-адрес как псевдоним), то интерфейсу одновременно присваивается IP-адрес, локальный для канала, и IP-адрес, который выдается протоколом DHCP. Если DHCP-сервер отсутствует, то наступает тайм-аут, в результате которого программа dhcp.client завершается и оставляет активным IP-адрес, локальный для канала. Если позднее DHCP-сервер становится доступным, то утилиту dhcp.client можно перезапустить и применить IP-адрес, который выдает протокол DHCP, без помех для TCP/IP-соединений, использующих IP-адрес, локальный для канала.

Одновременная активность адреса, который назначается протоколом DHCP, и IP-адреса, локального для канала, обеспечивает связь с хостами, которые имеют как IP-адреса, локальные для канала, так и обычные IP-адреса. Более подробные сведения см. в разделах о lsm-autoip.so и dhcp.client в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01.

Устранение неполадок

Для обнаружения неполадок, которые возникают в сети TCP/IP (например, невозможность передачи пакетов по сети), необходимо использовать несколько утилит. Эти утилиты опрашивают хосты, серверы и шлюзы с целью получения диагностической информации для локализации неисправностей и отвечают на следующие типичные вопросы.
Как было сказано ранее, администратор io-pkt* является связующим звеном между драйверами и протоколами. Чтобы проверить наличие неполадок в нем, следует воспользоваться командой pidin:

$ pidin -P io-pkt-v4 mem


Затем надо выполнить поиск разделяемого объекта протокола TCP/IP в выводе этой команды:

pid tid name prio STATE code data stack

126996 1 sbin/io-pkt-v4-hc 21o SIGWAITINFO 872K 904K 8192(516K)*

126996 2 sbin/io-pkt-v4-hc 21o RECEIVE 872K 904K 8192(132K)

126996 3 sbin/io-pkt-v4-hc 21r RECEIVE 872K 904K 4096(132K)

126996 4 sbin/io-pkt-v4-hc 21o RECEIVE 872K 904K 4096(132K)

126996 5 sbin/io-pkt-v4-hc 20o RECEIVE 872K 904K 4096(132K)

126996 6 sbin/io-pkt-v4-hc 9o RECEIVE 872K 904K 4096(132K)

libc.so.3 @b0300000 444K 16K

devnp-shim.so @b8200000 28K 8192

devn-epic.so @b8209000 40K 4096

lsm-qnet.so @b8214000 168K 36K


Вывод должен содержать разделяемый объект сетевого драйвера (в данном случае это драйвер devnp-shim.so, который позволяет io-pkt использовать унаследованный из устаревшего стека io-net драйвер devn-epic.so).

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

getconf _CS_RESOLVE

Если конфигурационная строка не используется, то надо ввести команду:

cat /etc/resolv.conf

Файл /etc/hosts содержит информацию, которая относится к известным хостам сети. Каждому хосту должна соответствовать одна строка, которая включает в себя следующие данные:

интернет_адрес официальное_имя_хоста псевдонимы


Чтобы отобразить содержимое этого файла, следует воспользоваться

командой:

cat /etc/hosts

Сведения о состоянии сети можно получить с помощью следующих команд: Более подробные сведения о команде netstat см. в справочнике по утилитам. Чтобы определить, подключен ли локальный хост к другим хостам, следует воспользоваться утилитой ping. Пример:

ping isp.com

Если подключение существует, утилита ping отображает приблизительно следующее:

PING isp.com (10.0.0.1): 56 data bytes

64 bytes from 10.0.0.1: icmp seq=0 ttl=255 time=0 ms

64 bytes from 10.0.0.1: icmp seq=1 ttl=255 time=0 ms

64 bytes from 10.0.0.1: icmp seq=2 ttl=255 time=0 ms

64 bytes from 10.0.0.1: icmp seq=3 ttl=255 time=0 ms

64 bytes from 10.0.0.1: icmp seq=4 ttl=255 time=0 ms

64 bytes from 10.0.0.1: icmp seq=5 ttl=255 time=0 ms

64 bytes from 10.0.0.1: icmp seq=6 ttl=255 time=0 ms


Это сообщение продолжает выводиться до тех пор, пока утилита
ping не завершится, например, с помощью нажатия комбинации клавиш <Ctrl>+<C>. Следует воспользоваться командой nicinfo:

/usr/sbin/nicinfo устройство


Примечание. Все пользователи, кроме root, должны указывать полный путь к утилите nicinfo.

Эта утилита отображает информацию о соединении заданного сетевого интерфейса или интерфейса /dev/io-net/en0 (если интерфейс не указан). Эта информация включает в себя число переданных и полученных пакетов, коллизий и других ошибок:

3COM (90xC) 10BASE-T/100BASE-TX Ethernet Controller

Physical Node ID ................. 000103 E8433F

Current Physical Node ID ......... 000103 E8433F

Media Rate ....................... 10.00 Mb/s half-duplex UTP

MTU .............................. 1514

Lan .............................. 0

I/O Port Range ................... 0xA800 -> 0xA87F

Hardware Interrupt ............... 0x7

Promiscuous ...................... Disabled

Multicast ........................ Enabled


Total Packets Txd OK ............. 1585370

Total Packets Txd Bad ............ 9

Total Packets Rxd OK ............. 11492102

Total Rx Errors .................. 0



Total Bytes Txd .................. 102023380

Total Bytes Rxd .................. 2252658488


Tx Collision Errors .............. 39598

Tx Collisions Errors (aborted) ... 0

Carrier Sense Lost on Tx ......... 0

FIFO Underruns During Tx ......... 0

Tx deferred ...................... 99673

Out of Window Collisions ......... 0

FIFO Overruns During Rx .......... 0

Alignment errors ................. 0

CRC errors ....................... 0