Многоадресный DNS
Многоадресный протокол DNS (mDNS) в компьютерных сетях преобразует имена хостов в IP-адреса в небольших сетях, не включающих локальный сервер имен. Это служба с нулевой конфигурацией, использующая практически те же программные интерфейсы, форматы пакетов и операционную семантику, что и DNS. Он был разработан для работы либо как автономный протокол, либо для совместимости со стандартными DNS-серверами. Он использует многоадресные UDP и реализован Apple Bonjour и Avahi с открытым исходным кодом программные пакеты, входящие в большинство дистрибутивов Linux. Хотя реализация Windows 10 была ограничена обнаружением сетевых принтеров, последующие выпуски также разрешали имена хостов. mDNS может работать в сочетании с обнаружением служб DNS (DNS-SD), сопутствующим сетевым методом с нулевой конфигурацией, указанным отдельно в IETF RFC 6763.
История
[править | править код]Многоадресная DNS была впервые предложена Биллом Вудкоком и Биллом Мэннингом в IETF в 2000 году и в конечном итоге была опубликована как стандарт IETF RFC 6762 в 2013 году Стюартом Чеширом и Марком Крохмалом.
Обзор протокола
[править | править код]Когда клиенту mDNS необходимо разрешить имя хоста, он отправляет сообщение с многоадресным IP-запросом, в котором просит хост с таким именем идентифицировать себя. Затем эта целевая машина рассылает многоадресное сообщение, включающее её IP-адрес. Затем все машины в этой подсети могут использовать эту информацию для обновления своих кэшей mDNS. Любой хост может отказаться от притязаний на имя, отправив ответный пакет со временем жизни (TTL), равным нулю.
По умолчанию mDNS разрешает исключительно имена хостов, оканчивающиеся на домен верхнего уровня .local. Это может вызвать проблемы, если .local включает хосты, которые не реализуют mDNS, но могут быть найдены через обычный одноадресный DNS-сервер. Разрешение таких конфликтов требует изменений в конфигурации сети, которых mDNS должен избегать.
Структура пакета
[править | править код]Сообщение mDNS представляет собой многоадресный пакет UDP, отправляемый с использованием следующей адресации:
- IPv4-адрес 224.0.0.251 или IPv6-адрес ff02::fb
- UDP-порт 5353
- При использовании кадров Ethernet стандартный MAC-адрес многоадресной рассылки IP 01:00:5E:00:00:FB (для IPv4) или 33:33:00:00:00:FB (для IPv6)
Структура полезной нагрузки основана на формате одноадресного пакета DNS , состоящего из двух частей — заголовка и данных.
Заголовок идентичен заголовку в одноадресной DNS, как и подразделы в части данных: запросы, ответы, авторитетные серверы имен и дополнительные записи. Количество записей в каждом подразделе соответствует значению соответствующего поля *COUNT в заголовке.
Запросы
[править | править код]Проводной формат для записей в разделе запроса немного изменён по сравнению с одноадресной DNS, добавлено однобитовое поле UNICAST-RESPONSE.
Поле | Описание | Биты длины |
---|---|---|
QNAME | Имя узла, к которому относится запрос | Переменная |
QTYPE | Тип запроса, то есть тип RR, который должен быть возвращен в ответах. | 16 |
UNICAST-RESPONSE | Логический флаг, указывающий, желателен ли одноадресный ответ | 1 |
QCLASS | Код класса, 1 также известный как «IN» для Интернета и IP-сетей | 15 |
Как и в одноадресной DNS, поле QNAME состоит из ряда подполей длины/значения, называемых «метками». Каждая метка представляет одну из разделенных точками подстрок в полном доменном имени (FQDN). Список завершается либо одним нулевым байтом, представляющим «корень» DNS, либо байтом с двумя установленными старшими битами (значение 192), чтобы сигнализировать о косвенном указателе на другое место в сообщении. Это известно как сжатие имен в RFC-6762.
Поле UNICAST-RESPONSE используется для минимизации ненужных широковещательных рассылок в сети: если этот бит установлен, отвечающая сторона ДОЛЖНА отправлять направленный одноадресный ответ непосредственно запрашивающему узлу, а не рассылать ответ по всей сети.
Поле QCLASS идентично полю в одноадресной DNS.
Ресурсные записи
[править | править код]Все записи в разделах ответов, полномочных серверов имен и дополнительных записей имеют одинаковый формат и вместе называются записями ресурсов (RR).
Записи ресурсов в mDNS также имеют немного изменённый общий формат по сравнению с одноадресной рассылкой DNS:
Поле | Описание | Биты длины |
---|---|---|
RRNAME | Имя узла, к которому относится запись | Переменная |
RRTYPE | Тип записи ресурса | 16 |
CACHE-FLUSH | Логический флаг, указывающий, следует ли очищать устаревшие кэшированные записи. | 1 |
RRCLASS | Код класса, 1, также известный как «IN» для Интернета и IP-сетей . | 15 |
TTL | Интервал времени (в секундах), в течение которого запись RR должна кэшироваться. | 32 |
RDLENGTH | Целое число, представляющее длину (в октетах) поля RDATA. | 16 |
PDATA | Данные о ресурсах; внутренняя структура зависит от RRTYPE | Переменная |
Бит CACHE-FLUSH используется для указания соседним узлам, что запись должна перезаписывать, а не добавляться к любым существующим кэшированным записям для этого RRNAME и RRTYPE.
Форматы полей RDATA такие же, как в одноадресной DNS. Однако обнаружение службы DNS (DNS-SD), наиболее распространенный вариант использования mDNS, требует небольших изменений в некоторых их форматах (в частности, в записях TXT).