从 ping0.0.0.0
响应127.0.0.1
。但是,如果我关闭本地主机环回并使用另一个 ip 保持另一个接口,那么 ping0.0.0.0
会出错
$ping 0.0.0.0 connect: Invalid argument
Run Code Online (Sandbox Code Playgroud)
不0.0.0.0
应该听所有接口吗?那么基本上,0.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
Run Code Online (Sandbox Code Playgroud)
那么,如果我们不能 ping 的话,这里到底发生了什么0.0.0.0
?并再次重复这个问题,为什么0.0.0.0
只从环回而不是主机上的任何其他接口返回响应?
Fra*_*mas 17
0.0.0.0/0
不是地址而是网络标识(用于路由,意思是“所有网络”)。因此,您无法 ping 通它。如果你想 ping 你会使用的每个系统255.255.255.255
。每个网络都有两个特殊地址,标识和广播,通常分别位于.0
和.255
。
例如在网络上192.168.5.0/24
, Identity =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
地址。
该地址由 IANA 保留,在RFC 1122中定义为:
\nIANA IPv4 特殊用途地址注册...
\n\n\n0.0.0.0/32 该网络上的该主机 [RFC1122],第 3.2.1.3 节
\n
RFC 1122 第 3.2.1.3 节
\n\n\nRun Code Online (Sandbox Code Playgroud)\n(a) { 0, 0 }\n\n This host on this network. MUST NOT be sent, except as\n a source address as part of an initialization procedure\n by which the host learns its own IP address.\n
根据RFC的定义,Linux使用这个地址作为目标地址是很有意义的。“此网络上的主机”具有几乎相同的含义“localhost”(地址 127.0.0.1)。因此,当您将 0.0.0.0 设置为目标地址时,Linux 始终将其视为地址为 127.0.0.1
\nLinux 也符合该标准,因为 RFC 1122 规定“不得发送”。Linux 不发送它。具有该目标地址的网络上不会发送任何数据包。
\n这是许多操作系统也使用的另一种解释,表示绑定到所有[我的]地址。这仅在创建侦听套接字时使用本地(源)地址。同样,这永远不会导致网络上出现数据包。
\n“所有[我的]地址”和“这个网络的主机”之间的连接确实看起来有点延伸。但是,它对于几乎所有操作系统都是常见的。
\n有一个可怕的神话,0.0.0.0 是:
\n\n\n\xe2\x9a\xa0\xef\xb8\x8f 维基百科神话:
\n0.0.0.0 不可路由元地址,用于指定无效、未知或不适用的目标
\n
这似乎来自一个不正确的维基百科页面(现已更正),并且通过人们将相同的单词复制粘贴到博客和 Stack Exchange 答案中,似乎获得了很大的吸引力。
\n