Кратко

  • RFC 3490 оставила DNS в ASCII и поместила IDNA в приложение. ToASCII могла отвергнуть метку, а ToUnicode никогда не возвращала ошибку: при сбое любого шага она выдавала исходный ввод.
  • Поэтому видимая строка не доказывала допустимость IDNA, принятие реестром, запись в зону, разрешение, проверку DNSSEC или контроль над именем. Для каждой ступени требовалось отдельное свидетельство.

Фраза «ToUnicode never fails» звучит как обещание универсальной правильности. В RFC 3490 она означала лишь, что функция отображения всегда вернёт последовательность. Если подготовка, декодирование или обратная проверка не удавались, операция немедленно возвращала первоначальный ввод. Приложение сохраняло то, что можно показать, но протокол не объявлял это допустимым международным именем.

Такое решение вытекало из архитектуры 2003 года. IDNA не меняла DNS-серверы, резолверы и формат сообщений. Она целиком работала внутри приложения, как тонкая прокладка между интерфейсом Unicode и исторической инфраструктурой ASCII. Международным становился край системы, а DNS продолжала выполнять точное сопоставление.

Область применения задавалась понятием «слот доменного имени»: QNAME, аргумент библиотечной функции, доменная часть адреса в заголовке письма, host в URI. Упоминание домена в обычном тексте само по себе слотом не становилось. Правила включал контекст использования, а не внешний вид строки.

На пути к DNS ToASCII обязана была уметь отказать. Она обрабатывала каждую метку отдельно. Не-ASCII ввод проходил Nameprep; приложение могло потребовать традиционные правила букв, цифр и дефиса; не-ASCII последовательность с зарезервированным префиксом отвергалась; затем применялся Punycode, добавлялся xn--, а длина проверялась на диапазон от одного до 63 кодовых пунктов. Сбой любого шага означал отказ. Если не проходила одна метка, всё имя нельзя было использовать как IDN.

На пути к читателю у ToUnicode была другая задача. Она распознавала и удаляла ACE-префикс, декодировала Punycode, сохраняла результат и снова применяла ToASCII. Только когда вновь созданная ASCII-форма совпадала с сохранённым вводом без учёта регистра ASCII, возвращалась декодированная Unicode-форма. Полный круг подтверждал соответствие представлений.

Если круг не замыкался, промежуточный результат не становился допустимым ради удобства. Возвращался оригинал. RFC 3490 отдельно указывала: если после ToUnicode метка по-прежнему начинается с ACE-префикса, это не допустимая ACE-метка и она не эквивалентна промежуточным Unicode-строкам. Возвращённое значение подтверждало работу экрана, а не приём имени.

Отсюда следует лестница доказательств. Возможность нарисовать строку не означает прохождение ToASCII. Успешное преобразование не обязывает реестр принять метку по его языковым правилам. Принятие не доказывает внесение A-label в зону. Ответ DNS может быть создан wildcard-записью. DNSSEC аутентифицирует данные под подписанным ASCII-именем, но не Unicode-представление и не человеческое толкование. Разрешение также не доказывает владение или ожидаемую личность.

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

RFC 4690 позже описала трудности визуального сходства, политики регистрации, обновлений Unicode и перехода. RFC 5890 и RFC 5891 в 2010 году ввели A-label и U-label и явно развели регистрацию и поиск. При регистрации можно требовать точного совпадения форм и отвергать расхождение; поиск допускает больше, но всё равно проверяет. Успешное сравнение не означает допустимость — это RFC 5891 сформулировала прямо.

RFC 5895 вынесла отображения пользовательского ввода в локальную обработку до общего протокола. Это соответствует принципу минимальной начальной спецификации Хэн Лу: глобальный договор фиксирует только необходимое для совместимости, а язык, ввод, показ и регистрационная политика остаются у тех, кто располагает контекстом. Координация становится надёжнее, когда не присваивает решения соседних слоёв.

Полная схема RFC 3490 была заменена, однако её асимметрия остаётся полезной. Функция, которая всегда возвращает значение, хорошо сохраняет наблюдаемость интерфейса. Она опасна как оракул допустимости. ToUnicode давала материал для показа; ToASCII могла дать приемлемое представление для старого канала. Регистрация, существование, ответ, аутентификация и контроль оставались отдельными событиями.

Источники