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


220

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

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

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

netstat-输出的屏幕截图


6
也看看这个问题,因为它提供了细节,什么是0.0.0.0(而不是):serverfault.com/questions/228629/...
埃利后来的Kesselman

现代操作系统将::1用作回送地址。
卡巴斯德

Answers:


157

唯一的事情是您不是说“所有地址都应该具有访问权限”,而是在防火墙和/或服务器软件和/或其他安全层(例如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通常表示默认路由(除本地网络中的路由等之外,指向Internet“其余”的路由)。


因此,您的意思是当Webserver的套接字在监听0.0.0.0时绑定到任何可用的地址吗?
onmyway133

0.0.0.0表示/00.0.0.0
带有

需要注意的是:如果某个进程在0.0.0.0上进行侦听,则所有机器的网络接口的IP地址(包括环回接口的当前配置地址)都可以访问该进程。但是,如果该进程仅侦听回送地址的端口<portNumber>,例如127.0.0.1,则该进程仅可通过精确定位127.0.0.1:<portNumber> 从同一台计算机访问。试试这个 python工具 玩!
Gab是好人

77

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


38

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)。

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

1
操作系统很可能会阻止您执行此操作,因为从网络角度来看,这不仅仅具有道理。尝试ping 0.0.0.0在Windows系统上导致错误消息。
Massimo 2014年

curl 0.0.0.0connection refused在Arch Linux上产生。ping 0.0.0.0另一方面,似乎是一个别名ping 127.0.0.1,可以正常使用。
马提亚斯·布劳恩

@MatthiasBraun connection refused可能是因为curl默认情况下尝试连接到端口80 / tcp。尝试使用来查找打开的端口,nmap -sV localhost然后使用631 / tcp:进行查找curl 0.0.0.0:631
Pablo A

27

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

0.0.0.0:

根据RFC1122第3.1.2.3节:

现在,使用以下IP地址表示法来概括A,B和C类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.

就是这样,“此网络上的此主机” ...正如李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接口,而不管其余网络设置(如果有)是什么样子。发送到回送设备的所有流量将立即在其上接收。环回网络并不是指“自己”的主机,而是更像主机中有一个小型网段,设备,进程和套接字可以打开并连接到该网段。


4

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.