UNIX: разработка сетевых приложений
11.2. Система доменных имен
Система доменных имен (Domain Name System, DNS) используется прежде всего для сопоставления имен узлов и IP-адресов. Имя узла может быть либо простым (simple name), таким как
илиsolaris, либо полным доменным именем (fully qualified domain name, FQDN), напримерbsdi.solaris.unpbook.com.ПРИМЕЧАНИЕВ техническом отношении FQDN может также называться абсолютным именем и должно оканчиваться точкой, но пользователи часто игнорируют точку в конце. Точка сообщает распознавателю о том, что имя является абсолютным и не требует проведения поиска но различным доменам верхних уровней.
В этом разделе мы рассмотрим только основы DNS, необходимые нам для сетевого программирования. Читатели, интересующиеся более подробным изложением вопроса, могут обратиться к главе 14 [111] и к [1]. Дополнения, требуемые для IPv6, изложены в RFC 1886 [121].
Записи ресурсов
Записи в DNS называются записями ресурсов (resource records, RR). Нас интересуют только несколько типов RR.
■ А. Запись типа А преобразует имя узла в 32-разрядный адрес IPv4. Вот, например, четыре записи DNS для узла
в доменеfreebsd, первая из которых — это запись типа А:unpbook.comfreebsd IN А 12.106.32.254IN AAAA 3ffe:b80:1f8d:1:a00:20ff:fea7:686bIN MX 5 freebsd.unpbook.com.IN MX 10 mailhost.unpbook.com.■ AAAA. Запись типа AAAA, называемая «четыре А» (quad А), преобразует имя узла в 128-разрядный адрес IPv6. Название «четыре А» объясняется тем, что 128-разрядный адрес в четыре раза больше 32-разрядного адреса.
■ PTR. Запись PTR (pointer records — запись указателя) преобразует IP-адрес в имя узла. Четыре байта адреса IPv4 располагаются в обратном порядке. Каждый байт преобразуется в десятичное значение ASCII (0-255), а затем добавляется
. Получившаяся строка используется в запросе PTR.in-addr.arpa32 полубайта 128-разрядного адреса IPv6 также располагаются в обратном порядке. Каждый полубайт преобразуется в соответствующее шестнадцатеричное значение ASCII (
,0-9и добавляется кa-f).ip6.arpaНапример, две записи PTR для нашего узла
будут выглядеть так:freebsd254.32.106.12 in-addr.arpab.6.8.6.7.a.e.f.f.f.0.2.0.0.a.0.1.0.0.0.d.8.f.1.0.8.b.0.e.f.f.3.ip6.arpa■ MX. Запись типа MX (Mail Exchange Record) определяет, что узел выступает в роли «маршрутизирующего почтового сервера» для заданного узла. В приведенном выше примере для узла
предоставлено две записи типа MX. Первая имеет предпочтительное значение 5, вторая — 10. Когда существует множество записей типа MX, они используются в порядке предпочтения начиная с наименьшего значения.solarisПРИМЕЧАНИЕМы не используем в примерах книги записей типа MX, но упоминаем о них, потому что они широко используются в реальной жизни.
■ CNAME. Аббревиатура CNAME означает «каноническое имя» (canonical name). Обычно такие записи используются для присвоения имен распространенным службам, таким как
иftp. При использовании имен служб вместо действительного имени узла перемещение службы на другой узел становится прозрачным (то есть незаметным для пользователя). Например, для нашего узлаwwwканоническими именами могут быть следующие записи:linuxftp IN CNAME linux.unpbook.com.www IN CNAME linux.unpbook.com.Сейчас прошло еще слишком мало времени с момента появления протокола IPv6, чтобы сказать, каких соглашений будут придерживаться администраторы для узлов, поддерживающих и IPv4, и IPv6. В нашем примере мы задали узлу
и запись типа А, и запись типа AAAA. Автор помещает и запись типа А, и запись типа AAAA под каноническим именем узла (как показано ниже) и создает три записи RR. Первая запись RR, имя которой оканчивается наfreebsd, содержит запись типа А; вторая, с именем, оканчивающимся на-4, содержит запись типа AAAA; а третья запись RR, имя которой оканчивается на-6, содержит запись типа AAAA с локальным в пределах физической подсети (link-local, см. главу 19) адресом узла (что иногда удобно использовать в целях отладки). Все записи для другого нашего узла будут выглядеть так:-611aix-4 IN А 206.62.226.43aix IN А 206.62.226.43IN MX 5 aix.unpbook.com.IN MX 10 mailhost.unpbook.com.Aix-4 IN A 192.168.42.2aix-6 IN AAAA 3ffe:b80:1f8d:2:204:acff:fe17:bf38aix-611 IN AAAA fe80::204:acff:fe17:bf38Эта запись дает нам дополнительный контроль над протоколом, выбранным некоторыми приложениями, как мы увидим в следующей главе.
Распознаватели и серверы имен
Организации обычно работают с одним или несколькими серверами имен (name servers). Часто в качестве сервера используется программа BIND (Berkeley Internet Name Domain). Приложения, такие как клиенты и серверы, которые мы создаем в этой книге, соединяются с сервером DNS при помощи вызова функций из библиотеки, называемой распознавателем (resolver). Обычные функции распознавателя —
иgethostbyname, и обе они описаны в этой главе. Первая находит адрес узла по его имени, а вторая — наоборот.gethostbyaddrНа рис. 11.1 показано типичное расположение приложений, распознавателей и серверов имен. В некоторых системах код распознавателя содержится в системной библиотеке и встраивается в приложение, когда оно создается. В других системах имеется централизованный демон-распознаватель, к которому обращаются все приложения. Системная библиотека выполняет удаленные вызовы процедур такого распознавателя. В любом случае код приложения вызывает код распознавателя посредством обычных вызовов, чаще всего
иgethostbyname.gethostbyaddrРис. 11.1. Типичное расположение приложений, распознавателей и серверов имен
Код распознавателя считывает из файлов конфигурации, зависящих от системы, расположение серверов имен организации. (Мы говорим «серверы имен», употребляя множественное число, потому что большинство организаций работают с несколькими серверами имен, хотя мы и показываем на рисунке только один локальный сервер.) Файл
обычно содержит IP-адреса локальных серверов имен./etc/resolv.conf
