localhost是一台计算机用来指代其自身的名称,当一个程序连接到 localhost 时,它实际上是连接回同一台机器,因此网络流量会保留在本地,而不会向外发送到网络中。
本文将解释什么是 localhost、它如何映射到 127.0.0.1 和 ::1 等回环地址,以及它在开发、测试和网络诊断中的用途。本文中示例将使用 Linux 命令,但核心概念适用于 Linux、macOS、Windows、BSD 及其他支持网络的操作系统。
1. localhost 的含义
每款现代操作系统都有一个特殊的虚拟网络接口,称为回环接口(loopback interface)。与物理网卡不同,回环接口完全存在于软件中。任何发送到该接口的数据包都会被立即回环到同一台机器,无需经过任何硬件或外部网络。
回环接口在 IPv4 中被分配了 IP 地址 127.0.0.1。IETF(互联网工程任务组)将整个 127.0.0.0/8 网段保留为回环地址,这意味着从 127.0.0.1 到 127.255.255.254 之间的任何地址都会路由回本地机器。在实践中,127.0.0.1 是使用的标准地址。
在 IPv6 中,回环地址为 ::1。
在 Linux 上,localhost 通常在查询 DNS 之前先通过 /etc/hosts 文件进行解析:
cat /etc/hosts
输出示例:
[root@yyzcdb ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.200.100 yyzcdb
[root@yyzcdb81 ~]#
在大多数 Linux 系统中,根据 /etc/nsswitch.conf 中的解析器顺序,/etc/hosts 中的条目会在 DNS 解析之前被优先检查。其他操作系统也有相同的 localhost 概念,但 hosts 文件路径和解析器配置有所不同。
2. localhost vs 127.0.0.1 vs 0.0.0.0
localhost、127.0.0.1 和 0.0.0.0 经常被同时提及,但它们的用途各不相同。
| 地址/名称 | 说明 |
|---|
| 是一个主机名。它通常解析为 IPv4 的 127.0.0.1,也可能解析为 IPv6 的 ::1。 |
| 是标准的 IPv4 回环地址。连接到它始终意味着连接到本机。 |
| 是 IPv6 回环地址。其用途与 127.0.0.1 相同,但针对 IPv6 流量。 |
| 不是回环地址。当服务器绑定到 0.0.0.0 时,它会监听所有可用的 IPv4 接口,包括回环接口和面向网络的接口。 |
- 对于仅本地开发的场景,应将服务绑定到
localhost 或 127.0.0.1。 - 若要让服务能够被网络上的其他设备访问,则需要将其绑定到机器的局域网 IP 地址或
0.0.0.0,然后确保防火墙允许该端口。
3. 回环流量是如何工作的
当向 127.0.0.1 或 localhost 发送请求时,TCP/IP 协议栈会识别出回环地址,并将数据包在内部回环到同一台机器。该流量不会到达物理网络接口(NIC),也不会传输到任何路由器或外部网络。
这与普通的网络流量不同,普通流量会通过物理或虚拟网络接口发送,由路由器转发,并在网络中传输以到达目标。
在 Linux 上,可以使用 ip 命令验证回环接口是否处于活动状态:
ip a show lo
输出示例:
[root@yyzcdb ~]# ip a show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
[root@yyzcdb ~]#
4. 使用 ping 测试回环
在 Linux 上,可以使用 ping 命令验证回环接口是否正常工作:
ping -c 5 localhost
输出示例:
[root@yyzcdb ~]# ping -c 5 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.078 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.077 ms
64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.081 ms
64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.078 ms
--- localhost ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 0.031/0.069/0.081/0.019 ms
[root@yyzcdb ~]#
接近零的响应时间证实了流量并未离开本机。
5. 常见使用场景
5.1 应用程序开发与测试
Web 服务器和开发工具在本地运行时,默认绑定到 localhost 或 127.0.0.1。这使得应用程序只能从同一台机器访问,而不能从网络访问。例如,运行在 8080 端口的本地 Web 服务器,可通过 http://localhost:8080 访问。
5.2 测试时覆盖域名
可以通过在 /etc/hosts 中将域名映射到回环地址,将其流量重定向到本地服务器。例如,添加以下行会将所有对 example.com 的请求路由到本地机器:
127.0.0.1 example.com
这在部署之前使用生产域名本地测试网站时非常有用。
5.3 屏蔽域名
将域名映射到 /etc/hosts 中的 127.0.0.1 可以有效屏蔽该域名。对该域名的任何请求都会被发送到本地回环,而那里没有任何服务在监听,因此连接会静默失败。
5.4 网络诊断
Ping 127.0.0.1 可以确认本地机器的 TCP/IP 协议栈是否正常运行,与网络硬件或连接状态无关。如果 ping 127.0.0.1 失败,说明本地网络协议栈本身存在问题。
6. 快速参考
| 任务 | 命令 / 值 |
|---|
| localhost |
| 127.0.0.1 |
| ::1 |
| cat /etc/hosts |
| ip a show lo |
| ping -c 4 localhost |
| |
| |
7. 常见问题
7.1 localhost 和 127.0.0.1 有什么区别?
实际上它们指向的是同一个东西。
localhost 是一个主机名,通过 /etc/hosts 文件解析为 127.0.0.1。使用 127.0.0.1 跳过了主机名解析这一步,但结果完全相同。
7.2 0.0.0.0 是什么?
0.0.0.0 与 localhost 不同。
当服务器绑定到 0.0.0.0 时,它会监听所有可用的网络接口,包括回环接口、局域网接口及其他任何接口。而当服务器绑定到 127.0.0.1 时,它只接受来自本机的连接。
7.3 其他设备能连接到我的 localhost 吗?
不能,发送到 127.0.0.1 或 localhost 的流量永远不会离开本机。
网络上的其他设备无法访问仅绑定到回环接口的服务,要允许外部连接,服务必须绑定到机器的局域网 IP 或 0.0.0.0。
7.4 localhost 的 IPv6 对应地址是什么?
IPv6 的回环地址是 ::1。
对于 IPv6 流量,它的行为与 127.0.0.1 相同。
7.5 为什么我的应用程序在 localhost 上使用 3000、8080 或 8000 端口?
这些是各种 Web 框架和工具常用的默认开发端口。在大多数 Linux 系统上,绑定 80 端口(HTTP)和 443 端口(HTTPS)需要 root 权限,因此开发服务器默认使用任何用户都可以使用的高编号端口。