相反,如果在 Windows 中配置了 DNS 搜索后缀,它将应用于任何非绝对名称,即使它具有多个组件。例如,如果corp.example.com是您系统的域,www.google.com则将首先尝试 aswww.google.com.corp.example.com.并且仅然后尝试 as www.google.com.。
14 characters: www.google.com
Interpreted as: [3] "www"
[6] "google"
[3] "com"
[0] "" ("null label of the root")
16 bytes: <0x03> w w w <0x06> g o o g l e <0x03> c o m <0x00>
(这里尾随的 0x00 字节与 C 字符串无关;在某种程度上,它完全相反——格式更像是一系列 Pascal 字符串——但实际上它与任何编程语言都没有关系。它是特别是域名在网络协议中传输的方式。)
这取决于上下文。您的 RFC 列出了不同的限制,因为它们讨论了不同的内容 - 255 的 SMTP 限制专门针对电子邮件地址的域部分
local@domain
,与 DNS 协议设置的限制几乎没有关系(如果有的话)。(部分原因是 SMTP早于 DNS 多年——它是在 HOSTS.TXT 仍在 ARPANET 上使用时设计的(参见 RFC 810/811);并且它曾经存在于电子邮件通过 10 个不同网络传输的世界中因此 SMTP 电子邮件地址域可能根本就不是 Internet 域。)
先决条件
首先从一个重要的细节开始:
有。 RFC 1034 第 3.1 节:
因此,根据规范,
www.google.com
不是完整的域名 -www.google.com.
是 - 并且尾随点只是“省略以节省打字”,但非常有效并且具有特定用途。您添加一个尾随点来告诉系统不应附加本地域。举一个实际的例子,ICANN 曾经允许顶级域名拥有“主机”记录。例如,
tk.
TLD 有一个网站http://tk./
- 必须用尾随点编写,否则您的系统会查找tk.dlink.lan
或其他什么。RFC 使用单标签示例,许多人假设所有系统都将任何多组件域名视为绝对域名,但情况并非总是如此 - 特别是 Windows,不会这样限制自己。
相反,如果在 Windows 中配置了 DNS 搜索后缀,它将应用于任何非绝对名称,即使它具有多个组件。例如,如果
corp.example.com
是您系统的域,www.google.com
则将首先尝试 aswww.google.com.corp.example.com.
并且仅然后尝试 aswww.google.com.
。在这种情况下,您可以在输入中显式添加尾随点,以防止操作系统自动在其后添加本地域后缀。
您正在阅读的另一个 RFC – RFC 1035 – 没有谈论“尾随点”,因为它主要关注网络协议,而面向用户的细节在 RFC 1034 中。
但文本表示并不是实际长度限制的来源。
实际限制
当应用于域名时,真正的限制是“255 个八位字节或更少”,因为它以 DNS网络(数据包)格式表示,该格式不使用“点”分隔符 – 它确实使用长度前缀字节 – 以及等效的“尾随点”不是可选的。
在此格式中,每个字符串都以长度字节为前缀,整个列表以 0 字节字符串结尾。引用 RFC 1035:
例如,
www.google.com
将变为:(这里尾随的 0x00 字节与 C 字符串无关;在某种程度上,它完全相反——格式更像是一系列 Pascal 字符串——但实际上它与任何编程语言都没有关系。它是特别是域名在网络协议中传输的方式。)
因此,根据同一个 RFC,此特定形式的域名限制为 255 字节:
碰巧二进制(网络)表示几乎总是比常用的文本表示长两个字节(即没有尾随点)。因此,如果域名在线路上的长度限制为 255 个八位字节,则文本形式的域名长度也将限制为 253 个 ASCII 字符(加上可选的尾随点作为第 254 个字符)。
换句话说,这三个数字本身都是正确的——但它们常常是在没有任何背景来解释的情况下“声称”的; 255 对于数据包格式是正确的,254 对于带有尾随点(绝对名称)的 ASCII 格式是正确的,253 对于不带尾随点的“常规”ASCII 格式是正确的。
1(除非
\.
存在类似的东西,它是二进制形式的一个八位字节,但在文本中表示为两个八位字节 - 但这在实践中极其罕见;您唯一会看到这种情况是在查看 SOA“负责人”字段时。如果如果您正在编写 DNS 库,则必须考虑到这一点,否则您可以忽略它。)由于您的模块接受 ASCII 格式的域名,因此它应该:
最多允许一个尾随点 - 最好在继续验证之前始终添加或始终删除它(为了一致性)。
如果存在尾随点,则最多允许 254 个字节;如果删除了尾随点,则最多允许 253 个字节。
将大部分“顶级域有效性”检查合并到常规“标签”检查中,因为每个标签的基本规则完全相同,无论它是第一个、最后一个还是中间的。
(虽然 TLD 确实存在其他规则,但它们不是由协议设置的 - 它们是由 ICANN 作为定义 TLD 的根区域的维护者根据政策设置的。因此,虽然“以数字开头”是合理的对于 TLD 规则,应将其分开。)
有一种模式可以放宽“允许的字符”规则。一般来说,域名可以包含任何字符——只有用作主机名的域名才有更强的限制,这些限制来自于它们“用作主机名”(即用于 A/AAAA 查找),而不是来自于它们是“域名”。
在 DNS 级别,非“主机名”域名几乎可以包含任何内容,例如它们通常包含类似字符
_
(这对于 SRV 记录实际上是强制性的;_minecraft._tcp.example.com
是一个典型的例子),因此域名验证至少需要区分“主机名(无下划线)”和“非主机名(下划线OK)”作为不同的上下文。