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

相关术语

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

常见问题

为什么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一个地址。