Каково максимальное количество символов для имени хоста в Unix? - PullRequest
48 голосов
/ 04 января 2012

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

Ответы [ 6 ]

60 голосов
/ 04 января 2012

Обычно вы можете набрать:

getconf HOST_NAME_MAX

Кроме того, вы, как правило, можете включить в приложение limit.h и прочитать значение определения.

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

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

49 голосов
/ 07 марта 2015

ТЛ; др

Код должен работать с именами хостов длиной до 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 байтов подразумевает максимальную длину полного доменного имени имени хоста 31 байтов.Если максимальная длина имени пользователя превышает 8 байтов, максимальная длина имени хоста соответственно уменьшается - современный предел Linux в 32 даст максимальную длину полного доменного имени 7 , что нецелесообразно, дажедля сервисов сокращения URL, таких как bit.ly.

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

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

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

Принимая минимум всех этих максимумов и среднюю длину домена .com 2012 11 (по совпадениюточная длина example.com), и вы получите максимальную длину имени первого ярлыка хоста 19 байт для 40-байтового адреса электронной почты, например useruser@REALLY-GETTING-LONG.example.com.

Если все ваши электронныеадреса электронной почты сопоставляются с именем домена верхнего уровня с записями MX и переписыванием адресов MTA, при условии более разумного ограничения длины имени пользователя / псевдонима, равного 16, максимальная длина имени домена составляет 23 байт для40-байтовый адрес электронной почты, такой как useruseruseruser@NOT-SO-LONG.EXAMPLE.COM.

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

18 голосов
/ 04 января 2012

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

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

12 голосов
/ 04 января 2012

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

2 голосов
/ 05 апреля 2012

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

#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);
}
0 голосов
/ 01 мая 2017

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

См. коммит 5781a9a (18 апреля 2017 г.) Дэвид Тернер (csusbdt) .
(Объединено Дэвид Тернер -- csusbdt - в коммит 5781a9a , 19 апреля 2017 г.)

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

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

...