在进行前端开发时,我们经常使用localhost
,只需运行npm run
就能在浏览器中打开网页,地址栏显示类似于http://localhost:xxx/index.html
,但是很多人并不了解更深层次的原理,不知道 localhost 与 127.0.0.1 到底有什么区别。
了解localhost是什么?
localhost
是一个域名,从本质上来说和用于互联网访问的域名没有太大不同,只是更容易记忆。
localhost
的范围仅限于本地机器,其名称清楚地表明:“local”指的是在本地范围内的东西。
我们都可以在各自的机器上使用localhost
,而互不干扰,访问各自的页面内容。
从域名到程序
为了真正理解localhost
,我们需要讨论用户通过域名访问程序的方式,以谷歌为例。
-
在浏览器中输入
google.com
,首先会查询DNS获取google.com
的IP地址。为什么需要IP地址?类比一下,如果有人向你的公司发送一个包裹,交付单上会包括公司的地址、名称和收件人等详细信息。交付的过程依赖于地址进行路由,最终到达收件人。类似地,在网络中,域名就像公司名称,而IP地址就像物理地址。在网络世界中,IP地址对于定位相应的程序至关重要。
DNS就像公司目录,列出了每个域名对应的IP地址。一些域名可能没有注册,导致它们的IP地址无法找到,而其他域名可能有多个IP地址,DNS会根据某些规则自动返回其中一个。购买域名后,域名服务提供商通常提供DNS解析服务,将域名及其对应的IP地址在DNS中注册。
-
有了IP地址,浏览器向这个地址发送请求,操作系统将其打包成IP数据包,然后通过网络传输。基于提供的IP地址以及通过各种路由器提供的网络路由协议,最终到达绑定到该IP的计算机。
-
一台计算机上可能部署了多个网络应用程序。哪个应用程序应该接收请求?这就是端口发挥作用的地方。每个网络应用程序可以绑定一个或多个端口,防止系统重叠。在请求中指定端口,可以将其路由到正确的网络应用程序。
但是当我们访问谷歌时,并没有指定端口。这是因为当没有指定时,使用默认端口,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
。
这个解析是由每台计算机独立处理的。每台计算机上都有一个主机文件,其中包含一些硬编码的DNS解析规则,包括将localhost
解析为127.0.0.1
的规则,这是一种约定。
如果你不喜欢使用localhost
,那也没关系。你可以将它命名为任何你喜欢的名称,比如myhost
,并将其解析为127.0.0.1
。
你甚至可以使用google.com
,但那只能给你自己使用,不会影响其他人。
域名层次结构
localhost
并不完全类似于我们通常使用的域名,比如www.juejin.cn
、google.com
或csdn.net
。www
、cn
、com
和net
是什么意思?为什么localhost
不需要它们?
域名是分层次的,分为顶级域(TLD)、二级域(SLD)和三级域(3LD):
-
顶级域(TLD): 位于域名系统的最高级,通常由几个字母组成,位于域名的最右侧。TLD分为通用TLD和国家代码TLD,常见的通用TLD包括
.com
(商业企业)、.net
(网络提供商)和.org
(非营利组织),而国家代码TLD表示特定的国家或地区,如.cn
代表中国,.uk
代表英国。 -
二级域(SLD): 位于TLD的下一级,由注册者选择和注册,可以是个性化和易记的名称。例如,
juejin.cn
就是一个二级域,通常我们可以申请到。 -
三级域(3LD): 位于二级域的下一级,通常用于指向特定的服务器或子网。在
blog.example.com
中,“blog”就是一个三级域。而“www”是最常见的三级域,表示网站的主页或主站点,尽管这只是一种约定,现在许多站点建议直接通过二级域进行访问。
通过这个定义,我们可以将localhost
视为一个顶级域,尽管是一个保留的顶级域,仅用于访问当前计算机。
多个网站共享一个IP和端口
正如前面提到的,不同的网络程序不能使用相同的端口,但有方法可以规避这个问题。
在个人博客流行的时候,许多人喜欢购买虚拟主机并部署开源博客平台来表达自己的想法。为了赚钱,虚拟主机提供商会在一台计算机上分配许多虚拟主机,允许每个人都可以使用默认的端口80访问他们的域名,而不会有任何问题。这是怎么可能的呢?
如果你对Nginx、Apache或IIS等web服务器有经验,可能会熟悉主机头的概念。主机头本质上是一个域名。通过设置主机头,我们的程序可以共享一个网络端口。
在启动时,Nginx和其他web服务器将端口80独占为自己使用。
当网站请求到达Nginx的端口80时,它根据请求中的域名(主机头中的域名)识别出相应的网络程序,然后将请求转发给该网络程序。
私有IP地址
除了127.0.0.1
之外,还有许多私有IP地址,比如常见的192.168.x.x
。这些私有IP地址主要保留在局域网(LAN)中使用,因为为每台计算机分配唯一的IP地址是不可行的。只要在LAN中没有冲突,这些地址就可以自由使用。你的公司可以使用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
地址范围用于局域网内部。这种情况比较少见,如果你的计算机无法连接到LAN,你可能会看到这个IP地址,这是暂时分配的LAN地址。
这些地址范围也不能在公共互联网上使用。
还有一些较不常见的专用IPv4地址范围。有关IP地址范围的完整定义可以在IANA网站[1]上找到。
IPv6
你可能也听说过IPv6,由于IPv4地址空间不足,IPv6被引入,理论上可以为地球上的每一粒沙子分配一个IP地址。尽管多年来一直在讨论,但IPv4仍然更广泛地使用。
IPv6地址的格式为XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
。它有128位长,由冒号分隔成8段,其中每个X代表一个十六进制数(从0到F)。IPv6的地址空间比IPv4大得多。例如,2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b
就是一个有效的IPv6地址。