Quel est le nombre maximum de caractères pour un nom d'hôte dans Unix?

je me demande quel est le nombre maximum de caractères pour un nom d'hôte dans un système Unix. En outre, y a-t-il une variable définie qui peut être utilisée dans la programmation Unix pour appeler ce numéro? (c'est à dire le nombre de caractères autorisés pour un nom d'hôte).

je suis à la programmation en C.

44
demandé sur CompilingCyborg 2012-01-04 14:00:17

6 réponses

Vous pouvez habituellement taper:

getconf HOST_NAME_MAX

En outre, vous pouvez inclure des limites.h à votre application et de lire la valeur de la définir.

alors que le standard POSIX dit qu'il est garanti de ne pas dépasser 255 octets, cela ne signifie pas nécessairement que chaque implémentation y adhérera.

homme gethostname sur votre plate-forme pour obtenir des informations plus détaillées.

53
répondu Michael 2016-04-28 09:47:43

tl;dr:

le Code doit traiter les noms d'hôte jusqu'à 255 octets de long; les administrateurs doivent conserver la longueur du nom d'hôte (à l'exclusion du domaine) à l'intérieur de 19 octets, et la longueur du nom de domaine (à l'exclusion des noms d'hôtes) dans les 23 octets.

  • les noms D'hôtes peuvent être aussi longs que 255 bytes (certains systèmes peuvent les limiter à 64 ans)
  • les noms D'hôtes utilisés dans DNS peuvent être aussi longs que 253 octets comme un domaine entièrement qualifié nom (FQDN=host.example.com), auquel cas:
    • la première étiquette DNS (suppression de . et rien après à partir du nom d'hôte) ne peuvent être jusqu'à 63 octets
    • la limite de 253 octets s'applique au nom de domaine complet, même si seul le premier label est utilisé pour le nom d'hôte Unix
  • les noms D'hôtes utilisés dans les adresses e-mail ne doivent pas dépasser 245 octets (pour la limite de nom d'utilisateur traditionnelle de 8 caractères) ou 221 bytes (moderne maximum nom d'utilisateur longueur 32) en tant que nom de domaine entièrement qualifié
  • les noms D'hôtes utilisés pour les certificats TLS/SSL du serveur ne doivent pas dépasser 64 octets en tant que nom de domaine entièrement qualifié
  • noms D'hôtes utilisés pour les adresses e-mail dans les certificats générés par OpenSSL ne doit pas dépasser 31 octets (pour le traditionnel 8 caractères nom d'utilisateur limite) comme un nom de domaine pleinement qualifié (usernames plus de 8 réduire ce la limite)
  • s'il y a des caractères non-ASCII dans le nom d'hôte, soustrayez 4 pour chaque label de domaine non-ASCII (partie entre . caractères) de toutes les limites ci-dessus, et soustraire un 1-2 octets supplémentaires (à l'exclusion de L'encodage UTF-8 de 1 à 2 octets supplémentaires par caractère) pour chaque caractère non ASCII.

version longue:

comme @Michael le dit, les noms D'hôtes POSIX sont généralement limités à 255 octets, et comme @zrvan le souligne, DNS limite la longueur de chaque étiquette en RFC 1035 - cependant, cette limite est en fait 63 (tous les deux en RFC 1035 section 2.3.1 et, comme précisé dans RFC 2181 l'article 11).

il y a d'autres limites qui entrent en jeu lorsque vous utilisez des noms d'hôtes qui seront utilisés dans DNS, comme des noms d'hôtes dans les certificats SSL ou des adresses e-mail.

tout d'abord, la limite de longueur du nom de domaine pleinement qualifié (FQDN) est de 255 octets lorsque représenté dans le protocole DNS comme

"une série d'étiquettes ... terminé par une étiquette de longueur zéro. ... Un label se compose d'un octet de longueur suivi du nombre d'octets représentant le nom lui-même." - MSDN Blog "Le Vieux Chose de Nouveau" (citant RFC 1035, avec illustration utile)

avec ces préfixes de longueur (y compris celui de l'étiquette finale zéro longueur), la limite réelle pour un nom de domaine pleinement qualifié est 253 octets.

si votre nom d'hôte sera aussi utilisé comme nom DNS pour un serveur pour lequel vous avez besoin d'un certificat TLS/SSL, il y a une limite beaucoup plus courte qui vous affectera. Annexe A. 1 de la RFC 5280 et de ses prédécesseurs RFC 3280 et 2459 spécifient des limites supérieures pour les différents champs D'un certificat X. 509; les ub-common-name-length limite pour le champ Common Name, qui pour les certificats de serveur est le nom de domaine entièrement qualifié du serveur, est 64 octet.

si vous utilisez OpenSSL pour générer un certificat SSL avec un champ d'adresse e-mail de plus de 40 octets, vous verrez cette erreur:

chaîne est trop longue, il doit être à moins de 40 octets de long

si un nom d'hôte sera utilisé dans les adresses e-mail pour les certificats générés par OpenSSL, le @ et le nom d'Utilisateur devra aussi correspondre à moins de 40 octets (le "moins que" dans l'erreur devrait vraiment être "pas plus que"), ce qui pour un la longueur maximale de nom d'utilisateur est de 8 octets, ce qui implique une longueur maximale de FQDN de nom d'hôte 31 octets. Si la longueur maximale du nom d'utilisateur est supérieure à 8 octets, la longueur maximale du nom d'hôte est diminuée en conséquence -le moderne Linux limite de 32 donnerait une longueur FQDN maximale de 7 ce n'est pas pratique, même pour les services de raccourcissement D'URL comme bit.ly.

OpenSSL choix de 40 comme la limite de longueur pour un e-mail à l'adresse X. 509 sujet nom alternatif peut avoir été choisi pour la compatibilité avec la syntaxe de nom alternatif la plus courte possible, E. 163-4 (pour les numéros de téléphone), et il est probable que les implémentations TLS/SSL (peut-être même en incluant OpenSSL) support utiliser de certificats avec des adresses e-mail plus longues. Il existe une autre limite supérieure (ub-emailaddress-length) de 128 octets dans la RFC 3280, augmenté à 255 octets dans la RFC 5280; il s'agit en fait d'un autre, enchâssement d'adresses e-mail dans les certificats X. 509, mais il ce ne serait pas surprenant si de nombreuses implémentations utilisent aussi cette limite supérieure pour rfc822adress e-mail IA5Strings.

alors que OpenSSL pourrait augmenter cette limite dans le futur, il n'y a aucun problème pour cela dans le OpenSSL Request Tracker, et il semble peu probable d'être changé.

même si vous n'utilisez pas TLS/SSL, le adresse électronique maximale longueur de 254 implique une longueur maximale de245 octets pour un limite traditionnelle de nom d'utilisateur de 8 octets; ou 221 octets pour une moderne maximum nom d'utilisateur limite de longueur de 32.

en prenant le minimum de tous ces maximums et a 2012 médiane .longueur du domaine com de 11 (par coïncidence la longueur exacte de example.com), et vous obtenez un maximum de 19 octets pour un 40 octets d'e-mail comme useruser@REALLY-GETTING-LONG.example.com.

si toutes vos adresses e-mail sont associées à un nom de domaine de premier niveau avec MX records et MTA address rewriting, en supposant une limite de longueur de nom d'utilisateur/alias de 16, Vous obtenez une longueur maximale de nom de domaine de 23 octets pour un 40 octets d'e-mail comme useruseruseruser@NOT-SO-LONG.EXAMPLE.COM.

enfin, les noms d'hôtes non ASCII nécessitent L'encodage IDN (internationalized domain name) pour une utilisation avec DNS; ceci implique un encodage avec un caractère 4 xn-- préfixe pour chaque étiquette de domaine avec des caractères non-ASCII, et une extension de 1-2 octets pour chaque étiquette non-ASCII personnage (en plus de la plus grande taille résultant de l'encodage UTF-8). Si votre nom d'hôte a des caractères non-ASCII, vous devez réduire toutes les limites ci-dessus en conséquence.

46
répondu Alex Dupuy 2017-05-23 12:34:30

Selon RFC 1035 la longueur D'un FQDN est limitée à 255 caractères, et chaque étiquette (noeud délimité par un point dans le nom d'hôte) est limitée à 63 caractères, donc en fait la limite que vous recherchez est 63.

Vous pouvez obtenir cette valeur en exécutant getconf HOST_NAME_MAX dans le terminal.

16
répondu zrvan 2016-02-23 14:30:56

les noms D'hôtes sont généralement limité à 255 octets. HOST_NAME_MAX (ou _POSIX_HOST_NAME_MAX) défini dans <limits.h> contient la valeur spécifique.

12
répondu 一二三 2012-01-04 10:08:07

voici un exemple de code qui rassemble tout:

#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);
}
2
répondu Randall Cook 2012-04-04 21:35:21

Git 2.13 (Q2 2017) illustre cette limite de longueur de nom en C, et rappelle que POSIX ne spécifie pas si le tampon sera nul-terminé.

Il introduit une nouvelle fonction, xgethostname(), qui assure qu'il y a toujours un à la fin de la mémoire tampon.

Voir valider 5781a9a (18 Avril 2017) par David Turner (csusbdt).

(fusionné par David Turner -- csusbdt -- dans valider 5781a9a le 19 Avril 2017)

utiliser HOST_NAME_MAX pour la taille des tampons pour gethostname(2)

POSIX limite la longueur des noms d'hôte HOST_NAME_MAX.

L'exportation de la définition de repli de daemon.c et utilisez cette constante pour rendre tous les tampons utilisés avec gethostname(2) assez grands pour n'importe quel résultat possible et une terminaison NUL.

0
répondu VonC 2017-05-01 20:21:01