众力资讯网

很多网工都不知道:127.0.0.1 是本地,那 127.0.0.2 ...

很多网络工程师第一次接触 127.0.0.1,往往是在学 TCP/IP 的时候。书上一般写得很简单:127.0.0.1

很多网络工程师第一次接触 127.0.0.1,往往是在学 TCP/IP 的时候。

书上一般写得很简单:

127.0.0.1 是本地回环地址(Loopback Address),也叫 localhost,用于本机通信。

于是大多数人脑子里形成了一个很自然的印象:

127.0.0.1 就是本机地址。

但如果你稍微好奇一点,去查一下 127.0.0.2、127.0.0.3,甚至 127.1.1.1,就会发现一件非常有意思的事情:

这些地址 居然也能 ping 通。

很多人第一次看到都会愣住:

不是说 127.0.0.1 才是本地地址吗?那 127.0.0.2 是什么鬼?

要理解这个问题,我们需要稍微回到 TCP/IP 设计的最初逻辑。

一、127.0.0.1 其实只是“最出名”的一个地址

很多教材会告诉你:

127.0.0.1 是 Loopback 地址。

这句话 对,但不完整。

更准确的说法其实是:

127.0.0.0/8 整个网段都是 Loopback 网络。

也就是说,从:

127.0.0.0 到 127.255.255.255

这一整段 1677 万个 IP 地址,理论上全部都是 回环地址。

在 IPv4 早期设计中,这个网段被专门保留,用于本地主机通信。

这意味着什么?

意味着只要目标地址落在 127/8 这个范围内,操作系统就不会把数据包发到网卡上。

而是直接在 本机 TCP/IP 协议栈内部绕一圈。

换句话说:

数据包根本不会离开这台机器。

这就叫 Loopback(回环)。

你可以把它理解成一条 虚拟网络线路,起点和终点都是自己。

二、127.0.0.2 到底能不能用?

答案是:完全可以用。

在大多数操作系统里,如果你 ping:

ping 127.0.0.2

结果基本都是:

这并不是系统做了什么特殊处理。

原因其实很简单:

因为 127.0.0.2 仍然属于 127.0.0.0/8。

所以系统看到目标地址时,会直接判定:

这是 Loopback 网络。

于是数据包不会发往网卡,而是直接在本机协议栈内部完成通信。

很多人会问:

那它和 127.0.0.1 有什么区别?

答案很有意思:

在绝大多数场景下,没有任何区别。

从网络协议层面看,它们都只是:

指向本机的回环地址。

三、为什么要设计一个这么大的 127 网段?

很多人第一次知道 127/8 的时候都会产生一个疑问:

本机通信而已,为什么要留 1600 多万个地址?

这看起来确实有点奢侈。

但 TCP/IP 的设计者当年其实考虑了很多工程场景。

一个很典型的用途,就是 本机多服务隔离。

想象这样一个场景:

一台服务器上跑着多个服务:

Web 服务API 服务数据库缓存消息队列

有时候开发人员希望这些服务之间通过网络协议通信,但又不希望暴露在真实网络中。

于是可以这样做:

Web 绑定 127.0.0.1 API 绑定 127.0.0.2 数据库绑定 127.0.0.3

这些地址都属于本机,但逻辑上可以分开。

在某些测试环境里,这种方式非常方便。

当然,在现代系统中,人们更常用:

不同端口Docker 网络Unix Socket

但在早期 Unix 世界里,这种用法其实并不少见。

四、很多系统其实真的在用 127.0.0.2

如果你用过 Linux,有时候会看到 /etc/hosts 里出现这样一行:

127.0.1.1 hostname

很多人第一次看到会很迷惑。

不是应该用 127.0.0.1 吗?

其实这是一些 Linux 发行版的一个小设计。

原因是这样的:

在某些情况下,系统希望:

localhost → 127.0.0.1主机名 → 127.0.1.1

这样可以避免一些 DNS 解析冲突。

例如:

127.0.0.1 localhost 127.0.1.1 myserver

这样当程序解析主机名时,可以区分:

本地回环本机名称

虽然两者最终还是回到本机。

这种做法在 Debian、Ubuntu 系列系统中比较常见。

五、回环接口其实是一张“虚拟网卡”

如果你在 Linux 里执行:

ip addr

通常会看到这样一个接口:

lo

这就是 Loopback Interface(回环接口)。

它看起来像一张网卡:

lo: 127.0.0.1/8

注意这里的关键:

子网掩码是 /8。

这意味着:

127.0.0.1 127.0.0.2 127.1.1.1 127.255.255.254

全部都属于这张接口。

也就是说,只要目标地址在这个范围里:

数据包都会被 lo 接口接收并返回。

从操作系统的角度来看,这就是一个:

永远不会丢包、永远延迟极低的网络接口。

六、为什么 ping 127.0.0.1 延迟几乎为 0?

很多人会注意到一个细节:

ping 127.0.0.1

延迟通常是:

甚至是:

0.0xx ms

原因很简单。

数据包根本没有经过:

网卡交换机路由器物理线路

它只是:

在操作系统内核里走了一圈。

路径大致是这样:

应用程序 ↓ TCP/IP 协议栈 ↓ Loopback 接口 ↓ TCP/IP 协议栈 ↓ 应用程序

整个过程 完全在内存里完成。

所以延迟极低。

这也是为什么很多程序在做 健康检查 或 本地 API 调用 时,会使用 127.0.0.1。

七、127.0.0.0 和 127.255.255.255 能用吗?

理论上来说:

127.0.0.0 127.255.255.255

也在 127/8 里。

但按照传统 IP 规则:

.0 常被当作 网络地址.255 常被当作 广播地址

虽然在 Loopback 网络里广播其实没有意义,但很多系统仍然保留了这个规则。

所以在实际使用中,人们一般使用:

127.0.0.1 127.0.0.2 127.0.1.1

这些地址。

在开发环境中,有时候需要 模拟多台服务器。

但手里只有一台电脑。

于是很多开发者会这么做:

在 /etc/hosts 里写:

127.0.0.1 server1 127.0.0.2 server2 127.0.0.3 server3

然后启动不同服务:

server1:8080 server2:8080 server3:8080

这样一台机器就能模拟出 一个小型集群环境。

虽然所有流量都在本机,但对于程序来说:

它们像是在和不同服务器通信。

这种技巧在:

分布式系统开发微服务测试网络实验

里都曾经被用过。

从今天回头看 TCP/IP 的很多设计,你会发现一件事情:

很多机制 简单到令人惊讶,但又极其强大。

Loopback 网络就是其中之一。

只用一个网段:

127.0.0.0/8

就解决了很多问题:

本机网络测试协议栈验证应用通信开发调试服务隔离

甚至在网络设备里也有类似概念。

比如路由器里的 Loopback Interface。

网络工程师经常会配置:

Loopback0 10.0.0.1/32

因为 Loopback 接口有一个重要特性:

只要设备还在运行,它就永远不会 Down。

所以很多协议都会使用它作为:

Router IDBGP 邻居地址OSPF 标识

虽然实现方式不同,但思想是类似的:

给系统一个稳定、永远存在的地址。