在网络开发与运维的过程中,localhost与127.0.0.1是经常出现的两个概念,常被认为是等价的。然而,尽管localhost和127.0.0.1在大部分情况下都能实现类似的功能,即访问本机资源,两者之间却存在关键差异。localhost 是一个指向本地计算机的域名,而127.0.0.1则是一个标准化的IP地址。在DNS解析、系统配置和性能上,两者具有不同的工作方式和适用场景。更深层理解localhost和127.0.0.1的区别,有助于我们在网络开发和配置中做出更合理的选择,提升系统的稳定性与安全性。
当前端开发人员在本地调试时
通常,他们会与 localhost 进行交互,只需运行 npm run 即可在浏览器中打开网页,地址栏中显示类似 http://localhost:xxx/index.html 的内容。
许多人在使用它时可能并不会去思考其中的差异。
考虑到我过去与开发人员合作时,他们也对其差别不太清楚,因此我觉得有必要普及一些知识。
什么是 localhost?
localhost 是一个域名,本质上与用于访问互联网的域名没有不同,只不过它易于记忆。
localhost 的范围仅限于本地计算机——顾名思义,“local”意指本地的事物。
小明和李飞可以在各自的计算机上使用 localhost,而互不干扰,访问各自的页面内容。
从域名到程序
为了真正理解 localhost,我们需要讨论用户如何通过域名访问程序,以 Google 为例。
1. 当在浏览器中输入 google.com 时,首先会查询 DNS 以获取 google.com 的 IP 地址。
为什么是 IP 地址呢?打个比方,如果有人给你公司送包裹,快递单上会包含公司的地址、名称和收件人等信息。快递过程中主要依赖地址进行派送,最终送达收件人。类似地,在网络中,域名就像公司名称,而 IP 地址则类似于实际地址。在网络世界中,IP 地址是定位相应程序的关键。
DNS 就像公司目录,列出每个域名对应的 IP 地址。有些域名可能未注册,导致无法找到其 IP 地址;而另一些域名可能有多个 IP 地址,DNS 会根据一定规则自动返回其中一个。购买域名后,域名服务提供商通常提供 DNS 解析服务,将域名及其对应的 IP 地址登记在 DNS 中。
IP 地址从何而来?每台联网的计算机都有一个 IP 地址,但个人计算机的 IP 通常不适合公开访问,类似于公司内部的地址,内部人员清楚,但外部人员不清楚。对于像 Google 提供的外部服务,则需要一个公网 IP 地址,通常由互联网服务提供商提供。例如,如果你的公司使用中国联通接入互联网,可以让他们为公司的网关服务器分配一个公网 IP 地址。网关服务器就像总机一样,处理所有内部网络的通信,并设置转发规则,将外部请求路由到相应的服务器上。
2. 获取 IP 地址后,浏览器向该地址发送请求,操作系统将其封装为 IP 数据包,然后通过网络传输。网络中的路由协议会根据提供的 IP 地址,通过各个路由器,最终到达绑定该 IP 的计算机。
3. 一台计算机上可能部署了多个网络应用。哪个应用应该接收请求呢?此时端口便派上用场了。每个网络应用可以绑定一个或多个端口,系统防止端口重复。请求中指定的端口将请求路由至正确的网络应用。
但是访问 Google 时,我们并未指定端口,这是因为默认端口为 80(HTTP)或 443(HTTPS),当未指定端口时便会使用这两个端口。启动网络程序时必须绑定端口,尽管一些框架会自动选择计算机上未占用的端口。
localhost 与 127.0.0.1 的区别是什么?
了解了上述基础知识后,我们可以轻松理解这一问题。
localhost 是一个域名,如前所述。
那么 127.0.0.1 呢?它是一个 IP 地址,是本机的本地 IP 地址,仅可在本机上使用。你的计算机可以使用此 IP 地址而无需连接互联网,这对开发和测试网络程序很方便。我们调试的程序就绑定在此 IP 地址上。
值得注意的是,我们常见的 IP 地址格式为 X.X.X.X,由点分隔为四部分。实际上,它是一个 32 位的二进制数,被分为四个 8 位的部分,然后转换为十进制数进行显示。
那么 localhost 是如何解析为 127.0.0.1 的?它是通过 DNS 吗?并不是。每台计算机都可以使用 localhost 和 127.0.0.1 而无需 DNS 解析。
这种解析由每台计算机独立处理。每台计算机上都有一个 hosts 文件,其中包含一些硬编码的 DNS 解析规则,包括将 localhost 解析为 127.0.0.1 的规则,这是一种约定。
如果你不想使用 localhost,也可以。你可以将它命名为任意名称,比如 wodehost,并解析到 127.0.0.1。
甚至可以使用 google.com,但仅限于你个人使用,不会影响他人。
域名层级结构
localhost 不太像我们通常使用的域名,例如 www.juejin.cn、google.com 或 csdn.net。那么,www、cn、com 和 net 各自的含义是什么?为什么 localhost 不需要这些部分呢?
域名是分层的,通常分为顶级域名(TLD)、二级域名(SLD)和三级域名(3LD)等…
顶级域名(TLD): 这是域名系统中的最高层级,位于域名的最右边,通常由几个字母组成。顶级域名分为通用顶级域名和国家代码顶级域名。常见的通用顶级域名有 .com(用于商业企业)、.net(用于网络提供商)和 .org(用于非营利组织),而国家代码顶级域名代表特定国家或地区,例如 .cn 表示中国,.uk 表示英国。
二级域名(SLD): 位于顶级域名的下一级,由注册人选择并注册,可以是个性化且易记的名称。例如,juejin.cn 就是一个二级域名,这是我们通常可以申请的域名级别。顶级域名如 .com、.net 或 .cn 的意义通常被简化以提升域名的简洁性和可记忆性。
三级域名(3LD): 位于二级域名之下,通常用于指向特定服务器或子网。例如,在 blog.example.com 中,“blog”就是一个三级域名。“www”是最常见的三级域名,表示网站主页或主站点,但这只是约定俗成的做法,许多网站现在建议直接通过二级域名访问。
从这个定义来看,我们可以将 localhost 看作一个顶级域名,尽管它是保留的,专用于访问当前计算机。
多个网站共享一个 IP 和端口
如前所述,不同的网络程序不能使用相同的端口,但有一些方法可以绕过这一限制。
在个人博客流行的时候,许多人更喜欢购买虚拟主机并部署开源博客平台来表达自己。为了盈利,虚拟主机提供商会在一台计算机上分配多个虚拟主机,使每个人都可以使用默认的80端口访问自己域名而不发生冲突。这是如何做到的呢?
如果你熟悉 Nginx、Apache 或 IIS 等 Web 服务器,可能对“主机头”概念有所了解。主机头实际上是域名。通过设置主机头,我们的程序可以共享同一个网络端口。
当我们在 Nginx 等 Web 服务器中部署网站时,配置文件中会包含主机头的域名信息。
启动后,Nginx 和其他 Web 服务器会占用端口 80。
当网站请求到达 Nginx 的端口 80 时,Nginx 会根据请求中的域名信息,找到对应的网络程序,将请求转发到相应的网络程序并启动该程序(如果必要)。
私有 IP 地址
除了 127.0.0.1,还有许多私有 IP 地址,例如常见的 192.168.x.x。这些私有 IP 地址主要供局域网(LAN)使用,因为为每台计算机分配一个唯一的 IP 地址是不现实的。只要局域网内不发生冲突,这些地址就可以自由使用。你的公司可以使用 192.168.1.1,而我的公司也可以使用 192.168.1.1,但如果你想访问我的网络,就需要通过公网 IP 地址。
常用的 IPv4 私有 IP 地址范围分为三类:
- A 类:从 10.0.0.0 到 10.255.255.255
- B 类:从 172.16.0.0 到 172.31.255.255
- C 类:从 192.168.0.0 到 192.168.255.255
这些私有 IP 地址仅供内部网络使用,无法在公网使用。
除了上述三类私有 IPv4 地址范围,还有一些保留的 IPv4 地址范围:
- 127.0.0.0 到 127.255.255.255 地址范围用于环回测试,包括问题中提到的 127.0.0.1 地址。你也可以给自己分配一个类似 127.0.0.2 的 IP 地址,其功能与 127.0.0.1 一样。
- 169.254.0.0 到 169.254.255.255 地址范围用于本地网络。这种情况不太常见;如果你的计算机无法连接到局域网,可能会看到该 IP 地址,暂时充当局域网地址。
这些地址范围也无法在公网使用。
此外还有一些不太常见的专用 IPv4 地址范围。IP 地址范围的完整定义可参见:www.iana.org/assignments…
IPv6
你可能也听说过 IPv6,这是由于 IPv4 地址空间不足而引入的,因为 IPv4 地址数量有限。IPv6 理论上可以为地球上的每一粒沙子分配一个 IP 地址。尽管 IPv6 被讨论了很多年,但 IPv4 仍然更为广泛使用。原因很多,这里不做深入探讨。
一个 IPv6 地址的格式为:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
。它是128位长的,由冒号分隔为8个段,其中每个 X 表示一个十六进制数字(范围从 0 到 F)。IPv6 的地址空间远大于 IPv4,例如 2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b 是一个有效的 IPv6 地址。
结论:
localhost与127.0.0.1在本地网络访问中的共同特性使它们常被视为同义词,但从网络协议的角度分析,两者有本质差异。localhost通过操作系统的DNS解析来实现,而127.0.0.1作为IPv4协议标准中定义的环回地址,直接指向本机IP。这意味着在某些网络和系统环境中,localhost可能会因DNS配置或网络故障而无法解析,而127.0.0.1通常能够绕过这些问题直接访问本机服务。此外,localhost支持IPv6解析,将解析为::1(IPv6环回地址),这为未来的IPv6环境下的本机访问提供了支持。理解并合理使用localhost与127.0.0.1,不仅有助于优化本地开发的调试体验,还能确保在复杂网络环境中本机服务的稳定连接。