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 配置来调整。