localhost 与 127.0.0.1 的区别是什么
当前端开发人员在本地进行调试时,他们通常会与本地主机(localhost)进行交互,只需运行 npm run
命令,即可在浏览器中打开他们的网页,地址栏会显示类似
http://localhost
:xxx/index.html 的内容。
许多人可能会在没有深思两者区别的情况下使用它。
什么是本地主机(localhost)?
本地主机(localhost)是一个域名,本质上与用于互联网访问的域名没有区别,只是更容易记住。
本地主机(localhost)的范围仅限于本地计算机——它的名称已经说明了这一点:“本地”指的是在本地范围内的内容。
约翰・史密斯(John Smith)和简・多伊(Jane Doe)都可以在各自的计算机上使用本地主机(localhost),而不会相互干扰,访问他们各自的页面内容。
从域名到程序
要真正理解本地主机(localhost),我们需要讨论用户如何通过域名访问程序,以谷歌(Google)为例。
当在浏览器中输入
google.com
时,它首先会查询域名系统(DNS)以获取
google.com
的 IP 地址。
为什么需要 IP 地址?打个比方,如果有人向你的公司寄送包裹,快递单上会包含公司的地址、名称和收件人等详细信息。快递过程依赖地址进行路由,最终送达收件人。同样,在网络世界中,域名就像公司名称,而 IP 地址则像实际地址。在网络世界中,IP 地址对于定位相应的程序至关重要。
域名系统(DNS)就像一个公司目录,列出了每个域名对应的 IP 地址。有些域名可能未注册,因此无法找到其 IP 地址,而其他域名可能有多个 IP 地址,DNS 会根据某些规则自动返回其中一个。购买域名后,域名服务提供商通常会提供域名解析服务,将域名及其对应的 IP 地址注册到 DNS 中。
IP 地址从何而来?每台联网的计算机都有一个 IP 地址,但个人计算机的 IP 地址通常不适合公共访问,类似于公司内部的地址,对内部人员来说很清楚,但对外部人员来说则不然。对于像谷歌(Google)这样的外部服务,需要一个公共 IP 地址,通常由互联网服务提供商提供。例如,如果你的公司使用中国联通进行互联网接入,你可以让他们为公司的网关服务器分配一个公共 IP 地址。网关服务器就像一个总机,处理所有内部网络通信,并设置了转发规则,将传入的请求路由到相应的服务器。
有了 IP 地址后,浏览器会向该地址发送请求,由操作系统将请求打包成 IP 数据包,然后通过网络传输。网络的路由协议根据提供的 IP 地址,通过各种路由器,最终到达绑定该 IP 的计算机。
一台计算机上可能部署了多个网络应用程序。那么,哪个程序应该接收请求呢?这就是端口发挥作用的地方。每个网络应用程序可以绑定到一个或多个端口,系统会防止端口重叠。在请求中指定端口可以将其路由到正确的网络应用程序。
但是,当我们访问谷歌(Google)时,并没有指定端口。这是因为当未指定端口时,会使用默认端口,即 HTTP 的 80 端口和 HTTPS 的 443 端口。启动网络程序时,绑定端口是必须的,尽管有些框架会自动选择计算机上未使用的端口。
本地主机(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)解析?不。每台计算机都可以在没有域名系统(DNS)解析的情况下使用本地主机(localhost)和 127.0.0.1。
这种解析由每台计算机单独处理。每台计算机上都有一个 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 等网络服务器的经验,你可能熟悉主机头的概念。主机头实际上就是一个域名。通过设置主机头,我们的程序可以共享一个网络端口。
在 Nginx 等网络服务器上部署网站时,我们会配置包含主机头中的域名。
启动时,Nginx 和其他网络服务器会将 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 地址范围的完整定义可以在这里找到:
https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
