127.0.0.1 vs localhost vs 0.0.0.0 之间有什么区别

Table of Contents

前两天问了同事一个问题,我启动了一个8080端口上的服务,是不是不能再启动该端口的服务了。他说当然了,肯定会提示端口占用的。答案是这样吗?我们一起来看下这个问题。

1 基础概念

localhost 默认绑定在 127.0.0.1, 可从hosts配置文件看出。

127.0.0.1 环回地址(loopback)属于A类地址

0.0.0.0 对外开放,如果你有个服务,想让外部访问,则可以设置为它,或者也可以指定IP访问。

192.168.1.8 路由器分配给的IP,或者说本机网卡获取到的IP。

2 测试

假如你现在在MAC电脑起了一个Nginx服务,绑定端口8080,这时候,我们可以看到

netstat -a -n | grep -i listen

tcp4       0      0  *.8080                 *.*                    LISTEN

我们从上面可以看到,Nginx绑定在了 *.8080 ,即0.0.0.0.8080。现在我们分别访问

127.0.0.1:8080
0.0.0.0:8080
192.168.1.8:8080
localhost:8080

我们发现这三个地址都可以访问的到。

现在我们又准备起一个8080服务,可不可以呢。答案是不可以也可以。这句话怎么讲呢

不可以是因为,我们不可以再起一个占用真实网卡的端口,比如192.168.1.8:8080,但我们可以起一个127.0.0.1:8080的服务。

通过查询监听端口可得

tcp4       0      0  127.0.0.1.8080         *.*                    LISTEN

我们现在再访问下上面四个地址,看看有没有什么变化。

我们发现,以下地址变成了新服务

127.0.0.1:8080
localhost:8080
0.0.0.0:8080

以下地址还是老服务

192.168.1.8:8080

所以,我们可以得出以下结论

  • localhost 是一个方便输入的字符,是127.0.0.1的映射。另外因为相对输入IP来讲,一个单词或字符会更符合人们的习惯,也更便于记忆。这也就是域名的由来。当然,如果你不喜欢localhost,比如改成cat,也是可以的,随你喜欢。如果你去掉/etc/hosts文件中配置的映射关系,localhost就仅是一个单词。
  • 在当前上下文中,0.0.0.0 相当于 127.0.0.1,环回地址127.0.01属于最初/终的地址。如果把他想象成一个环,它既是起点,也是终点。0.0.0.0是不可路由的元地址。

reference