127.0.0.1 vs localhost vs 0.0.0.0 之间有什么区别
前两天问了同事一个问题,我启动了一个8080端口上的服务,是不是不能再启动该端口的服务了。他说当然了,肯定会提示端口占用的。答案是这样吗?我们一起来看下这个问题。
基础概念
localhost 默认绑定在 127.0.0.1, 可从hosts配置文件看出。
127.0.0.1 环回地址(loopback)属于A类地址
0.0.0.0 对外开放,如果你有个服务,想让外部访问,则可以设置为它,或者也可以指定IP访问。
192.168.1.8 路由器分配给的IP,或者说本机网卡获取到的IP。
测试
假如你现在在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
Comments:
Email questions, comments, and corrections to hi@smartisan.dev.
Submissions may appear publicly on this website, unless requested otherwise in your email.