DNS 名称的最大长度是多少
What is the maximum length of a DNS name
我看到好几处提到 DNS 名称(域名)的最大字符串长度为 253 个字符。维基百科似乎指的是这个旧博客 post:
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 个字节:
To simplify implementations, the total length of a domain name (i.e.,
label octets and label length octets) is restricted to 255 octets or
less.
根据RFC1035,域名组成如下:
a domain name represented as a sequence of labels, where each label consists of a length octet followed by that number of octets. The domain name terminates with the zero length octet for the null label of the root. Note that this field may be an odd number of octets; no padding is used.
也就是说域名由以下字段组成:
- 标签长度(LL):1个字节
- 标签名称 (LN):63 字节(最大)
因为标签长度最大值只能是00111111(因为
前两位保留用于指针等特殊功能)
- 空标签(NL):1字节(代表根域)
格式应始终为(与博客 [=83=] 不同):
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 字节
所以如果我们只计算字符串部分(LNs),我们得到:
63 + 63 + 63 + 61 = 最多 250 个字符。
我是不是漏掉了什么,或者我们应该更新一些维基百科参考资料?我不确定的唯一部分是空标签是 255 字节的一部分。
按照您的计算方式,域名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 个字符。
我看到好几处提到 DNS 名称(域名)的最大字符串长度为 253 个字符。维基百科似乎指的是这个旧博客 post:
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 个字节:
To simplify implementations, the total length of a domain name (i.e., label octets and label length octets) is restricted to 255 octets or less.
根据RFC1035,域名组成如下:
a domain name represented as a sequence of labels, where each label consists of a length octet followed by that number of octets. The domain name terminates with the zero length octet for the null label of the root. Note that this field may be an odd number of octets; no padding is used.
也就是说域名由以下字段组成:
- 标签长度(LL):1个字节
- 标签名称 (LN):63 字节(最大) 因为标签长度最大值只能是00111111(因为 前两位保留用于指针等特殊功能)
- 空标签(NL):1字节(代表根域)
格式应始终为(与博客 [=83=] 不同):
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 字节
所以如果我们只计算字符串部分(LNs),我们得到:
63 + 63 + 63 + 61 = 最多 250 个字符。
我是不是漏掉了什么,或者我们应该更新一些维基百科参考资料?我不确定的唯一部分是空标签是 255 字节的一部分。
按照您的计算方式,域名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 个字符。