公众号旧文
localhost 一定是 127.0.0.1 吗?
(文末有彩蛋)
很多人以为:
localhost
=
127.0
.
0.1
但严格意义上,这并不是一个固定关系。
localhost 只是一个主机名(hostname)。
它具体指向哪个 IP,取决于系统的解析配置。
一、最常见的情况
在大多数系统里,/etc/hosts 文件会写成这样:
127.0.0.1 localhost
::1 localhost
这意味着:
localhost
→
127.0.0.1
localhost
→ ::
1
也就是说:
IPv4
回环地址
127.0.0.1
IPv6
回环地址 ::
1
都可以代表 localhost。
二、有些系统会优先使用 IPv6
现代操作系统通常 优先使用 IPv6。
因此当程序解析:
localhost
有可能得到的是:
::1
而不是:
127
.
0
.
0
.
1
这就会导致一个经典问题:
如果程序只监听了 127.0.0.1
但你访问的是 localhost
而系统却解析成 ::1
结果就是连接失败。
很多开发者都踩过这个坑。
三、RFC 标准其实是这样规定的
互联网标准明确规定:
127.0.0.0/8 是 IPv4 loopback
::1 是 IPv6 loopback
localhost 应该解析为 loopback 地址
但并没有强制规定:
localhost
必须是
127.0.0.1
严格意义上:
localhost 代表的是 这台机器,而不是某一个具体 IP。
看到这里的读者,可以打开命令行
ping
localhost
在很多电脑上你会看到:
PING
DESKTOP-XXXXXX (::
1
)
这会让很多人第一次意识到:
原来 localhost 已经是 IPv6 了。
最后再放一个小彩蛋:
ping
127
.
1
你看到了什么?欢迎在评论区分享给大家。