计算机网络协议系列 - 网络层 IP 协议篇:域名与 IP 地址是如何映射的

- 1 min

计算机网络协议系列(九)

DNS的引入

根据前面的介绍,通过 IP 地址就可以实现主机之间的连接和通信,对机器来说这没有什么问题,但是对于使用网络的人来说,尤其是普通用户,如果需要输入一串莫名其妙的 IP 地址才能访问对方主机,不仅麻烦,而且难以记忆,因此,就诞生了 DNS。

DNS 是英文名 Domain Name System 的缩写,顾名思义,它是域名管理系统,专门用于将域名解析为对应的 IP 地址。这样一来,我们只需要输入网站的域名,如 laravelacademy.org,底层 DNS 就会帮我们检索与之映射的 IP 地址,拿着这个 IP 地址就可以访问对方主机了,这也是日常我们上网的正常操作方式。

DNS的前身

在 DNS 诞生之前,为了解决主机与 IP 地址的映射,会为每个主机设置一个主机识别码,或者叫主机名,在网络通信时可以直接使用主机名而不是 IP 地址,通过主机名访问对端主机时,底层也会将其转化为对应 IP 地址,而实现这一映射功能的解决方案就是在每个主机存储一个 hosts 文件:

img

在互联网诞生的混沌之初,为了实现与外部网络的连接,互联网信息中心会统一管理一份 hosts 文件,如果网络中新增一台机器或更新已有机器的 IP 地址,需要更新中心的这份 hosts 文件,并且其它计算机要经常定期从中心下载最新的 hosts 文件才能保证网络的畅通。

显然这种方式无法应对日益扩大的网络规模,尤其是现在这种数十亿乃至百亿台设备连接到网络的场景,但是这种方式也没有完全从我们的视野中消失,在局域网内部或者用于测试的本地机器,我们还在使用 hosts 文件存放虚拟域名,以方便本地的开发测试:

127.0.0.1    localhost
255.255.255.255    broadcasthost
127.0.0.1 laravel.test

在浏览器中输入域名发起访问后,系统会先从 hosts 文件中读取记录,如果输入的域名在 hosts 里面做了映射,则直接拿到对应的 IP 地址发起请求,如果没有的话才会启用 DNS 做域名映射。

DNS服务器

在介绍 DNS 服务器之前,我们先来看看域名的组成结构。

以 Laravel为例,域名是 laravelacademy.org,其中 laravelacademy 表示 Laravel的固有域名,org 表示顶级域名,固有域名和顶级域名通过.分隔,有的网站还细分出二级域名,比如腾讯视频的网站是 v.qq.com,我们可以将 v 称作二级域名。

注:域名一般通过在域名服务商那里注册获取,然后域名与 IP 地址的映射也是在域名服务商那里完成。映射之后,就可以通过域名与对应的主机通信了。

DNS 服务器指的是管理域名的主机或软件,它可以管理所在分层的域名信息:

img

每一个分层都设有 DNS 服务器,各层 DNS 服务器都了解该层以下分层中所有 DNS 服务器的 IP 地址,所有 DNS 服务器又都了解根 DNS 服务器的 IP 地址,以便在当前分层找不到映射的 IP 地址时,跳转到根 DNS 服务器从上往下继续查找。

进行 DNS 查询的主机或软件叫做 DNS 解析器,用户所使用的计算机或工作站就属于解析器,一个解析器至少需要注册一个以上 DNS 服务器的 IP 地址,通常,它至少包括组织内部的本地 DNS 服务器的 IP 地址:

img

DNS查询原理

以下是一个 DNS 查询流程图:

img

  1. 用户在浏览器中输入 www.baidu.com 访问百度首页,计算机会先从本地 hosts 文件或 DNS 缓存解析器中查询有无相应的 IP 地址映射记录,如果有的话直接返回,否则进入下一步;
  2. 将域名发给本地 DNS 服务器(通过 DHCP 配置,一般由宽带运营商自动分配)进行查询,如果缓存中有记录则返回对应 IP 地址,否则进入下一步;
  3. 将域名发给根 DNS 服务器进行查询,根 DNS 服务器不会直接解析域名,但是会返回查询域名对应顶级域名 DNS 服务器的 IP 地址,比如这里是 .com
  4. 然后本地 DNS 服务器会到 .com 顶级域名服务器查询,顶级域 DNS 服务器会根据查询域名返回 baidu.com 对应的权威 DNS 服务器的 IP 地址;
  5. 接下来,本地 DNS 服务器根据返回的权威 DNS 服务器的 IP 地址去对应的服务器(域名解析出处)进行查询,这一次就可以获取到 www.baidu.com 域名对应的 IP 地址了,拿到这个 IP 地址,就可以将其返回给对应的计算机。

上述流程走下来,还是很费劲的,所以不管是 DNS 解析器还是 DNS 服务器,都会将最新了解到的信息暂时缓存起来,这样,可以减少每次查询时的性能消耗。

好了,这样下来,你应该对域名与 IP 地址之间是如何映射的很清楚了吧。

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora