ping 得到0.0.0.0
响应127.0.0.1
。但是,如果我关闭本地主机环回,并保持另一个接口与另一个 IP 连接,则 ping0.0.0.0
会出错
$ping 0.0.0.0 connect: Invalid argument
难道不0.0.0.0
应该监听所有接口吗?那么0.0.0.0
从网络角度来看,绑定究竟是如何工作的?为什么 ping0.0.0.0
仅适用于环回而不适用于其他接口?
- 更新我已经在其他地方阅读过并在这里得到了类似的答案(您无法 ping 0.0.0.0)。
[anshup@s2 ~]$ ping 0.0.0.0 PING 0.0.0.0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.010 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.009 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.009 ms
^C
--- 0.0.0.0 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2551ms
rtt min/avg/max/mdev =
0.009/0.009/0.010/0.002 ms
那么,如果我们无法 ping 通,这里究竟发生了什么?0.0.0.0
(重复这个问题)为什么0.0.0.0
响应仅从环回接口返回,而不是主机上的任何其他接口?
答案1
0.0.0.0/0
不是一个地址,而是一个网络标识(用于路由,表示“所有网络”)。因此您无法 ping 它。如果您想 ping 每个系统,您将使用255.255.255.255
。每个网络都有两个特殊地址,即标识和广播,通常分别位于.0
和.255
。
例如在网络上192.168.5.0/24
,身份 = 192.168.5.0
,广播 = 192.168.5.255
。第一个主机是192.168.5.1
,最后一个是192.168.5.254
。请注意,任何主机都不能使用身份或广播地址作为自己的 IP 地址。
主机默认网关根据定义是您用来到达所有未知网络的路由,因此0.0.0.0/0
只是对所有网络的参考。
编辑:环回响应的原因是“未定义”行为未在RFC1700。根据 RFC,以 0 开头的地址(以十进制表示)绝不允许作为目的地(仅可作为广播数据包的源),因此网络堆栈的作者选择让环回做出响应。
当我尝试0.0.0.0
从 Win7/powershell 提示符执行 ping 操作时,我只收到消息“PING:传输失败。一般失败。”所以这显然是特定于给定操作系统堆栈的行为,甚至可能是特定于驱动程序的行为。如果您提供您的操作系统,我们可能会找到更多信息,但它不会回答任何有意义的问题,因为它的特定实现行为不受网络标准的约束。我猜您的操作系统只是将所有无效地址别名为127.x.y.z
地址。
答案2
0.0.0.0 的实际定义
地址是由 IANA 保留因为它的定义是RFC 1122作为:
IANA IPv4 特殊用途地址注册表...
0.0.0.0/32 此网络上的此主机 [RFC1122],第 3.2.1.3 节
RFC 1122 第 3.2.1.3 节
(a) { 0, 0 } This host on this network. MUST NOT be sent, except as a source address as part of an initialization procedure by which the host learns its own IP address.
Linux 的解释
根据 RFC 定义,Linux 将此地址用作目标地址非常有意义。“此网络上的此主机”的含义与“localhost”(地址 127.0.0.1)几乎相同。因此,当您将 0.0.0.0 设置为目标地址时,Linux 始终会将其视为寻址到 127.0.0.1
Linux 也符合该标准,因为 RFC 1122 规定“不得发送”。Linux 不会发送它。网络上永远不会发出具有此目标地址的数据包。
0.0.0.0 是否表示所有地址?
这是许多操作系统也使用的另一种解释,表示绑定到所有 [我的] 地址。这专门用于创建侦听套接字时仅使用的本地(源)地址。同样,这不会导致网络上出现数据包。
“所有 [我的] 地址”和“此主机此网络”之间的连接确实看起来有点牵强。然而,这在几乎所有操作系统中都很常见。
神话
有一个可怕的误解,认为 0.0.0.0 是:
⚠️ 维基百科神话:
0.0.0.0 不可路由的元地址,用于指定无效、未知或不适用的目标
这似乎来自错误的维基百科页面(现在已更正)并且似乎通过人们将相同的单词复制粘贴到博客和 Stack Exchange 答案中而获得了很大的关注。
答案3
在 Internet 协议版本 4 中,地址0.0.0.0
是不可路由元地址用于指定无效、未知或不适用目标。