46

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

https://en.wikipedia.org/wiki/ 主机名 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 s),我们得到:

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

我是否遗漏了什么,或者我们应该更新一些维基百科参考资料?我不确定的唯一部分是空标签是 255 字节的一部分。

4

1 回答 1

56

按照您的计算方式,域名a.b.c.d.e.将被认为是五个字符长。它怀疑没有多少人会发现这种计数方式有用。这种计数方式也会使最大长度随标签的数量而变化,因此当您有四个标签时,最大长度为 250 个字符,但如果您有 127 个标签,则最大长度仅为 127 个字符。

可以这样想:当我们打印一个供人类使用的域名时,我们确实打印了长度字节,只是我们将它们打印为句点(除了第一个长度字节之外,所有这些都打印)。如果我们不这样做,我们将无法分辨 和 之间的a.b.c.区别abc.。由于我们打印它们,因此在计算长度时应该包括它们。使用这种计数方式,最大长度始终为 253 个字符(包括最后一个句点,根的未打印零八位字节为 255)。

换句话说,如果您最多有 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 = 25最多3 个字符。

于 2015-08-30T07:56:54.187 回答