彻底搞懂 localhost 与 127.0.0.1 的区别
在日常的开发工作中,无论是前端还是后端,开发者几乎每天都会在终端控制台中看到 `localhost`。当我们执行 `npm run dev` 并在浏览器中访问 `http://localhost:3000` 时,页面总能如期展现。这一切似乎理所当然,但背后其实隐藏着诸多值得深究的问题。
例如,`localhost` 究竟是什么?它和 `127.0.0.1` 完全等同吗?为何在断网状态下它依然能正常访问?端口号又起着什么作用?当系统内运行多项服务时,请求是如何被精准路由的?
平时写代码时或许无需在意,但在面对接口不通、端口冲突、容器网络隔离或移动端真机调试等场景时,掌握这些基础网络概念就显得尤为关键。
### localhost 的本质是一个域名
结论是:`localhost` 本质上是一个特殊域名,专门用于指向“当前设备”。你电脑上的 `localhost` 指向你自己的电脑,同事电脑上的 `localhost` 指向他的电脑。就像我们在各自家中说“我家”一样,它始终代表当前设备的视角。
### 域名、IP 与端口的作用
理解 `localhost`,可以从常规域名的解析过程入手。当我们在浏览器输入网址时,计算机并不能直接理解这些字母,而是需要通过 DNS(类似于互联网的电话簿)查询对应的 IP 地址。拿到 IP 后,数据包才会被层层路由至目标服务器。
到达服务器后,还需依靠“端口”来区分不同的应用程序。如果把 IP 比作大楼的地址,端口就是大楼里的房间号。访问 `http://localhost:3000` 时,`localhost` 负责定位到本机,而 `3000` 负责找到本机上正在监听该端口的程序。
此外,浏览器通常会默认隐藏标准端口:HTTP 默认使用 `80` 端口,HTTPS 默认使用 `443`。
### 回环地址与本地解析
现在可以清晰区分 `localhost` 与 `127.0.0.1` 了:
- **`localhost`**:一个域名。
- **`127.0.0.1`**:一个 IP 地址,更确切地说是本机的 IPv4 回环地址。
发送给 `127.0.0.1` 的数据包不会经过外部网卡或路由器,而是通过系统内部通道直接折返处理,因此拔掉网线依然可以正常访问。
当浏览器遇到 `localhost` 时,通常不需要进行外部 DNS 查询。操作系统的本地 `hosts` 文件会优先接管解析。大部分系统中都会内置 `127.0.0.1 localhost` 的映射记录。用户甚至可以自定义添加诸如 `127.0.0.1 myapp`,此后访问 `http://myapp:3000` 也能达到相同效果。
**注意:** 在支持 IPv6 的现代系统中,`localhost` 也可能被解析为 `::1`(IPv6 版的回环地址)。如果某个服务仅监听了 IPv4 而未监听 IPv6,可能会出现 `127.0.0.1` 能访问而 `localhost` 访问失败的状况。
另外,`localhost` 是系统保留的本机标识符,不属于 `.com` 或 `.net` 等常规层级结构的域名。
### 同一 IP 与端口跑多个服务:反向代理
理解上述概念后,本地开发的逻辑就很清晰了。不同项目通过不同端口(如 `3000`、`5173`)进行监听,系统就能准确分发请求。
那同一 IP 和同一端口能否运行多个网站?答案是肯定的,但需要借助 Nginx 或 Apache 等反向代理服务器。由代理统一接管 `80` 或 `443` 端口的请求,再根据 HTTP 请求头中的 `Host` 字段,将流量精准转发给后台对应的各个服务。这是线上部署极为常用的机制。
### 常见的 IP 地址分类
- **回环地址(127.0.0.1)**:仅限本机内部互通。
- **私有 IP(192.168.x.x、10.x.x.x)**:用于局域网内设备间的互相访问,外网无法直接寻址。
- **公网 IP**:互联网上真正可被路由寻址的地址。家庭路由器通常对外只暴露一个公网 IP。借助 NAT 技术,多台内网设备可以共用该公网 IP 访问互联网。
随着设备数量激增,32 位的 IPv4 地址已面临枯竭。为此引入了 128 位的 IPv6,其本机回环地址为 `::1`。排查网络故障时,需留意服务实际监听的协议版本。
### 总结
`localhost` 是名字,`127.0.0.1` 是地址。名字通过本地 `hosts` 文件被解析为地址。IP 负责找到目标设备,端口负责定位具体的程序。无论本地联调、容器网络还是反向代理部署,万变不离其宗。
例如,`localhost` 究竟是什么?它和 `127.0.0.1` 完全等同吗?为何在断网状态下它依然能正常访问?端口号又起着什么作用?当系统内运行多项服务时,请求是如何被精准路由的?
平时写代码时或许无需在意,但在面对接口不通、端口冲突、容器网络隔离或移动端真机调试等场景时,掌握这些基础网络概念就显得尤为关键。
### localhost 的本质是一个域名
结论是:`localhost` 本质上是一个特殊域名,专门用于指向“当前设备”。你电脑上的 `localhost` 指向你自己的电脑,同事电脑上的 `localhost` 指向他的电脑。就像我们在各自家中说“我家”一样,它始终代表当前设备的视角。
### 域名、IP 与端口的作用
理解 `localhost`,可以从常规域名的解析过程入手。当我们在浏览器输入网址时,计算机并不能直接理解这些字母,而是需要通过 DNS(类似于互联网的电话簿)查询对应的 IP 地址。拿到 IP 后,数据包才会被层层路由至目标服务器。
到达服务器后,还需依靠“端口”来区分不同的应用程序。如果把 IP 比作大楼的地址,端口就是大楼里的房间号。访问 `http://localhost:3000` 时,`localhost` 负责定位到本机,而 `3000` 负责找到本机上正在监听该端口的程序。
此外,浏览器通常会默认隐藏标准端口:HTTP 默认使用 `80` 端口,HTTPS 默认使用 `443`。
### 回环地址与本地解析
现在可以清晰区分 `localhost` 与 `127.0.0.1` 了:
- **`localhost`**:一个域名。
- **`127.0.0.1`**:一个 IP 地址,更确切地说是本机的 IPv4 回环地址。
发送给 `127.0.0.1` 的数据包不会经过外部网卡或路由器,而是通过系统内部通道直接折返处理,因此拔掉网线依然可以正常访问。
当浏览器遇到 `localhost` 时,通常不需要进行外部 DNS 查询。操作系统的本地 `hosts` 文件会优先接管解析。大部分系统中都会内置 `127.0.0.1 localhost` 的映射记录。用户甚至可以自定义添加诸如 `127.0.0.1 myapp`,此后访问 `http://myapp:3000` 也能达到相同效果。
**注意:** 在支持 IPv6 的现代系统中,`localhost` 也可能被解析为 `::1`(IPv6 版的回环地址)。如果某个服务仅监听了 IPv4 而未监听 IPv6,可能会出现 `127.0.0.1` 能访问而 `localhost` 访问失败的状况。
另外,`localhost` 是系统保留的本机标识符,不属于 `.com` 或 `.net` 等常规层级结构的域名。
### 同一 IP 与端口跑多个服务:反向代理
理解上述概念后,本地开发的逻辑就很清晰了。不同项目通过不同端口(如 `3000`、`5173`)进行监听,系统就能准确分发请求。
那同一 IP 和同一端口能否运行多个网站?答案是肯定的,但需要借助 Nginx 或 Apache 等反向代理服务器。由代理统一接管 `80` 或 `443` 端口的请求,再根据 HTTP 请求头中的 `Host` 字段,将流量精准转发给后台对应的各个服务。这是线上部署极为常用的机制。
### 常见的 IP 地址分类
- **回环地址(127.0.0.1)**:仅限本机内部互通。
- **私有 IP(192.168.x.x、10.x.x.x)**:用于局域网内设备间的互相访问,外网无法直接寻址。
- **公网 IP**:互联网上真正可被路由寻址的地址。家庭路由器通常对外只暴露一个公网 IP。借助 NAT 技术,多台内网设备可以共用该公网 IP 访问互联网。
随着设备数量激增,32 位的 IPv4 地址已面临枯竭。为此引入了 128 位的 IPv6,其本机回环地址为 `::1`。排查网络故障时,需留意服务实际监听的协议版本。
### 总结
`localhost` 是名字,`127.0.0.1` 是地址。名字通过本地 `hosts` 文件被解析为地址。IP 负责找到目标设备,端口负责定位具体的程序。无论本地联调、容器网络还是反向代理部署,万变不离其宗。
评论
暂无评论。