localhost和127.0.0.1到底啥区别
-
目录
一、先搞懂:localhost和 127.0.0.1 到底是啥?
1.
127.0.0.1
—— 实实在在的 “数字地址”在我看来,
127.0.0.1
就像是电脑里一个固定的 “数字门牌号”。它是IPv4 地址
中专门保留给本机回环测试
的地址,属于A 类地址
(范围1.0.0.0 - 126.255.255.255
,127 网段特殊保留)。
你可以把电脑想象成一栋房子,127.0.0.1
就是这栋房子里一个专门用于 “内部沟通” 的房间号。当我在浏览器里输入127.0.0.1
,或者在命令行里ping 127.0.0.1
时,信号不会跑到外面的互联网,而是直接在电脑内部循环传输。[示意1:127.0.0.1 的传输路径]
我的操作(如ping 127.0.0.1) ↓ 电脑的网络协议栈(处理网络请求的“中转站”) ↓ 直接指向本机(不经过网卡、路由器等外部设备) ↓ 返回响应(告诉我们本机网络协议栈正常)
比如有一次,我怀疑自己电脑的网络协议栈出了问题,就打开命令提示符,输入
ping 127.0.0.1
。如果出现来自 127.0.0.1 的回复:字节 = 32 时间 < 1ms TTL=128”
这样的信息,就说明电脑内部的网络协议栈是正常的;要是出现超时,那大概率是协议栈出了故障,得赶紧排查。2.
localhost
—— 方便记忆的 “别名”localhost
则更像是127.0.0.1
的 “外号”,是一个域名。它存在的意义就是为了方便我们记忆和使用,毕竟比起一串数字,localhost”
这几个字母更容易记住。
不过,localhost
和127.0.0.1
也不是完全绑定的。在电脑的 hosts 文件(Windows 系统在C:\Windows\System32\drivers\etc\hosts
,Linux 和 macOS 在/etc/hosts
)里,我们可以修改localhost对应的 IP 地址。比如我曾经为了测试某个本地服务,就把localhost
指向了 192.168.1.100(我电脑在局域网里的 IP),不过一般情况下,默认都是指向127.0.0.1
的。[示意2:localhost与 IP 的对应关系(默认情况)]
localhost(域名) ↓ 查询hosts文件(系统首先查找的“地址簿”) ↓ 找到对应记录:127.0.0.1 localhost ↓ 指向127.0.0.1(最终还是落到这个数字地址上)
举个例子,我在本地搭建了一个网站,用
localhost:8080
就能访问,和用127.0.0.1:8080
访问的效果是一样的。但如果我修改了 hosts 文件,把localhost
指向了其他 IP,那再用localhost
访问就会指向新的 IP 了。
二、核心区别:从使用和原理上看不同
1. 类型不同
这是最根本的区别。
127.0.0.1
是IP地址,是网络中设备的数字标识,直接对应网络层的地址;而localhost
是域名,属于应用层的概念,需要通过域名解析(先查 hosts 文件,再查 DNS 服务器,这里默认查 hosts)才能对应到具体的 IP 地址。
就像我家的地址,“XX 市 XX 区 XX 路 123 号” 是类似 IP 地址的具体位置,而 “我家” 就是类似localhost
的别名,别人问我去哪,我说 “去我家”,大家都知道是那个具体地址,但 “我家” 本身不是一个具体的位置标识。2. 解析方式不同
当我使用
127.0.0.1
时,电脑不需要进行域名解析,直接就能识别这是本机的回环地址,直接进行内部通信;而使用localhost
时,电脑首先会去查hosts
文件,看里面有没有localhost
对应的 IP 地址,如果有,就直接用对应的 IP;如果没有,才会去请求 DNS 服务器进行解析(不过默认情况下 hosts 文件里都会有localhost
对应127.0.0.1
的记录)。
曾经我在测试一个本地程序时,发现用localhost
访问很慢,用127.0.0.1
访问却很快。后来排查才发现,我之前不小心在 hosts 文件里给localhost加了其他解析记录,导致电脑在解析localhost
时多走了几步流程,速度就慢了。把 hosts 文件恢复默认后,两者访问速度就一样了。3. 权限和使用场景的细微差异
在一些特殊场景下,两者的权限和使用会有细微不同。比如在某些操作系统的安全策略中,localhost可能会有更严格的访问控制;还有在一些编程框架里,使用
localhost
和127.0.0.1
可能会有不同的默认配置。
比如我用 Java 的 Tomcat 服务器时,默认配置下,localhos
只能本机访问,而如果绑定的是0.0.0.0
(代表所有网卡的 IP),其他设备才能访问。但如果我把 Tomcat 绑定到127.0.0.1
,和绑定到localhost
的效果是一样的,都只能本机访问。不过如果我修改了localhost
对应的 IP,那绑定localhost和绑定127.0.0.1
的效果就不一样了。
三、实际应用:我在工作和生活中怎么用它们?
1. 本地服务测试 —— 最常用的场景
作为一个程序员,我经常需要在本地搭建各种服务,比如 Web 服务器、数据库服务等,这时候
localhost
和127.0.0.1
就派上大用场了。
比如我用 Python 的 Flask 框架写了一个简单的 Web 接口,运行起来后,控制台会提示Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
,这时候我在浏览器里输入http://localhost:5000/
或者http://127.0.0.1:5000/
,都能访问到这个接口,测试接口是否能正常返回数据。
再比如我本地安装了 MySQL 数据库,默认情况下,数据库服务会监听127.0.0.1
的 3306 端口。我在本地用 Navicat 连接数据库时,主机地址填localhost
或者127.0.0.1
,端口填 3306,再输入用户名和密码,就能连接到本地的 MySQL 数据库,进行建表、查询数据等操作。[示意3:本地 Web 服务访问流程]
我写的Flask程序(运行在本地,端口5000) ↓ 监听127.0.0.1:5000(等待请求) ↓ 我在浏览器输入localhost:5000或127.0.0.1:5000 ↓ 请求在本机内部传输,到达Flask程序 ↓ 程序返回响应,浏览器显示页面
2. 网络故障排查 —— 判断问题出在哪
前面也提到过,ping
127.0.0.1
可以用来测试本机的网络协议栈是否正常。除此之外,结合localhost
和127.0.0.1
,还能排查更多网络问题。
比如有一次,我在本地搭建了一个 Nginx 服务器,想通过localhost:80
访问,但一直访问不了。我先ping 127.0.0.1
,发现能 ping 通,说明本机协议栈没问题;然后我又ping localhost
,也能 ping 通,说明 hosts 文件里localhost
的解析是正常的。那问题可能出在 Nginx 的配置上,我去查 Nginx 的配置文件,发现端口号写错了,改成 80 后,再用localhost
访问就正常了。
还有一次,我发现用localhost
能访问本地服务,但用127.0.0.1
却访问不了。这时候我就怀疑是 hosts 文件被修改了,打开 hosts 文件一看,果然localhost
被指向了其他 IP,把记录改回127.0.0.1 localhost
后,127.0.0.1
就能正常访问了。3. 开发环境配置 —— 灵活适配需求
在开发过程中,有时候需要根据不同的环境配置不同的地址。比如我开发一个前端项目,本地开发时,接口请求需要指向本地的后端服务,这时候我就会在前端的配置文件里把接口基础地址设为
http://localhost:8080/api
,这样在本地运行前端项目时,请求就会发送到本地的后端服务。
当项目要部署到测试环境时,再把接口基础地址改成测试环境的服务器地址,比如http://test-server:8080/api
。这种配置方式很灵活,不用修改代码,只改配置文件就能适配不同的环境。
还有在 Docker 容器部署时,有时候容器内部需要访问宿主机的服务,这时候在容器里用localhost是访问不到宿主机服务的(因为容器里的localhost指的是容器本身),这时候就需要用宿主机在局域网里的 IP,或者在某些情况下,用127.0.0.1
的特殊配置(比如 Docker 的 host 网络模式)来访问宿主机的服务。不过这属于比较复杂的场景,需要根据具体的 Docker 配置来调整。