题 IP地址0.0.0.0和127.0.0.1之间有什么区别?


我知道127.0.0.1~127.255.255.254是大多数现代操作系统的环回IP地址,这些IP地址可用于指代我们自己的计算机。

但是什么是0.0.0.0?它似乎也指的是本地计算机,所以它是什么 区别

并且,您能为我解释以下IP连接:

screenshot of netstat -an output


207
2017-10-25 07:22




还要看看这个问题,因为它提供了0.0.0.0(和不是)的详细信息: serverfault.com/questions/228629/... - Ellie Kesselman
将使用现代操作系统 ::1 作为环回地址。 - kasperd


答案:


唯一的问题是你并没有说“所有地址都应该有访问权限” - 这是在你的防火墙和/或服务器软件和/或其他安全层(如tcpwrappers)中完成的。

在此上下文中,0.0.0.0表示“本地计算机上的所有IP地址”(实际上可能是“本地计算机上的所有IPv4地址”)。因此,如果您的Web服务器计算机有两个IP地址192.168.1.1和10.1.2.1,并且您允许像apache这样的Web服务器守护程序侦听0.0.0.0,则可以在这两个IP地址上访问它。但只能联系那些IP地址和Web端口。

请注意,在不同的上下文(路由)中,0.0.0.0通常表示默认路由(到“互联网的其余部分”的路由,除了本地网络中的路由等)。


143
2017-10-25 08:55



所以你的意思是当它监听0.0.0.0时,webserver的套接字被绑定到任何可用的地址? - onmyway133
0.0.0.0 表示默认路由 只要 如果它附有前缀 /0 (或网络掩码 0.0.0.0) - minmaxavg
需要注意的是:如果某个进程侦听0.0.0.0,它将在所有机器的网络接口的IP地址处可达,其中包括当前配置的环回接口的地址。但是,如果进程仅侦听环回地址的端口<portNumber>,例如127.0.0.1,然后只能访问该进程 来自同一台机器 通过 完全针对127.0.0.1:<portNumber>。尝试 这个 python工具  玩! - Gab是好人


当服务正在侦听0.0.0.0时,这意味着该服务正在侦听所有已配置的网络接口,当侦听127.0.0.1时,该服务仅绑定到环回接口(仅在本地计算机上可用)


75
2017-10-25 07:33





IP地址 0.0.0.0 可以有不同的含义,取决于它的使用位置。

  • 它不是一个有效的地址,可以提供给实际的网络接口,以及0.0.0.0/8子网中的任何其他地址(即任何以地址开头的地址) 0.)。
  • 它不能用作任何IP数据包的源地址,除非这种情况发生在计算机仍然不知道自己的IP地址且它正在尝试获取IP地址时(典型示例:DHCP)。
  • 如果在路由表中使用,它将标识默认网关;到0.0.0.0的路由是默认路由,即当没有更多特定路由可用于目标地址时使用的路由。
  • 最后,当在输出中看到 netstat 命令(这是你要求的),这意味着给定的套接字正在侦听计算机拥有的所有可用IP地址;当计算机有多个IP地址时,套接字只能绑定到特定的地址和端口对,或绑定到端口和 所有 地址;如果你在那里看到一个IP地址,则意味着套接字只在该端口和该特定地址上侦听;如果你看到 0.0.0.0,这意味着它正在侦听该端口 所有 机器的地址,包括环回地址(127.0.0.1)。

38
2017-08-12 06:45



如果你卷曲0.0.0.0是什么意思? curl实际上是否通过可用接口联系并发送请求?它如何知道哪个接口是正确的?我理解服务器如何监听所有接口,但是客户端请求所有接口的机制是什么,例如当我卷曲0.0.0.0或curl [::]时。 - CMCDragonkai
操作系统很可能会阻止您这样做,因为从网络角度来看它不仅仅是有意义的。尝试去 ping 0.0.0.0 在Windows系统上导致错误消息。 - Massimo
curl 0.0.0.0 产量 connection refused在Arch Linux上。 ping 0.0.0.0另一方面,似乎是一个别名 ping 127.0.0.1 哪个工作正常。 - Matthias Braun
@MatthiasBraun connection refused 可能是因为curl默认尝试连接到端口80 / tcp。尝试找到您的开放端口 nmap -sV localhost 然后为例如631 / tcp: curl 0.0.0.0:631。 - Pablo Bianchi


Lee B的答案是正确的,但是如果你感兴趣的话,这里有一些相关的RFC。

0.0.0.0:

RFC1122,第3.1.2.3节:

我们现在总结一下A,B类重要的特殊情况,               和IP地址,使用以下符号表示IP               地址:

            { <Network-number>, <Host-number> }

        or
            { <Network-number>, <Subnet-number>, <Host-number> }

...

          (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.

就是这样,“这个网络上的这个主机”......正如Lee B的回答所说,这转化为主机上所有可用的IP地址。在0.0.0.0上托管服务将在每个可寻址接口上自动托管该服务。

127.0.0.1:

RFC5735

127.0.0.0/8 - 此块被指定用作Internet主机环回地址。由更高级别协议发送到该块内任何地址的数据报循环回主机内部。这通常仅使用127.0.0.1/32来实现环回。如[RFC1122]第3.2.1.3节所述,整个127.0.0.0/8块中的地址在任何网络上都不合法地出现。

0.0.0.0和环回地址127.0.0.1之间的区别在于,环回地址旨在允许主机本身内的完整功能IP接口,无论其他网络设置(如果有)如何。发送到环回设备的任何流量都会立即收到。并不是说环回网络“引用”你自己的主机...它更像是你的主机中有一个迷你网段,设备,进程和套接字,可以打开和连接。


26
2017-08-12 06:20





简单来说:在0.0.0.0上收听意味着从具有网络访问权限的任何地方进行监听,例如,从这台计算机,本地网络或互联网进行监听,而在127.0.0.1上收听则意味着只能从这台计算机上收听


3
2017-12-28 10:28