Кратко

  • NXDOMAIN отрицает существование фактического имени запроса; NODATA сохраняет имя и отрицает только нужный тип. Поэтому первое состояние кэшируют по имени и классу, а второе — ещё и по типу.
  • RFC 2308 сделал отрицательный ответ переносимым, но смертным. Вместе с ним передаётся SOA зоны; отрицательный TTL равен меньшему из TTL самого SOA и MINIMUM, а после нуля результат использовать нельзя.
  • DNSSEC, NXDOMAIN-cut и агрессивный синтез позднее расширили область действия одного проверенного доказательства. Это экономит запросы, но увеличивает ущерб от неверной области или срока. Подпись DNS не доказывает право собственности и вечное отсутствие вне протокола.

Пустота ответа допускает разные факты

Резолвер спрашивает A-запись для service.example и не видит её в Answer. Имя может не существовать. Оно может иметь MX, TXT или AAAA, но не A. Сообщение может быть referral. Сервер может быть временно недоступен или отвечать SERVFAIL.

Ошибочная интерпретация меняет пространство имён для клиентов. Если отсутствие A сохранить как отсутствие имени, последующий запрос MX не дойдёт до авторитетного сервера, хотя почтовая запись существует. Если настоящий NXDOMAIN считать только отсутствием A, резолвер будет напрасно спрашивать AAAA, TXT и другие типы.

NXDOMAIN — это DNS Name Error, относящийся к фактическому QNAME после прохождения CNAME-цепочки. У NODATA нет отдельного RCODE: его выводят из NOERROR, отсутствия нужного ответа и данных Authority, позволяющих исключить referral.

RFC 2308 закрепляет различие в ключах. NXDOMAIN хранится как <QNAME, QCLASS>, NODATA — как <QNAME, QTYPE, QCLASS>. Дополнительный QTYPE не даёт отсутствию одного RRset скрыть остальные.

CNAME переносит предмет отрицания

Введённый псевдоним может существовать и вести к отсутствующему каноническому имени. Тогда NXDOMAIN относится к конечной цели, а не к псевдониму, который успешно вернул CNAME.

Если привязать отрицание к первому ярлыку для удобства, доказательство распространится на другой объект. То же с NODATA: отсутствие типа у цели не удаляет её другие типы, сведения псевдонима или возможных потомков.

Отрицательный кэш — система распределённых свидетельств. До передачи «ничего нет» необходимо зафиксировать, у какого имени отсутствует что именно.

От локальной памяти к переносимому утверждению

RFC 1034 описывал отрицательное кэширование уже в 1987 году, но как необязательную функцию. Поисковые суффиксы, опечатки и автоматическое обнаружение повторяли проигрышные запросы. Память о результате сокращала задержку и нагрузку.

Однако первоначальная схема не позволяла надёжно передать другому резолверу уже сохранённое отрицание с тем же доказательством и остатком срока. Сервер мог помнить «нет», но не мог безопасно поделиться этой памятью.

RFC 2308 закрыл пробел в марте 1998 года. Резолвер, использующий кэш, обязан обрабатывать и отрицательные ответы. При NXDOMAIN или NODATA авторитетный сервер помещает SOA содержащей зоны в Authority. SOA показывает область высказывания и несёт часы.

Отрицательный срок — минимум из TTL SOA и поля MINIMUM. SOA хранится вместе с результатом, а при выдаче из кэша время уже уменьшено. На нуле прежнее отрицание теряет силу: состояние авторитета нужно наблюдать заново.

RFC 2308 указывает принадлежность Mark Andrews к CSIRO. Это происхождение автора, а не институциональный предмет статьи. Общая спецификация и последующие изменения формировались в документном процессе IETF.

Часы, которые перезапускают на каждом узле, не истекают

Пространство имён — дерево, но forwarder-связи могут образовать цикл. Два ошибочно настроенных сервера способны пересылать запросы друг другу. Без переносимого обратного отсчёта каждый присваивает отрицанию новый короткий срок, и временный ответ живёт бесконечно.

Поэтому RFC 2308 не рекомендует кэшировать отрицания без SOA. Локальный предел бесполезен, если следующий узел запускает время заново. SOA заставляет посредников наследовать уменьшение одного и того же утверждения.

Документ также распутал MINIMUM. RFC 1035 описал его как нижний предел TTL, а реализации смешали минимум, значение по умолчанию и отрицательный срок. RFC 2308 вынес значение файла зоны в $TTL, отказался от универсального минимума и оставил MINIMUM частью отрицательного расчёта. Рабочий код первым обнаружил неоднозначность, общий стандарт затем сузил её.

Реализации встретили два отсутствия раньше формулировки

Историческое приложение RFC 2308 рассказывает о CHIVES конца 1980-х, когда поисковые пути создавали множество повторных промахов. Оно описывает и развитие BIND в начале 1990-х: разделение ошибки имени и NOERROR_NODATA, а позднее хранение SOA вместе с результатом.

Это не перепись Интернета и не история единственного изобретателя. Это свидетельство, что «пусто» было слишком грубой категорией для совместимой работы. Уточнение RRset в RFC 2181 и кортежи RFC 2308 превратили опыт реализаций в общий язык.

Экономия откладывает появление нового

Правильное отрицание стареет после изменения зоны. Если имя создать, пока резолверы держат NXDOMAIN, часть пользователей продолжит видеть отсутствие. Если добавить AAAA после NODATA для AAAA, имя и MX будут видны, а новая IPv6-доступность — нет.

TTL — не оценка уверенности. Он меняет число авторитетных запросов на скорость исправления. RFC 2308 разрешает локальные меньшие пределы, приводит один-три часа как разумные значения по умолчанию и отмечает проблемы при сроках более суток.

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

Сбой остаётся отдельным понятием. Тайм-аут, недоступность и SERVFAIL не доказывают отсутствие имени. Превращение их в NXDOMAIN способно сделать временный инцидент постоянным отказом почты, идентификации или service discovery.

Одно доказательство начинает отвечать за диапазон

DNSSEC добавил аутентифицированное отрицание. RFC 4034 определяет NSEC, связывающий имена в каноническом порядке и перечисляющий типы существующего owner. RFC 4035 задаёт проверку NXDOMAIN и NODATA.

Подпись не смешивает значения. Промежуток между owner-именами доказывает отсутствие имени; bitmap существующего owner — отсутствие типа. Криптография удостоверяет соответствующее свидетельство, а не более широкое утверждение.

RFC 5155 ввёл NSEC3 и Opt-Out. При Opt-Out покрывающая запись не обязательно доказывает отсутствие каждого возможного имени внутри диапазона.

RFC 8020 разрешил в заданных границах использовать NXDOMAIN для прекращения запросов ниже отсутствующего узла. Для NODATA это неверно: имя без A может иметь другие типы и потомков.

RFC 8198 позволил валидирующему резолверу синтезировать отрицания по сохранённым NSEC/NSEC3. Запрос не доходит до авторитета. Пакетов меньше, но новое имя внутри доказанного интервала может оставаться невидимым до окончания соответствующих сроков.

Ограниченное свидетельство протокола

Оператор зоны выбирает содержимое и время. Авторитетный сервер строит ответ. Резолвер классифицирует, проверяет, ограничивает и забывает. Приложение назначает последствия. Реальные рычаги не превращаются в единую власть над действительностью вне DNS.

DNSSEC доказывает происхождение и целостность в цепочке DNS. Он не доказывает юридическое право, исчезновение организации или справедливость удаления. Кэш может усилить достоверное отрицание, но не сделать его вечным.

Историческое достижение было узким: назвать предмет, различить вид отсутствия, перенести доказательство зоны и обязать его истечь. Разделение NXDOMAIN и NODATA сохранило эффективность, не превращая отсутствующий тип в исчезновение имени.

Источники и границы

Исходная архитектура и SOA описаны в RFC 1034 и RFC 1035, RRset уточнён в RFC 2181. Определения, ключи, часы, предупреждение о циклах и история реализаций находятся в RFC 2308. Аутентифицированное отрицание ограничивают RFC 4034, RFC 4035 и RFC 5155; поздние cut и синтез — RFC 8020 и RFC 8198. Поздние возможности не переносятся в 1987 год, а историческое приложение не считается полной статистикой.