0.0.0.0 绑定如何在 linux 中发生?

Ans*_*eek 4 networking ping

从 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仅适用于环回而不适用于其他接口?

  • 更新我在别处读过它并在这里得到了类似的答案(你不能 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地址。


Phi*_*ing 5

0.0.0.0 的实际定义

\n

该地址由 IANA 保留,在RFC 1122中定义为:

\n

IANA IPv4 特殊用途地址注册...

\n
\n

0.0.0.0/32 该网络上的该主机 [RFC1122],第 3.2.1.3 节

\n
\n

RFC 1122 第 3.2.1.3 节

\n
\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
Run Code Online (Sandbox Code Playgroud)\n
\n

Linux的解释

\n

根据RFC的定义,Linux使用这个地址作为目标地址是很有意义的。“此网络上的主机”具有几乎相同的含义“localhost”(地址 127.0.0.1)。因此,当您将 0.0.0.0 设置为目标地址时,Linux 始终将其视为地址为 127.0.0.1

\n

Linux 也符合该标准,因为 RFC 1122 规定“不得发送”。Linux 不发送它。具有该目标地址的网络上不会发送任何数据包。

\n

0.0.0.0 意味着所有地址怎么样?

\n

这是许多操作系统也使用的另一种解释,表示绑定到所有[我的]地址。这仅在创建侦听套接字时使用本地(源)地址。同样,这永远不会导致网络上出现数据包。

\n

“所有[我的]地址”和“这个网络的主机”之间的连接确实看起来有点延伸。但是,它对于几乎所有操作系统都是常见的。

\n

神话

\n

有一个可怕的神话,0.0.0.0 是:

\n
\n

\xe2\x9a\xa0\xef\xb8\x8f 维基百科神话:

\n

0.0.0.0 不可路由元地址,用于指定无效、未知或不适用的目标

\n
\n

这似乎来自一个不正确的维基百科页面(现已更正),并且通过人们将相同的单词复制粘贴到博客和 Stack Exchange 答案中,似乎获得了很大的吸引力。

\n