De acordo com as especificações de nome de domínio RFC 1035 :
2.3.4. Limites de tamanho
nomeia 255 octetos ou menos
De acordo com o SMTP RFC 5321 :
4.5.3.1.2 . Domínio
O comprimento total máximo de um nome ou número de domínio é 255 octetos.
Os RFCs são, portanto, consistentes e claros na minha opinião.
Contudo, algumas pessoas afirmam que é 254 devido à possível presença de um ponto no final, embora não haja menção de tal ponto nas RFCs 1 .
Outras pessoas afirmam que é 253 por motivos estranhos, como a presença de um byte de comprimento de string de prefixo e o '\0' final das strings C 2 , 3 , 4 .
Qual é o comprimento máximo de bytes do domínio?
Depende do contexto. Suas RFCs listam limites diferentes porque falam sobre coisas diferentes – o limite SMTP de 255 é especificamente para a parte de domínio dos
local@domain
endereços de e-mail e tem pouco ou nada a ver com o limite definido pelo protocolo DNS.(Isso ocorre em parte porque o SMTP é anterior ao DNS em anos – ele foi projetado quando HOSTS.TXT ainda estava em uso na ARPANET (veja RFC 810/811); e costumava existir em um mundo onde o email era transportado através de 10 redes diferentes de modo que um domínio de endereço de e-mail SMTP pode não ter sido um domínio da Internet.)
Pré-requisitos
Para começar com um detalhe importante:
Há. Seção 3.1 da RFC 1034:
Portanto, de acordo com a especificação,
www.google.com
não é o nome de domínio completo –www.google.com.
é – e o ponto final é meramente “omitido para salvar a digitação”, mas é muito válido e tem uma finalidade específica. Você adiciona um ponto final para informar ao sistema que um domínio local não deve ser anexado.Como exemplo prático, a ICANN costumava permitir que domínios de primeiro nível tivessem registros de “host”. Por exemplo, o
tk.
TLD tinha um site emhttp://tk./
– que tinha que ser escrito com o ponto final, caso contrário seu sistema iria procurartk.dlink.lan
ou algo assim.A RFC usa um exemplo de rótulo único, e muitos assumem que todos os sistemas tratam qualquer nome de domínio multicomponente como já absoluto, mas nem sempre é esse o caso – o Windows, em particular, não se limita assim.
Em vez disso, se um sufixo de pesquisa DNS estiver configurado no Windows, ele será aplicado a qualquer nome não absoluto, mesmo que tenha vários componentes. Por exemplo, se
corp.example.com
for o domínio do seu sistema,www.google.com
será tentado primeiro comowww.google.com.corp.example.com.
e só depois comowww.google.com.
.Nessa situação, você adicionaria explicitamente o ponto final à sua entrada para evitar que o sistema operacional o sufixo automaticamente com o domínio local.
A outra RFC que você estava lendo – RFC 1035 – não fala sobre o “ponto final” porque se preocupa principalmente com o protocolo de rede, enquanto os detalhes voltados para o usuário estão na RFC 1034.
Mas não é da representação do texto que vem o limite real de comprimento.
Os limites reais
O limite real é "255 octetos ou menos" quando aplicado ao nome de domínio, pois é representado no formato de rede DNS (pacote), que não usa separadores de 'ponto' - na verdade, usa um byte de prefixo de comprimento - e o equivalente do "ponto final" não é opcional.
Neste formato, cada string é prefixada com um byte de comprimento e a lista inteira termina com uma string de 0 bytes. Para citar RFC 1035:
Por exemplo,
www.google.com
se tornaria:(O byte 0x00 final aqui não tem nada a ver com strings C; de certa forma, é completamente o oposto – o formato é muito mais parecido com uma série de strings Pascal – mas na verdade não está relacionado a nenhuma linguagem de programação. É especificamente a forma como os nomes de domínio são transferidos no protocolo de rede.)
Portanto, de acordo com a mesma RFC, o limite para nomes de domínio neste formato específico é de 255 bytes:
Acontece que a representação binária (rede) é quase sempre¹ dois bytes mais longa que a representação de texto comumente usada (ou seja, sem o ponto final). Portanto, se um nome de domínio estiver limitado a 255 octetos na transmissão, ele estará limitado a 253 caracteres ASCII em formato de texto (mais o ponto final opcional como o 254º caractere).
Em outras palavras, todos os três números estão corretos por si só – mas são frequentemente “reivindicados” sem qualquer contexto para interpretá-los; 255 está correto para o formato do pacote, 254 está correto para o formato ASCII com ponto final (nome absoluto) e 253 está correto para o formato ASCII "convencional" sem ponto final.
¹ (A menos que algo como
\.
esteja presente, que é um octeto em formato binário, mas representado como dois no texto - mas isso é extremamente raro na prática; a única vez que você verá isso é ao olhar para o campo "pessoa responsável" da SOA. Se você está escrevendo uma biblioteca DNS, você deve considerar isso, mas caso contrário você pode ignorá-la.)Como o seu módulo aceita nomes de domínio no formato ASCII, ele deverá:
Permitir no máximo um ponto final – melhor sempre adicioná-lo ou retirá-lo antes de continuar a validação (para consistência).
Permitir no máximo 254 bytes se o ponto final estiver presente ou no máximo 253 bytes se for removido.
Mescle a maioria das verificações de “validade de domínio de nível superior” nas verificações regulares de “rótulo”, pois as regras básicas são exatamente as mesmas para cada rótulo, não importa se é o primeiro, o último ou o intermediário.
(Embora existam regras adicionais para TLDs, elas não são definidas por protocolo – são definidas por política da ICANN como mantenedora da zona raiz que define TLDs. Portanto, embora seja razoável ter, por exemplo, um "começa com um dígito" regra para TLDs, ela deve ser mantida separada.)
Tenha um modo que relaxe a regra de “caracteres permitidos”. Nomes de domínio em geral podem conter qualquer caractere - apenas nomes de domínio usados como nomes de host têm restrições mais fortes, e aqueles vêm de serem "usados como nomes de host" (ou seja, para pesquisa A/AAAA), e não de serem "nomes de domínio".
No nível DNS, nomes de domínio sem "nome de host" podem conter quase tudo - por exemplo, eles geralmente contêm caracteres como
_
(que são praticamente obrigatórios para registros SRV;_minecraft._tcp.example.com
é um exemplo típico) - portanto, no mínimo, a validação do nome de domínio precisa distinguir entre "nome do host (sem sublinhado)" e "não-nome do host (sublinhado OK)" como contextos diferentes.