Подтвердить что ты не робот

Каково максимальное количество символов для имени хоста в Unix?

Мне интересно, какое максимальное количество символов для имени хоста в системе Unix. Кроме того, есть ли какая-либо определенная переменная, которую можно использовать в Unix-программировании для вызова этого номера? (то есть количество символов, разрешенных для имени хоста).

Я программирую на C.

4b9b3361

Ответ 1

Обычно вы можете ввести:

getconf HOST_NAME_MAX

Кроме того, вы обычно можете включить limits.h в свое приложение и прочитать значение define.

В то время как стандарт POSIX говорит, что он не должен превышать 255 байт, это не обязательно означает, что каждая реализация будет придерживаться этого.

man gethostname на вашей платформе, чтобы получить более подробную информацию.

Ответ 2

TL;DR:

Код должен обрабатывать имена хостов длиной до 255 байт; администраторы должны хранить длину имени хоста (исключая домен) в пределах 19 байтов, и длину имени домена (исключая имена хостов) в пределах 23 байтов.

  • Хосты могут быть длинными 255 (некоторые системы могут ограничивать их до 64)
  • Имена хостов, используемые в DNS, могут быть длинными 253 байт как полное доменное имя (FQDN = host.example.com), и в этом случае:
    • Первая метка DNS (удаление . и что-нибудь после нее из имени хоста) может содержать только 63 байт
    • Предел в 253 байта применяется ко всему FQDN, даже если для имени хоста Unix используется только первая метка
  • Имена хостов, используемые в адресах электронной почты, не должны превышать байты 245 (для традиционного ограничения имени пользователя в 8 символов) или 221 (современное максимальное имя пользователя 32) как полное доменное имя
  • Имена хостов, используемые для серверных сертификатов TLS/SSL, не должны превышать байты 64 как полное доменное имя
  • Хосты, используемые для адресов электронной почты в сертификатах, генерируемых OpenSSL не должен превышать 31 байт (для обычного 8-символьного имени пользователя) как полное доменное имя (имена пользователей длиннее 8 уменьшают этот предел)
  • Если в имени хоста не указаны символы ASCII, вычитайте 4 для каждой метки домена, отличного от ASCII (часть между символами .) из всех вышеуказанных пределов и вычесть дополнительные 1-2 байта (не считая накладных расходов кодирования UTF-8 на 1-2 байта на символ) для каждого символа, отличного от ASCII.

Длинная версия:

Как отмечает @Michael, имена хостов POSIX обычно ограничены 255 байтами, и, как указывает @zrvan, DNS ограничивает длину каждой метки в RFC 1035 - однако этот предел на самом деле 63 (как в RFC 1035 раздел 2.3.1, так и в RFC 2181, раздел 11).

Существуют другие лимиты, которые используются в играх, когда вы используете имена хостов, которые будут использоваться в DNS, в качестве имен хостов в сертификатах SSL или адресах электронной почты.

Во-первых, полное ограничение длины доменного имени (FQDN) составляет 255 октетов, если оно представлено в протоколе DNS как

"серия меток,... завершаемая меткой длины ноль.... Метка состоит из октета длины, за которым следует это число октетов, представляющих само имя" - Блог MSDN "Старая новая вещь" (цитируя RFC 1035 с полезной иллюстрацией)

С этими префиксами длины (в том числе и для метки конечной длины) фактический предел для полного имени домена составляет 253.

Если ваше имя хоста будет также использоваться как DNS-имя для сервера, для которого вам нужен сертификат TLS/SSL, существует гораздо более короткий предел, который повлияет на вас. Приложение A.1 RFC 5280 и его предшественники RFC 3280 и 2459 указывают верхние границы для разных полей сертификата X.509; предел ub-common-name-length для поля Common Name, который для сертификатов сервера является полным доменным именем сервера, составляет 64.

Если вы используете OpenSSL для генерации SSL-сертификата с полем адреса электронной почты длиной более 40 байт, вы увидите эту ошибку:

Строка

слишком длинная, она должна быть меньше 40 байт

Если имя хоста будет использоваться в адресах электронной почты для сертификатов с открытым кодом OpenSSL, @ и имя пользователя также должны будут входить в пределах 40 байт (значение "меньше" в ошибке должно быть "не более" "), который для максимальной длины имени пользователя составляет 8 байтов, подразумевает максимальную длину FQDN хоста длиной 31. Если максимальная длина имени пользователя длиннее 8 байтов, максимальная длина имени узла уменьшается соответственно - современный лимит Linux 32 дает максимальную длину FQDN 7, что нецелесообразно, даже для служб сокращения URL-адресов, таких как bit.ly.

Выбор OpenSSL из 40 как ограничение длины для адреса электронной почты X.509 может быть выбран для совместимости с минимальным возможным альтернативным синтаксисом имен, E.163-4 (для телефонных номеров), и вполне вероятно, что реализации TLS/SSL (возможно, даже включая OpenSSL) поддерживают использование сертификатов с более длинными адресами электронной почты. В RFC 3280 имеется отдельная верхняя граница (ub-emailaddress-length) длиной 128 байт, увеличенная до 255 байтов в RFC 5280; это фактически для другого, унаследованного внедрения адресов электронной почты в сертификатах X.509, но не удивительно, если многие реализации используют эту верхнюю границу для rfc822Address e-mail IA5Strings.

В то время как OpenSSL может увеличить этот предел в будущем, для этого нет проблемы в OpenSSL Request Tracker, и кажется маловероятным изменилось.

Даже если вы не используете TLS/SSL, максимальная длина адреса длиной 254 подразумевает максимальную длину FQDN для имени хоста 245 байты для традиционного 8-байтового имени пользователя; или 221 для современного максимального предела длины имени пользователя 32.

Принимая минимум всех этих максимумов и длина медианного домена .com 2012 года 11 (совпадающая с точной длиной example.com) и вы получите максимальную длину имени метки ярлыка 19 для 40-байтового адреса электронной почты, например [email protected].

Если все ваши адреса электронной почты сопоставляются с доменным именем верхнего уровня с записями MX и переписыванием адресов MTA, при условии более разумного ограничения длины имени пользователя/псевдонима в 16, вы получите максимальную длину имени домена 23 для 40-байтового адреса электронной почты, такого как [email protected].

Наконец, имена хостов, отличных от ASCII, требуют кодировки IDN (интернационализированное доменное имя) для использования с DNS; это включает в себя кодирование с префиксом xn-- с 4 символами для каждой метки домена с не-ASCII-символами и расширение 1-2 байта для каждого символа, отличного от ASCII (в дополнение к большему размеру, полученному в результате кодирования UTF-8), Если ваше имя хоста имеет символы, отличные от ASCII, вам необходимо соответствующим образом уменьшить все вышеуказанные пределы.

Ответ 3

В соответствии с RFC 1035 длина полного доменного имени ограничена 255 символами, и каждая метка (node, разделенная точкой в имя хоста) ограничено 63 символами, поэтому по истечении этого срока вам будет 63.

Вы можете получить это значение, запустив getconf HOST_NAME_MAX в терминале.

Ответ 4

Обычно имена хостов ограничены 255 байтами. HOST_NAME_MAX (или _POSIX_HOST_NAME_MAX), определенный в <limits.h>, будет содержать конкретное значение.

Ответ 5

Вот пример кода, который объединяет все это:

#include <limits.h>
#include <unistd.h>
#include <stdio.h>

char host[HOST_NAME_MAX + 1];

host[HOST_NAME_MAX] = 0;

if (gethostname(host, sizeof(host) - 1) == 0)
{
    printf("hostname is %s\n", host);
}

Ответ 6

Git 2.13 (Q2 2017) показывает, что ограничение длины имени в C и напоминает, что POSIX не указывает, будет ли буфер завершен с нулевой отметкой.
Он вводит новую функцию xgethostname(), которая гарантирует, что всегда есть \0 в конце буфера.

См. commit 5781a9a (18 апреля 2017 г.) Дэвид Тернер (csusbdt).
(слияние Дэвид Тернер - csusbdt - в совершить 5781a9a, 19 апреля 2017 года)

используйте HOST_NAME_MAX для сортировки буферов для gethostname (2)

POSIX ограничивает длину имен узлов до HOST_NAME_MAX.
Экспортируйте резервное определение из daemon.c и используйте эту константу, чтобы все буферы, используемые с gethostname (2), были достаточно большими для любого возможного результата и завершение NUL.