什么是有效的主机名标签?

tsh*_*ang 1 dns hostname ping

我将我的主机名设置为一个数字,其中运行hostname给出:

6592
Run Code Online (Sandbox Code Playgroud)

但是当我运行时ping 6592,我得到:

connect: Invalid argument
Run Code Online (Sandbox Code Playgroud)

我检查了相关的维基百科页面,它确实说允许这样的主机名(IIUC)。我错过了什么?

Gil*_*il' 13

RFC 所说的在这里实际上并不重要。RFC 指定了 DNS 级别上发生的事情,但如果 ping 不首先进行 DNS 查询,那就没有实际意义。当 ping 收到一个全数字参数时,它会将其解释为 IP 地址。

IPv4 地址在技​​术上是 32 位数字。它们几乎总是用点十进制表示法编写,即所谓的“点四边形”,如127.0.0.1。但它们也可以写成十进制2130706433或十六进制的单个数字0x7f000001

$ ping 2130706433    # 127*2^24 + 1
PING 2130706433 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.027 ms
$ ping 0.0.25.192
connect: Invalid argument
Run Code Online (Sandbox Code Playgroud)

0.0.0.0/8 范围内的地址被保留用作广播中的源地址。您无法向他们发送数据包,这就是为什么connect(2)返回EINVAL.

许多程序,包括大多数 ping 实现,都没有强制 DNS 查找的选项。如果您创建一个包含全数字子域的本地网络,并最终得到一个看起来像点四边形的有效主机名,您会遇到类似的问题。

如果您的本地网络有名称,ping 6592.mynetwork将起作用。但是您很可能会遇到类似的麻烦,因为您迟早会想要省略域名。顺其自然,包括一个字母,最好在开头。


pbo*_*oin 6

嗯,不完全是...维基百科和 RFC 所说的是,由于最初的RFC 952不允许前导数字,您现在可以拥有它们。(根据RFC 1123)您仍然不能拥有所有数字,这是您的问题。

您的“6952”不是有效的主机名,而“6952x”应该没问题。但是,撇开 RFC 不谈,我在过去一年左右的时间里遇到了前导数字的问题。我会避免使用它们,除非有令人信服的理由不这样做。

  • 我认为原始的“无前导数字”RFC 和后来的“前导数字 OK”版本之间的文本存在歧义。这才是重点。我所知道的是全数字主机名会导致频繁损坏,因此它们是一种糟糕的做法。RFC 不是法律,也不保证它们会得到完美实施。 (2认同)