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

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

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


person CompilingCyborg    schedule 04.01.2012    source источник
comment
Я не отрицал это, но, ИМО, вам следовало бы перефразировать этот вопрос, чтобы он был более ориентированным на программирование. На основе ваших тегов мне пришлось предположить, что вы, возможно, использовали C.   -  person Michael    schedule 04.01.2012
comment
Спасибо за комментарий. Я обновил вопрос.   -  person CompilingCyborg    schedule 04.01.2012


Ответы (6)


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

getconf HOST_NAME_MAX

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

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

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

person Michael    schedule 04.01.2012
comment
Спасибо за точный ответ. [+1] - person CompilingCyborg; 04.01.2012
comment
В Linux (glibc?) unistd.h недостаточно, вы должны включить limits.h. - person Josip Rodin; 21.12.2015
comment
во многих версиях Linux (например, trusty) вы не можете установить имя хоста ›64 символа - person sabujp; 30.08.2017
comment
похоже, что нет возможности обновить комментарий, но в ядре 4.13 он 64: github.com/torvalds/linux/ - person sabujp; 30.08.2017

tl; dr:

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

  • Имена хостов могут быть длиной до 255 байтов (некоторые системы могут ограничивать их до 64).
  • Hostnames used in DNS can be as long as 253 bytes as a fully qualified domain name (FQDN=host.example.com), in which case:
    • The first DNS label (removing . and anything after it from the hostname) can only be up to 63 bytes
    • Ограничение в 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" The Old New Thing " (цитируется 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 даст максимальная длина полного доменного имени 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 e-mail IA5Strings.

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

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

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

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

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

person Alex Dupuy    schedule 07.03.2015

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

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

person zrvan    schedule 04.01.2012

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

person 一二三    schedule 04.01.2012
comment
Они ограничены этим, но это не значит, что каждая реализация будет устанавливать это ограничение. Вам все еще нужно посмотреть, как это определено в определении HOST_NAME_MAX. например на моей машине FreeBSD это 255, но на моем хосте linux: getconf HOST_NAME_MAX 64 - person Michael; 04.01.2012
comment
[+1] для ясности ответа. Спасибо - person CompilingCyborg; 04.01.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);
}
person Randall Cook    schedule 04.04.2012

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

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

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

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

person VonC    schedule 01.05.2017