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 是一个只属于您自己、永远不会到达外界的地址。

相关术语

IP 地址 用于在互联网上标识设备的数字地址。127.0.0.1 是一个特殊的环回地址。 IPv6 拥有 128 位地址空间的下一代协议。环回地址仅为一个:::1。 DNS 将域名转换为 IP 地址的系统。也参与 localhost 主机名的解析。 NAT 在私有 IP 和全局 IP 之间进行转换的技术。环回流量不经过 NAT。 防火墙 监控和控制网络流量的安全设备。环回流量的处理方式取决于配置。