localhost、127.0.0.1和0.0.0.0的区别
咕咕咕 fishing

产生的问题及原因

编写 socket 发送端和接收端程序。本地测试功能正常,但部署到云服务器测试时出现问题。
报错为 连接被拒绝

这个问题的答案早在 2022年的7月30日 就遇到,并且找到的解决方案。
但是在半年多之后的4月5日,又碰到这个问题并且耗费了很多时间。
所以在此较为详细的记录一下。

回到上面的问题,解决的方案是:将接收端程序监听的 host 从 127.0.0.1 或者 localhost 改为 0.0.0.0 或者 指定网卡的 ip
下面开始是这三个的详细区别

127.0.0.1

所有以 127 开头的 IP 地址,都是回环地址(loop back address)
其所在的回环接口一般被理解为虚拟网卡,并不是真正的路由器接口。

回环地址,就是任何发送给以 127 开头的回环地址的数据包,都会被自己接受。就是发不出去。

那么,为什么上面接收端程序监听回环地址不能收到外部发来的信息呢?
因为 回环地址绑定在 loopback 接口上,只能本机访问。这也是为什么本地测试成功的原因(接收端与发送端部署在一台机器上)。

正常的数据包会从IP层进入链路层,然后发送到网络上。
而给回环地址发送数据包,数据包会直接被发送主机的IP层获取,后面就没有链路层的事了。

localhost

localhost 是个域名
通常被默认指向 127.0.0.1 这个地址,以及支持 ipv6 的 [::1]

linux 中被定义在 /etc/hosts 文件中,是可以修改的。指向其他 ip 地址也是没有问题的,毕竟只是个域名。

0.0.0.0

ipv4 中,0.0.0.0 表示一个无效的、未知的、不可用的目标。被称为 Unspecified
它表示本机中所有的 ipv4 地址,不指定监听哪个网卡时,可以使用 0.0.0.0 监听本机所有 ip 的端口。

总结

有区别,区别说大也大,说不大也还行。反正使用的时候要注意。

另外就是关于查看网卡信息的命令 ifconfig
查看网卡信息:ifconfig命令及详细介绍