Localhost 和 127.0.0.1之间的区别
当我们在进行前端开发时,通常会与 localhost 进行交互,在我们执行
npm run
或者yarn start
时,会启动一个本地服务器,在浏览器中打开时地址栏会显示http://localhost:xxx/index.html
的内容,那么他们两者间有什么区别呢?
什么是 localhost?
localhost
是一个域名(除了好记以外,它和其它域名没有什么区别),它指向的是本地主机,也就是你的计算机。其使用范围仅限于本地,不会被路由器转发到外网,所以只能在本地访问。
比如:当A和B同时访问localhost
,A访问的是自己的本地主机,B访问的是自己的本地主机,他们之间是没有任何关系的。
如何通过域名访问到程序(应用)的?(DNS解析)
为了深入理解
localhost
,我们需要讨论下用户是如何通过域名访问到程序(应用)的。
我们使用百度作为一个例子。
- 用户在浏览器中输入
www.baidu.com
,浏览器会向DNS服务器请求解析域名www.baidu.com
对应的IP地址。
- 为什么需要 IP 地址?打个比方,如果有人向你的公司寄送包裹,快递单上会包括公司地址、姓名和收件人等详细信息。投递过程依靠地址进行路由选择,最终到达收件人手中。同样,在网络中,域名就像公司名称,而 IP 地址就像物理地址。在网络世界中,IP 地址对于找到相应的程序至关重要。
- DNS 就像一个公司目录,列出每个域名对应的 IP 地址。有些域名可能没有注册,因此无法找到其 IP 地址,而有些域名可能有多个 IP 地址,DNS 会根据某些规则自动返回其中一个。购买域名后,域名服务提供商通常会提供 DNS 解析服务,在 DNS 中注册域名及其对应的 IP 地址。
- IP 地址从何而来?每台上网电脑都有一个 IP 地址,但个人电脑的 IP 地址一般不适合公开访问,就像公司的内部位置一样,内部人清楚但外人不清楚。对于像百度提供的外部服务,则需要一个公共 IP 地址,通常由互联网服务提供商提供。例如,如果贵公司使用中国联通上网,可以让他们为贵公司的网关服务器分配一个公共 IP 地址。网关服务器就像一个交换机,处理所有内部网络通信,并设置转发规则,将传入的请求路由到相应的服务器。
- 有了 IP 地址,浏览器就可以向该地址发送请求,由操作系统打包成一个 IP 数据包,然后通过网络传输。网络路由协议根据提供的 IP 地址,通过各种路由器,最终到达绑定到该 IP 的计算机。
- 一台计算机上可能部署了多个网络应用程序。哪个应用程序应该接收请求?这就是端口发挥作用的地方。每个网络应用程序都可以绑定到一个或多个端口,系统会防止端口重叠。在请求中指定一个端口,就能将其路由到正确的网络应用程序。
localhost 和 127.0.0.1 之间的区别是什么?
localhost 是一个域名,指向的是本地主机,也就是你的计算机。
127.0.0.1 是一个 IP 地址,指向的是本地主机,只能在计算机本身使用。你的电脑可以使用这个 IP 地址,而无需连接到互联网,这对于开发和测试网络程序非常方便。我们调试的程序就绑定在这个 IP 地址上。
值得注意的是,我们常见的 IP 地址格式为 X.X.X.X,用点分为四段。实际上,它是一个 32 位二进制数,分为四个 8 位段,然后转换成十进制数显示。
那么 localhost 如何解析为 127.0.0.1?是通过 DNS 吗?不需要。每台计算机都可以使用 localhost 和 127.0.0.1,无需 DNS 解析。
这种解析由每台计算机单独处理。每台计算机上都有一个主机文件,其中包含一些硬编码的 DNS 解析规则,包括将 localhost 解析到 127.0.0.1 的规则,这是一种约定俗成的做法。
如果你不想使用 localhost,也没关系。你可以给它起任何名字,比如 kunhost,然后解析到 127.0.0.1。
你甚至可以使用 baidu.com,但这只能供你自己使用,不会影响其他人。
域名的层次结构
域名是一个层次结构,从右到左,每一级域名都是下一级域名的父域名,大致分为顶级域 (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.1
功能相同的 IP 地址,如127.0.0.2
。169.254.0.0
至169.254.255.255
地址范围用于本地网络。这种情况比较少见;如果你的电脑无法连接到局域网,你可能会看到这个临时分配为局域网地址的 IP 地址。
这些地址范围也不能在公共互联网上使用。