主机名以数字开头是否有效?例如8server
通过阅读RFC 1123,可以看出这是一个有效的主机名。但是,我不清楚主机名是否只能在有后缀的情况下以数字开头,例如8server.com
这个问题的根源在于InternetDomainName.isValid("8server");
Google Guava库(Javadoc)拒绝输入。我还在番石榴讨论小组上发表了一个具体问题。
4chan.com
是一个以数字开头的有效(众所周知的)主机名。
主机名以数字开头是否有效?例如8server
通过阅读RFC 1123,可以看出这是一个有效的主机名。但是,我不清楚主机名是否只能在有后缀的情况下以数字开头,例如8server.com
这个问题的根源在于InternetDomainName.isValid("8server");
Google Guava库(Javadoc)拒绝输入。我还在番石榴讨论小组上发表了一个具体问题。
4chan.com
是一个以数字开头的有效(众所周知的)主机名。
Answers:
RFC 1123放宽了RFC 952的约束,该约束指定了由DNS代替的主机名服务器协议(在RFC 953中进行了描述)的旧版。因此,根据这些RFC,全数字主机名将有效。
RFC 1123本身讨论了IP与主机名解析时的后果:
如果可以在不使用此类分隔符的情况下输入点分十进制数,则必须进行完整的语法检查,因为主机域名的一部分现在允许以数字开头,并且在法律上可以完全是数字 (请参阅6.1节)。 2.4)。但是,有效的主机名绝不能使用点分十进制格式#。#。#。#,因为至少最高级别的组件标签将是字母形式的。
但是,由于实现问题,RFC 1178指南中提供了选择有效主机名的方法。这些实现中有很多不能很好地识别数字主机名,并试图将它们解析为IP,直到它们包含至少一个非数字字符(无论其位置如何)为止。
此外,您会发现实现并不总是遵循RFC 952的其他原始约束,例如允许主机名以减号或句号结尾。
DNS保留了主机名的这些原始规范,并增加了对下划线的支持(RFC 2782)。
更新根据注释中的要求,对句子进行说明:但是,有效的主机名绝不能使用点分十进制形式#。#。#。#,因为至少最高级别的组件标签将是字母。这意味着顶级域名必须是字母,因此绝对不能将完全限定的主机名与IPv4地址混淆。RFC 3696已针对DNS 澄清了这一想法,并将其更改为非全数字形式。注意细微的差别。
最初,主机名不能以数字或下划线(RFC 952)开头,但正如您提到的,新规范RFC 1123允许它。
关于对isValid()的调用,在这种情况下,应在参数中传递完整域名: InternetDomainName.isValid("8server.com");
InternetDomainName.isValid("server");
返回true。