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

Jic*_*hao 264 ip netstat ip-address

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

但什么是 0.0.0.0?好像也指本地电脑,那有什么区别呢?

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

netstat -an 输出的屏幕截图

Lee*_*e B 181

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

在这种情况下,0.0.0.0 表示“本地机器上的所有 IP 地址”(实际上可能是“本地机器上的所有 IPv4 地址”)。因此,如果您的网络服务器机器有两个 IP 地址,192.168.1.1 和 10.1.2.1,并且您允许像 apache 这样的网络服务器守护程序侦听 0.0.0.0,它将可以在这两个 IP 地址上访问。但仅限于可以联系这些 IP 地址和 Web 端口的内容。

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

  • `0.0.0.0` 表示默认路由*仅*如果它带有前缀 `/0` (或网络掩码 `0.0.0.0`) (2认同)
  • 需要注意的是:如果某个进程侦听 0.0.0.0,则可以在所有计算机网络接口的 IP 地址(包括当前配置的环回接口地址)上访问该进程。但是,如果进程仅侦听环回地址的端口<portNumber>,例如127.0.0.1,则只能通过**从同一台计算机**通过**定位127.0.0.1:<portNumber>*来访问该进程*。尝试**[这个](http://stackoverflow.com/questions/12268835/is-it-possible-to-run-python-simplehttpserver-on-localhost-only) python工具**来玩吧! (2认同)

slu*_*man 87

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


Mas*_*imo 43

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

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

  • 如果 curl 0.0.0.0 是什么意思?curl 实际上是通过可用接口联系和发送请求吗?它如何知道哪个接口是正确的?我了解服务器如何侦听所有接口,但是客户端请求所有接口的机制是什么,例如当我执行 curl 0.0.0.0 或 curl [::] 时。 (3认同)

小智 29

Lee B 的回答是正确的,但如果您有兴趣,这里有一些相关的 RFC。

0.0.0.0:

来自RFC1122,第 3.1.2.3 节:

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

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

        or
            { <Network-number>, <Subnet-number>, <Host-number> }
Run Code Online (Sandbox Code Playgroud)

...

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

就是这样,“这个网络上的这个主机”......正如 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 接口,而不管网络设置的其余部分(如果有的话)是什么样的。发送到环回设备的任何流量都会立即在其上接收。环回网络“引用”到您自己的主机并不是那么多……更像是您的主机中有一个迷你网段,设备、处理和套接字可以打开和连接到。


小智 7

简单来说:侦听 0.0.0.0 意味着从任何可以访问这台计算机的网络进行侦听,例如,从这台计算机、本地网络或 Internet,而侦听 127.0.0.1 意味着仅从这台计算机侦听