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 万个地址)被保留用于环回。这意味着不仅是 127.0.0.1,127.0.0.2 和 127.255.255.254 也都是环回地址。
关于为什么选择了 A 类的最后一个数字,没有官方记录。主流理论认为,A 类的开头(0 和 1)被保留用于特殊用途,而 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 在流行文化中
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 体现了互联网最基本的概念之一,"与自己的通信"。这个在 20 世纪 70 年代分配的数字,半个世纪后仍然被全世界的开发者每天使用。
下次访问 localhost 时,请记住数据不会通过网线传输哪怕一毫米,而且有 1677 万个地址被保留用于这封"写给自己的信"。与您可以在 IP 确认上查看的全局 IP 地址不同,127.0.0.1 是一个只属于您自己、永远不会到达外界的地址。