开发人员眼中的127.0.0.1和0.0.0.0——到底有什么区别

127.0.0.1和0.0.0.0在我们日常开发的中还是比较常见的两个伙伴,当我们做本地微服务接口测试的时候,经常使用 127.0.0.1来访问本地的服务接口;在搭建中间件(如Redis)的时候我们配置ip地址的时候经常使用0.0.0.0。今天我们就来聊聊两者的区别是什么。

1、认识 127.0.0.1

当使用命令查询我们本机的本地的网络基础信息的时候,查询的结果如下所示信息:

发现127.0.0.1它是一个回环地址,如果是我们尝试使用ping命令来测试这个地址,测试的结果如下:

其实127.0.0.1是每个主机都有的ip并且只能访问本机,如果此时本机有应用(如Nginx)占用了某个端口,那么我们使用127.0.0.1:port来访问就会访问到本机上对应的应用了。如下所示:

2、认识 0.0.0.0

0.0.0.0不是一个ip地址而是一个通配符,我们不能直接向0.0.0.0发送请求,如下ping 0.0.0.0的效果:

0.0.0.0的作用主要有两个,分别如下所示:

(1)在服务器中0.0.0.0指的是本机上的所有IPV4地址,假设一个主机有两个网卡地址(如192.168.1.1 和 172.1.2.1),并且该主机上的一个服务监听的地址是0.0.0.0,那么通过两个ip地址都能够访问该服务,如下图所示:

(2)在路由中,0.0.0.0表示的是默认路由,即当路由表中没有找到完全匹配的路由的时候所对应的路由。

3、项目配置中两者的区别

搭建一个springboot的项目并且在springboot的配置文件中给项目绑定地址,如下所示:

@RestController 
@RequestMapping("/ip") 
public class IPController { 
    @GetMapping("/test") 
    public String test() { 
        return "龙虾编程"; 
    } 
}

(1)application.yml配置中绑定127.0.0.1这个地址

server: 
  port: 8080 
  address: 127.0.0.1

如果使用http://127.0.0.1:8080/ip/test请求的效果如下:

如果使用本机的ip访问,http://192.168.100.125:8080/ip/test请求的效果如下

此时本机的ip访问就无法到服务。

(2)application.yml配置中绑定本机的ip

server: 
  port: 8080 
  address: 192.168.100.125

如果使用本机的ip+端口访问的结果如下图所示:

如果使用127.0.0.1+端口访问的效果如下:

我们发现127.0.0.1+端口的形式是无法访问。

(3)application.yml配置中绑定0.0.0.0

server: 
  port: 8080 
  address: 0.0.0.0

使用本机的ip+端口访问的结果如下图所示:

使用127.0.0.1+端口的形式访问,结果如下所示:

总结:

(1)127.0.0.1是回环地址并可以ping通;0.0.0.0是一个通配符并且不能ping通。

(2)服务器中存在多个网卡地址(如:127.0.0.1、192.168.100.125),项目中绑定地址指定的ip的时候(如绑定192.168.100.125),那么只会接收到指定ip的网卡发送过来的数据信息,即就是其他的网卡发送过来的数据不接收。

(3)项目中绑定0.0.0.0,那么可以接收服务器上任意网卡收到的数据。这也就是为什么我们自己搭建中间件的时候直接绑定0.0.0.0的原因,但是从安全性上考虑,生产环境一般不会配置0.0.0.0。

4