我最近很惊讶地发现0.0.0.0 是一个有效的 IP 地址,并且实际上具有定义的“含义”和用途。
IANA 分配 0.0.0.0/32表示“此网络上的此主机”的定义RFC 1122 第 3.2.1.3 节。虽然 RFC 1122 规定它不能作为网络上的目的地在 IP 数据包中发送,但它没有定义如何在主机内部解释该地址。
除了...RFC 1122 将其命名为“此网络上的此主机“其含义与“localhost”非常相似。
在 Linux 上试图连接设置为 0.0.0.0 会导致连接到 localhost(假设有东西正在监听)。这似乎符合 RFC 1122 名称。但是我没有看到它在标准中定义(我甚至不确定哪个标准会涵盖它,因为它是操作系统内部的)。
所以我的问题是:Linux 对 0.0.0.0 的解释是否connect()
与其他操作系统一致?在众所周知的操作系统内核(Windows / UNIX / ...)中是否存在任何值得注意的例外。
由于 DNS 服务器的兴起,我对这个目标地址特别感兴趣”错误地“使用 0.0.0.0 作为黑洞,导致与本地主机的虚假连接。
答案1
不,一个很容易检查的操作系统是 Windows,它将 0.0.0.0 视为无效的连接地址。(Windows 通常对地址有效性要求很严格,例如,您也不能在 Windows 上使用 240.0.0.0/4。)
(另一方面,大多数 BSD 可能都以 Linux 的方式处理这个问题,因为 Linux 源代码实际上指出 Linux 的行为是为了模仿 BSD。)
答案2
0.0.0.0 有几种用途。
在客户端拥有合适的 IP 地址之前,DHCP 使用 0.0.0.0 作为发送数据包的源地址。
Posix 将“INADDR_ANY”地址定义为用于监听“任何本地地址”的通配符。它没有明确定义该值,但它确实说“INADDR_ANY 和 INADDR_BROADCAST 值是字节顺序中立的,因此它们的字节顺序未指定。”。实际上,我从未听说过任何系统中除了 0.0.0.0 之外的任何其他值,我很难看出可以使用什么其他值,同时保持字节顺序中立并避免与实际地址冲突的可能性。
另一方面,连接到 0.0.0.0 是非标准的,Linux 和 BSD 似乎支持它。Windows 不支持。