前端开发人员在本地调试时,经常与localhost进行交互,只需运行npm run即可在浏览器中打开他们的网页,地址栏中显示类似http://localhost:xxx/index.html的内容。
许多人可能会使用它而不去思考两者之间的区别。
考虑到我过去与开发人员的合作,他们也对他们之间的差异缺乏清晰的了解,我认为传播一些有关这个主题的知识是必要的。
什么是 localhost?
localhost是一个域名,本质上跟上网的域名没什么区别,只是容易记住而已。
localhost 的范围仅限于本地机器——其名称明确表示:“local”指的是本地范围内的某物。
John Smith 和 Jane Doe 都可以在各自的机器上使用 localhost 访问各自的页面内容,互不干扰。
从域名到程序
要真正理解localhost,我们需要讨论用户如何通过域名访问程序,
以谷歌为例。
1. 在浏览器中输入 google.com 后,它首先向 DNS 查询 google.com 的 IP 地址。
为什么是 IP 地址?打个比方,如果有人给你的公司寄包裹,包裹单上会写明公司的地址、名称、收件人等信息。包裹的运送过程依靠地址进行路由,最终到达收件人手中。同样,在网络中,域名就像公司名称,而 IP 地址就像物理地址。在网络世界中,IP 地址对于定位相应的程序至关重要。
DNS 就像公司目录一样,列出了每个域名对应的 IP 地址。有些域名可能未注册,因此无法找到其 IP 地址,而其他域名可能有多个 IP 地址,DNS 会根据某些规则自动返回一个 IP 地址。购买域名后,域名服务提供商通常会提供 DNS 解析服务,在 DNS 中注册域名及其对应的 IP 地址。
IP 地址从何而来?每台在线计算机都有一个 IP 地址,但个人计算机 IP 通常不适合公开访问,类似于公司内部位置,内部人员可以知道但外部人员不知道。对于像谷歌提供的服务,需要一个公共 IP 地址,通常由互联网服务提供商提供。例如,如果您的公司使用中国联通上网,您可以让他们为您公司的网关服务器分配一个公共 IP 地址。网关服务器就像一个交换机,处理所有内部网络通信,并设置转发规则以将传入请求路由到适当的服务器。
2. 浏览器获得 IP 地址后,向该地址发送请求,由操作系统打包成 IP 数据包,在网络上传输,网络的路由协议根据提供的 IP 地址,经过各种路由器,最终到达绑定该 IP 的计算机。
3. 一台计算机上可能部署了多个网络应用程序。哪一个应该接收请求?这时端口就派上用场了。每个网络应用程序可以绑定到一个或多个端口,系统会防止重叠。在请求中指定端口会将其路由到正确的网络应用程序。
但是我们访问 Google 时,并没有指定端口,因为如果没有指定端口,就会使用默认端口,HTTP 端口 80,HTTPS 端口 443。启动网络程序时,绑定端口是必须的,不过有些框架会自动选择电脑上未使用的端口。
localhost 和 127.0.0.1 之间有什么区别?
有了上面的基础知识,我们可以轻松地理解这个问题。
如前所述,localhost 是一个域名。
那127.0.0.1呢?它是一个IP地址,当前机器的本地IP地址,只能在本机使用。你的电脑可以在不连接互联网的情况下使用这个IP地址,方便开发和测试网络程序。我们调试的程序都是和这个IP地址绑定的。
值得注意的是,我们常见的 IP 地址格式为 XXXX,以点号分隔为四段,其实它是一个 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):由注册人选择和注册的 TLD 之下的一级域名,可以是个性化且容易记住的名称。例如,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.xx 这些私有 IP 地址大多是局域网络内部使用的,因为不可能给每台电脑分配一个唯一的 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 地址。您还可以为自己分配一个 IP 地址,如 127.0.0.2,其功能与 127.0.0.1 相同。
169.254.0.0 至 169.254.255.255 地址范围用于本地网络。这种情况不常见;如果您的计算机无法连接到 LAN,您可能会看到此 IP 地址,该地址被临时分配为 LAN 地址。
这些地址范围也不能在公共互联网上使用。
还有一些不太常见的专用 IPv4 地址范围。IP 地址范围的完整定义可在此处找到:www.iana.org/assignments…
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 地址。
有关 IPv6 的进一步讨论超出了本文的范围,但感兴趣的人可以进一步探索。
原文始发于微信公众号(Ots安全):localhost 和 127.0.0.1 之间有什么区别?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论