DNS名称的最大长度是多少?

54

我看到有人提到DNS名称(域名)的最大字符串长度为253个字符。维基百科似乎参考了这篇旧博客文章:

https://en.wikipedia.org/wiki/Hostname http://blogs.msdn.com/b/oldnewthing/archive/2012/04/12/10292868.aspx

另一方面,如果我理解RFC,这篇文章是错误的。根据以下字节序列,DNS名称的最大字符串长度应该是250个ASCII字符,而不是253个,如RFC1035所述,此字节序列最大为255字节:

为了简化实现,域名的总长度(即标签八位组和标签长度八位组)限制为255个八位组或更少。

根据RFC1035,域名由以下内容组成:

表示为标签序列的域名,其中每个标签由一个长度八位组和该数量的八位组组成。域名以用于根节点的空长度八位组的空标签结束。注意,此字段可能是奇数个八位组;不使用填充。

这意味着以下字段组成域名:

  1. 标签长度 (LL):1字节
  2. 标签名称 (LN):63字节(最大值) 因为标签长度的最大值只能是00111111(因为前两位保留用于指针等特殊功能)
  3. 空标签(NL):1字节(表示根域)

格式应始终如下(与博客文章不同):

LL + LN [ LL + LN ... ] + NL

的意思是最大长度应为(1个字节= 1个字符= 1个八位字节):

LL(1)+ LN(63)+ LL(1)+ LN(63)+ LL(1)+ LN(63)LL(1)+ LN(61)+ NL(1)= 255字节

因此,如果我们仅计算字符串部分(LN),则最多可以达到:

63 + 63 + 63 + 61 = 最多250个字符

我有漏掉的吗?或者我们需要更新一些维基百科的参考资料?我不确定的唯一部分是Null Label是否包含在255字节中。

1个回答

66
按照您的计算方式,域名a.b.c.d.e.将被认为有五个字符长度。我怀疑很少有人会觉得这种计数方式有用。这种计数方式也使得最大长度随标签数量变化而不同,因此当您有四个标签时,最大长度是250个字符,但如果您有127个标签,则最大长度仅为127个字符。
可以这样想:当我们打印一个域名供人类使用时,我们会打印长度字节,只不过我们会将它们打印成句点(除了第一个长度字节之外的所有字节)。如果我们不这样做,我们就无法区分a.b.c.abc.。既然我们打印了它们,那么在计算长度时它们应该被包括在内。按照这种计数方式,最大长度总是253个字符(包括最后的句点和根节点的未打印零八位)。
换句话说,如果您有最多250个ASCII字符(字母,数字,划线),考虑到至少有4个标签,您还需要在它们之间添加3个可打印的句点,这将总共增加到253个可打印字符(除去第一个长度字节和空标签)。
下面是示例(粗体字是可打印字符,LL表示以点形式打印的长度字节):
LL(1)+ LN(63)+ LL(1)+ LN(63)+ LL(1)+ LN(63)+ LL(1)+ LN(61)+ NL(1)= 255个字节
因此,包括句点在内的新计算结果为:
63 + 1 + 63 + 1 + 63 + 1 + 61 = 253 个字符最大长度。

4
没问题。换句话说,不算句号,250 是字符数的最大值;如果包括句号但不包括最后一个句号,253 就是正确的字符数? - Nicolas Bouvrette

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接