localhost(127.0.0.1) 和 0.0.0.0 有什么异同?

Sunday, February 16, 2020

可能大家遇到过一些问题, 比如:

我的框架将服务默认监听在127.0.0.1上, 为什么我在container 外面死活访问不到服务?

而我们大多数人都听过127.0.0.1 和 0.0.0.0, 但是可能大多数人都没有在这个上面仔细的考虑过, 如果它们都指向同一个地方, 那么它们到底有什么不同呢? 上面的问题, 又应该如何解决呢? 请听我慢慢道来.

127.0.0.1?

127.0.0.1 回环(Loopback)IP地址(它也叫localhost), 回环地址是用来建立到本机的IP连接.

在IPv6协议中, ::1 起着相同的作用. 虽然使用127.0.0.1 是一个比较常见的实践, 实际上, 使用127.*.*.* 中的任何一个地址都有相同的作用, 这是因为整个127地址段都是分配给了回环功能. 所有发给127网段的数据包都应该在机器内部回环, 而不会出现在现实的网络中.

这个地址段一般是用来做IP/TCP 以及高层协议的测试用的. 正常来说, 向外发送的数据会在网络栈上从上往下逐层打包, 而如果用回环地址, 那么数据包在IP层立马往回走发向本机, 而不会走向更下层的层次,比如数据链路层. 所以如果只是想测试IP/TCP 以及更高层的协议, 用回环地址就是一个非常好的选择, 因为用回环地址屏蔽了底层协议的协议. 而在这个家族里面 127.0.0.1 是最常用的测试地址.

0.0.0.0?

首先要说明的是, 0.0.0.0 在格式上是一个合法的IP 地址, 所以它可以被正确解析成正确的值. 它是合法的, 实际上, 它也是有正式意义的, 它的意义是: “没有确定地址的占位符(the ‘no particular address’ placeholder)”. 非常的虚对不对? 它具体代表的意义, 要决于下一步要做什么.

在路由的上下文中, 它通常指代默认的地址. 为什么呢? 在路由配置中, 我们使用CIDR block 来配置路由表(例如: 10.1.3.2/24 -> interface 1), 这种配置代表我们是通过网段来路由不同的数据包, 而0.0.0.0/0 可以代表最大的网段(地址全0, 且子网掩码为0), 所以所有的地址都能被它包括, 所以, 没有被路由表匹配上的网段就都流到它这里啦.

在服务的上下文中, 它代表所有绑定在本机上的IPv4地址.如果一个机器上绑定了两个IPv4地址(192.168.1.23 和 10.1.2.32), 而一个服务绑定在0.0.0.0上, 那么通过这两个IPv4地址都能访问到该服务.

0.0.0.0还有一个应用是在DHCP服务上. 在机器刚刚启动, 还没有IP地址正需要从DHCP获取时, 机器会使用0.0.0.0作为原地址在子网内广播DHCPDISCOVER请求.

好了, 到这里它们之间的区别就已经非常清楚了, 相信以后再遇到服务在外部访问不到时你又多了一条思路去排查问题了.

照旧, 如有理解偏差, 还望不吝斧正.

Sign Your Work

AWS KMS 授权的“坑”

comments powered by Disqus