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

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

Hostname - собственное имя хоста - сущность, возникшая в сети и для сети, но не являющаяся зависимой от сети. Это параметр, используемый как название хоста для его различения с другими хостами в сети. В большинстве систем этот параметр устанавливается программами запуска системы (AKA стартовыми скриптами) и хранится в ядре во время боевой работы системы.

Hostname - это имя хоста. Понятие `хост' имеет смысл при сетевом взаимодействии данной системы с другими системами. Однако, поскольку современные Unix-системы 1) в подавляющем большинстве случаев имеют постоянное или эпизодическое подключение к разнообразным компьютерным сетям (пусть даже по UUCP), 2) сетевые средства используются даже сугубо локальными сервисами, такими, как comsat, xfs, - выбор hostname для хоста становится существенным для беспроблемного функционирования данного хоста в сети.

(Точное определение понятия `хост' производится по правилам соответствующей сети. Для понимания нижеследующего материала считаем слово `хост' эквивалентным слову `система' или `компьютер'.)

Hostname может быть "коротким" (однокомпонентным) - например, `mordor' - или так называемым fully qualified domain name (далее FQDN) - например, `mordor.arda.net'. Второй вариант предпочтительнее, потому что короткое имя (часть FQDN до первой точки) из него получается простым усечением и не требуется поиск FQDN по короткому имени. Однако это не является единственным принятым стилем. Существует стиль с коротким именем и записью доменной части (то есть той что после первой точки) FQDN в общесистемный параметр domainname (параллельный hostname); существует стиль с записью только короткого имени в hostname. Этот последний стиль требует достаточно сложных и нетривиальных операций по получению FQDN из netdb и DNS (см. ниже) и чреват трудноуловимыми ошибками в конфигурации.

Hostname должно быть уникальным в пределах сети. Это требование защищает от разнообразных проблем с дублированием одного hostname у физически разных хостов, таких, как смешение отчетов syslog'а, несоответствие hostname адресу, получаемому по нему, и т.п. Однако это требование следует рассматривать с учетом понятия FQDN и с учетом того, что является пределами сети, в которой находится данный хост. Например, два хоста могут иметь одинаковое имя `mordor', однако FQDN будет `mordor.arda.net' для одного из них и `mordor.carrier.kiev.ua' для второго. Смешение syslog'овых отчетов с них даст проблемы, так как remote syslog передает только первую часть hostname даже в случае если оно является FQDN; в то же время, большинство Internet-сервисов, использующих FQDN, проведут надлежащее различие между этими двумя хостами.

NETDB - понятие, возникшее в ранние времена развития сетей на юниксах. "База данных сети" предполагается содержащей механизмы и данные для преобразования имен хостов в адреса и адресов - в имена. Интерфейс к этим данным сводится в основном к двум функциям стандартной библиотеки языка Си: gethostbyname() - для получения адреса (-ов) по имени, и gethostbyaddr() - имени (-ен) по адресу. Прототипы этих функций и сопутствующие определения находятся, как можно было предположить;), в заголовочном файле <netdb.h>.

Кроме средств перевода имени хоста в адрес и обратно, netdb содержит другие таблицы соответствия и средства их получения: имена и номера сетевых протоколов; имена и номера портов стандартных и локальных сетевых сервисов. Здесь я подробно рассматривать их не буду, ограничившись именами и адресами хостов.

Запросы к netdb отрабатываются согласно настройкам netdb. Настройки определяют набор и упорядочение используемых баз данных. Используемыми базами данных могут быть: таблицы в локальных файлах (традиционно /etc/hosts); DNS; NIS, NIS+; LDAP; другое.
От системы зависит, какой набор баз и какую гибкость регулирования их использования можно задавать. Системы, реализующие NSS (Name Service Switch) - Solaris, Linux... - дают возможность подключать произвольные модули для доступа к базам данных. Более старые системы используют нерасширяемый набор средств.

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

1. Имя хоста должно быть уникальным в пределах сети и адресного пространства. Подробнее это расписывалось выше.

2. Если для некоторого имени задан адрес (записью в /etc/hosts, A-записью в DNS или иным образом), то по этому адресу должен находиться именно этот, названный этим именем, хост.

3. Если некоторому адресу соответствует имя, то этому имени должен соответствовать этот же адрес.


(C) 2001-2002 Valentin Nechayev. All rights reserved.
Допускается свободное распространение данного текста в некоммерческих целях без изменения содержимого и реквизитов.

$Id: netdb.html,v 1.5 2002/11/16 12:15:28 netch Exp $