Какова максимальная длина доменного имени, преобразованного в IDNA?

Главное:

Я храню несколько доменов в базе данных после преобразования каждого доменного имени в его версию IDNA. Мне нужно знать максимальную длину такого доменного имени, преобразованного в IDNA, чтобы я мог определить максимальную длину поля базы данных.

Известный факт:

Теперь я знаю, что максимальное количество символов в имени домена (включая любые поддомены) составляет 255 символов.

Где я это потерял:

На первый взгляд это просто, но... означает ли это обычные символы ascii международных символов (подумайте о кодировке UTF-8)?

Чтобы дать вам пример: домен «müller.de» имеет 9 символов, если я игнорирую тот факт, что «ü» является международным символом, для представления которого требуется больше байтов. Версия IDNA «müller.de» — «xn--mller-kva.de», состоящая из 16 символов. Это показывает, что существует определенная разница в максимальной длине в зависимости от того, "конвертирован" ли он в IDNA или нет.

В зависимости от того, какие символы они имеют в виду, максимум 255 символов может быть версией с международными символами, версией, преобразованной в IDNA, или даже и тем, и другим.

И тут я немного запутался... тем более, что я должен учитывать, что не все домены будут вменяемыми и все такое, как "öüßüöäéèê.example.äöüßüöäéèê-äöüßüöäéèê.test.äöüßüöäéèê.com" и еще хуже можно было ожидать.

Так что "гадать" и "надеяться на лучшее" - не вариант. Мне нужно знать наверняка...

Вопрос:

На основании известного факта, что максимальное количество символов в имени домена (включая любые субдомены) составляет 255 символов... Какова максимальная длина доменного имени, преобразованного в IDNA?

Или они имели в виду, что преобразованная версия IDNA (punycode) также ограничена 255 символами (что означало бы, что домены с международными символами/символами Unicode на самом деле будут иметь более короткие ограничения в их представлении Unicode, потому что их преобразованная версия IDNA должна будет учитывать 255 символов лимит)?


person Community    schedule 03.01.2012    source источник


Ответы (3)


Насколько я понимаю, ограничение в 255 символов должно учитываться после преобразования IDNA.

Это связано с тем, что записи DNS имеют это ограничение на количество символов, и в целом записи DNS могут содержать только буквы, цифры и дефисы (от Википедия). Поэтому DNS-сервер использует для своей записи версию IDN в формате Punycode, а не в формате Unicode.

person cmbuckley    schedule 03.01.2012
comment
Я пришел к такому же выводу после проверки некоторых веб-сайтов регистраторов и их информации о доменных именах с акцентами и умляутами. Да, это 255 после конвертации. Но спасибо за ваш ответ. Это означает, что я не единственный, кто пришел к такому же выводу, и это приятно знать! ;) - person ; 04.01.2012

Хорошо, я думаю, что узнал сам, и этот фрагмент, который я нашел (путем поиска в Интернете), помог:

По сути, существовало два различных варианта введения интернационализированных доменных имен (IDN). Во-первых, нужно было внести коррективы в систему доменных имен (DNS), которые позволили бы напрямую использовать символы Юникода. Было сочтено, что это слишком радикальная мера, поэтому был выбран второй вариант. Это включало компиляцию алгоритма для указания того, как строка Unicode должна быть преобразована в разрешенное доменное имя ASCII. Эта строка ACE (ACE означает ASCII Compatible Encoding) затем вводится в DNS. Введение IDN означает, что впервые запись в DNS больше не совпадает с доменным именем.

Источник

Ответ заключается в том, что длина, которую следует соблюдать, составляет ограничение в 255 символов, как ожидает DNS.

Мое подозрение было правильным. Доменное имя и запись в DNS — это две разные вещи для IDN. Важна максимальная длина записи DNS.

Доменное имя müller.de состоит из 9 символов, но соответствующая строка ACE (кодировка, совместимая с ASCII) xn--mller-kva.de, тем не менее, имеет 16 символов.

Это строка ACE, которая используется DNS, и это строка ACE, длина которой не превышает 255 символов. Это означает, что максимальное ограничение его версии Unicode (домена) определяется количеством используемых символов Unicode и тем, что после преобразования IDNA строка все еще укладывается в ограничение в 255 символов.

Боже, спецификации наверняка могли бы быть немного яснее в таких вещах. Тем более, что международные доменные имена появились примерно с 1 марта 2004 года. Но я нашел ответ, и это главное.

Возможно, это может помочь кому-то, у кого есть тот же вопрос.

Простой ответ, связанный с длиной поля моей базы данных, составляет 255 символов.

Тот факт, что я храню доменные имена в версии, преобразованной в IDNA (строка punycode/ACE), только подтверждает это ограничение на максимальное количество символов.

person Community    schedule 03.01.2012
comment
Всего несколько секунд... Хотя я думаю, что вы выиграли :-) Отличный вопрос, и я рад, что мы пришли к такому же выводу! - person cmbuckley; 04.01.2012
comment
Ба, кто считает секунды? Я просто приму ваш ответ вместо своего собственного. Это меньшее, что я могу сделать, чтобы отблагодарить вас за ваши усилия. Думаю, у меня сегодня социальное настроение... :) - person ; 04.01.2012
comment
Спасибо за вопрос и ответ. Есть ли шанс, что вы могли бы включить указатель/ссылку на источник фрагмента или любые ссылки (RFC, IETF и т. д. документы)? Спасибо! - person JJC; 24.03.2012
comment
@JJC добавил исходную статью для цитаты, которая ссылается на соответствующие RFC. - person cmbuckley; 12.06.2012
comment
@cbuckley Хорошо иметь ведомого, когда я опаздываю из-за оплачиваемой работы. Делает stackoverflow гораздо более ценным, когда вы видите положительные результаты работы в таком сообществе. проголосовал ;) - person ; 31.07.2012
comment
Ограничение имени DNS на самом деле составляет 253 символов, а не 255 - stackoverflow.com/a/28918017/18829 - person Alex Dupuy; 07.03.2015
comment
Также стоит отметить, что каждый поддомен ограничен 63 символами, которые также будут оцениваться «после» преобразования Punycode... en.wikipedia.org/wiki/Субдомен - person B Hart; 02.05.2016
comment
Столбец базы данных для каждого отдельного поля, как правило, не нужен. Вы можете выгружать поля, которые обычно не будете искать/индексировать, в столбец MEDUMTEXT с именем «info», который содержит сериализованные данные (например, JSON). Тогда вам не нужно беспокоиться о том, сколько данных может быть сохранено (если размер столбца не превышает 16 МБ), И есть важные дополнительные преимущества (например, добавление полей в приложение и удаление полей из приложения — это 5-минутная задача, которая не требует изменение схемы, что значительно снижает количество раз, когда приложение будет ломаться при внесении изменений в что-то близкое к нулю). - person CubicleSoft; 22.05.2021

В RFC3492 говорится об одной из функций кодирования ОС IDNA:

Эффективное кодирование: отношение длины базовой строки к длине расширенной строки невелико. Это важно в контексте доменных имен, поскольку RFC1034 ограничивает длину метки домена до 63 символа.

Вот и все. 63 символа — это максимальная длина любого доменного имени, независимо от того, находится ли оно в IDNA или в ASCII.

person Alexander Artemenko    schedule 24.08.2016
comment
это ограничение на отдельные ярлыки в доменном имени, а не на все имя - person Alnitak; 26.08.2016