公众号旧文

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

你看到了什么?欢迎在评论区分享给大家。