127.0.0.1 - 写给自己的信
每个程序员都知道 IP 地址 127.0.0.1。也被称为"localhost",这个地址永远不会离开网络,它指向你自己的计算机。当 Web 开发者在 http://localhost:3000 上测试应用时,数据不会通过网线传输哪怕一毫米;它在操作系统内核中就被回环了。
但为什么是"127"?为什么不是 1.0.0.1 或 10.0.0.1?在这个看似随意的数字背后,隐藏着一段可以追溯到 20 世纪 70 年代互联网诞生之初的历史。
为什么是 127 - A 类地址中的最后一个数字
在最初的 IPv4 设计中,第一个八位组(8 位)决定了网络类别。A 类地址以 0 位开头,覆盖从 0.0.0.0 到 127.255.255.255 的范围。
127 是 A 类中的最后一个网络号。在 RFC 790(1981 年)中,整个 127.0.0.0/8 地址块(约 1677 万个地址)被保留,随后在 RFC 990(1986 年)中被明确指定用于环回。这意味着不仅是 127.0.0.1,127.0.0.2 和 127.255.255.254 也都是环回地址。
关于为什么选择了 A 类的最后一个数字,没有官方记录。主流理论认为,A 类开头的 0 号网络被保留用于特殊用途,而 127 位于"边缘",也便于指定为特殊用途。将 1677 万个地址"浪费"在环回上有时被认为是导致 IPv4 地址耗尽的因素之一,但在当时,43 亿似乎是无穷无尽的。
环回的工作原理 - 数据去了哪里?
发往 127.0.0.1 的数据包永远不会被发送到网络接口(NIC)。操作系统网络栈中存在一个虚拟的"环回接口"(Linux 上为 lo,macOS 上为 lo0),数据包在这个接口处被折返。
- 不涉及物理网络,因此不受网络故障影响
- 可以绕过加密和防火墙处理(取决于配置)
- 通信速度接近内存复制速度,延迟几乎为零
- 外部无法访问,因此可以安全地测试开发中的服务
您在 IP 确认上看到的 IP 地址是您的全局 IP 地址。127.0.0.1 永远不会对外界可见。
localhost 和 127.0.0.1 是一样的吗?
严格来说,不是。localhost 是一个主机名,由 DNS 或 /etc/hosts 文件解析为 IP 地址。在大多数系统上,localhost 同时解析为 127.0.0.1(IPv4)和 ::1(IPv6)。
这种差异在某些情况下可能导致问题:
- MySQL 通过
localhost连接时使用 Unix 套接字,但通过127.0.0.1连接时使用 TCP/IP。由于连接方式不同,认证设置可能只对其中一种有效 - 在启用了 IPv6 的系统上,
localhost可能解析为 ::1,导致无法连接到仅监听 IPv4 的服务 - 某些浏览器将
localhost视为"安全上下文",允许在没有 HTTPS 的情况下使用 Service Worker 和地理位置 API,但对127.0.0.1的处理可能不同
0.0.0.0 - 另一个特殊地址
0.0.0.0 经常与 127.0.0.1 混淆。这个地址的含义因上下文而异:
- 作为服务器绑定地址:表示"监听所有网络接口"。在
0.0.0.0:8080上启动服务器,可以同时从 localhost 和外部连接访问 - 在路由表中:默认路由(0.0.0.0/0)表示"不匹配任何其他路由的目标"
- 作为源地址:设备在通过 DHCP 获取地址之前,使用 0.0.0.0 作为自己的地址
- 在广告拦截器中:在
/etc/hosts中添加0.0.0.0 ads.example.com可以禁用对广告服务器的访问。0.0.0.0 比 127.0.0.1 失败更快,这就是广告拦截器偏好使用它的原因
IPv6 环回 - ::1
在 IPv6 中,环回地址是 ::1(0000:0000:0000:0000:0000:0000:0000:0001 的缩写)。IPv4 的 127.0.0.0/8 消耗了 1677 万个地址,而 IPv6 只使用了一个地址。拥有 128 位地址空间,无需担心"浪费"1677 万个地址,但 IPv6 的设计者优先考虑了效率。
四种写法速查表
上面出现的四种写法看起来相似,本质与行为却各不相同。
| 写法 | 本质 | 数据包的去向 | 主要用途与注意点 |
|---|---|---|---|
127.0.0.1 |
IPv4 的环回地址 | 永远不会被发送到网络接口(NIC)。操作系统网络栈中的虚拟环回接口会把数据包折返,Linux 上为 lo,macOS 上为 lo0 |
不涉及物理网络,因此不受网络故障影响;外部也无法访问,可以安全地测试开发中的服务 |
localhost |
一个主机名,而不是地址本身 | 先由 DNS 或 /etc/hosts 文件解析为地址,再被折返。在大多数系统上同时解析为 127.0.0.1 和 ::1 |
MySQL 在这里使用 Unix 套接字,而通过 127.0.0.1 则使用 TCP/IP,认证设置可能只对其中一种有效。某些浏览器将它视为安全上下文,允许在没有 HTTPS 的情况下使用 Service Worker 和地理位置 API |
0.0.0.0 |
含义因上下文而异的特殊地址 | 作为服务器绑定地址时表示监听所有网络接口;在路由表中,默认路由(0.0.0.0/0)表示不匹配任何其他路由的目标 | 在 0.0.0.0:8080 上启动的服务器,可以同时从 localhost 和外部访问。设备在通过 DHCP 获取地址之前也用它作为自己的地址;写入 /etc/hosts 时它比 127.0.0.1 失败更快 |
::1 |
IPv6 的环回地址,是 0000:0000:0000:0000:0000:0000:0000:0001 的缩写 | 作为 IPv6 的环回被折返。IPv4 的 127.0.0.0/8 消耗了 1677 万个地址,而 IPv6 只用一个地址就够了 | 在启用了 IPv6 的环境中,localhost 可能解析为 ::1,从而无法连接到仅监听 IPv4 的服务 |
127.0.0.1 在流行文化中
127.0.0.1 是程序员文化中的标志性符号。
- "There's no place like 127.0.0.1",这是对《绿野仙踪》中名言"There's no place like home"的戏仿。程序员 T 恤上的经典设计
- "localhost is where the heart is",另一个类似的戏仿
- 在安全领域,"来自 127.0.0.1 的攻击"有时被用作暗示内部威胁的表达
总结
127.0.0.1 体现了互联网最基本的概念之一,"与自己的通信"。这个在 1981 年被保留的数字,40 多年后的 2020 年代仍然被全世界的开发者每天使用。
下次访问 localhost 时,请记住数据不会通过网线传输哪怕一毫米,而且有 1677 万个地址被保留用于这封"写给自己的信"。与您可以在 IP 确认上查看的全局 IP 地址不同,127.0.0.1 是一个只属于您自己、永远不会到达外界的地址。
相关术语
常见问题
为什么127.0.0.1是localhost?
127是IPv4 A类地址的最后一个网络号,在1981年的RFC 790中被保留,并在1986年的RFC 990中被明确指定用于环回。据推测是因为A类地址末端的编号便于分配特殊用途,但没有留下官方记录。
localhost和127.0.0.1一样吗?
严格来说不同。localhost是主机名,通过DNS或/etc/hosts解析为IP地址。例如MySQL中localhost使用Unix套接字,而127.0.0.1使用TCP/IP,行为可能不同。
127.0.0.0/8的所有地址都是环回地址吗?
是的。不仅是127.0.0.1,从127.0.0.2到127.255.255.254约1677万个地址全部都是环回地址。IPv6中已精简为::1一个地址。