介绍域名
网域名称(英语:Domain Name,简称:Domain),简称域名、网域。
域名是互联网上某一台计算机或计算机组的名称。
域名可以说是一个 IP 地址的代称,目的是为了便于记忆。例如,wikipedia.org 是一个域名。人们可以直接访问 wikipedia.org 来代替 IP 地址,然后 DNS 系统就会将域名转化成便于机器识别的 IP 地址。这样,人们只需要记忆 wikipedia.org 这一串带有特殊含义的字符,而不需要记忆没有含义的数字。
域名的结构
域名由多个部分组成,每个部分由 “.” 点分隔。最右边的一个部分是顶级域名,从右侧到左侧隔一个点依次下降一层。每个部分可以包含 1 到 63 个字节。域名的总长度则不能超过 253 个字节。域名里的英文字母不区分大小写。
整个互联网中的域名空间结构就像一棵倒置的树,如上图所示。
- 这棵域名树的根称为根 DNS 服务器,在 Internet 上总共有 13 个根 DNS 服务器(每个根 DNS 服务器都是一个集群),大部分位于北美。
- 根往下的第一级节点称为顶级域(Top Level Domain,TLD),目前共有 7 个这样的顶级域名,分别是:1.com 商业组织;2.edu 教育机构;3.gov 政府部门;4.mil 军事部门;5.net 网络基础设施;6.org 非营利性组织;7.int 国际组织。每个顶级域由对应的顶级域(TLD)服务器负责管理,除了以上 7 个顶级域名,还有各个国家的顶级域名(如 cn、uk、ca 和 fr 等)也在这一级别进行管理。
- 每个顶级域再向下展开分支,每个分支域都是一个子域。比如 CDNbook.com 是顶级域 com 的子域。CDNbook.com 也可以再包含子域,比如 a.CDNbook.com、b.CDNbook.com。**一个域就是域名空间中的一棵子树。域的名字也就是这棵子树的根节点的域名。**例如在下图中,CDN.com 域的顶端节点就是 CDN.com。
在每个域中,会有一台或多台服务器用来保存这个域名空间的所有信息,并且响应关于该域名空间的所有请求。这种服务器就叫做这个域的权威域名服务器(也常称为授权域名服务器),它拥有这个域所有的域名信息。
每个域都可以分为多个子域,而每个权威域名服务器可以给一个或多个区域进行解析。但即使各个区域被授权给同一个权威域名服务器,它们之间仍然是彼此独立的。例如,CDNbook.com 被划分为三个子域:a.CDNbook.com、b.CDNbook.com 和 c.CDNbook.com。每个子域都可以自行维护自己的权威域名服务器。当一个子域被授权出去,它原本所属的域就不再包含它的数据(A 记录),而只留下一些指针,这些指针指向相应子域的权威域名服务器(NS 记录)。如果有一个询问该子域信息的请求,所返回的应该是该子域的权威域名服务器列表。
一个域可以有多台权威域名服务器,但是只有一台是主域名服务器,这台主域名服务器负责向其他辅域名服务器分发每个域名空间的更新信息。
根 DNS 服务器、顶级 DNS 服务器和权威 DNS 服务器共同组成了 DNS 服务器层,共同维护分布式、层次化的 DNS 数据库。
DNS 系统采用树形设计的一个主要目的就是为了分散管理。而这种分散管理是通过 “授权” 来实现的。对域进行授权,就是域管理组织把子域授权给其他组织进行管理,由子域管理者来维护子域中的数据,可以自由改动数据,包括对子域再进行划分,再授权。
域名解析
域名解析包括正向解析和反向解析。
- 正向解析是把域名转换为 IP 地址。这需要由专门的域名解析服务器来完成。
- 反向解析是把 IP 地址转换为域名。反向解析比较罕见,.arpa 顶级域名专门用于这类用途。
本地 DNS 服务器收到客户端的域名解析请求后,会采用递归查询方式(recursive query)或者迭代查询方式(iterative query)向 DNS 系统中的其他远程 DNS 服务器发送查询请求。
- 迭代查询方式指的是:每次查询请求都由【本地 DNS 服务器】发起,收到答复后再由【本地 DNS 服务器】向下一个远程 DNS 服务器发送查询请求,直到获得结果。
- 递归查询方式指的是:【本地 DNS 服务器】向【根 DNS 服务器】发送查询请求,并从【根 DNS 服务器】获取域名的解析结果。
在实际应用中,迭代查询方式是比较常见的。下图描述的就是一个典型的 DNS 递归查询过程。
当用户在浏览器的地址栏中输入 URL 并点击回车后,浏览器首先判断 URL 中的是 IP 地址,还是域名。如果 URL 中的是域名,那么首先要做的就是域名解析。
域名解析的流程:首先是浏览器查看浏览器的缓存。如果浏览器中没有该域名的缓存,那么浏览器询问【本地 DNS 解析器】,【本地 DNS 解析器】首先查看本地 DNS 缓存。如果本地 DNS 缓存中没有该域名的缓存,那么【本地 DNS 解析器】请求【本地 DNS 服务器】进行域名解析。如果【本地 DNS 服务器】中没有该域名的缓存,那么【本地 DNS 服务器】向 DNS 系统中的其他远程 DNS 服务器发送查询请求。
不能把数据永远放在缓存中,缓存中的数据都被设置了一个生存时间(time to live,TTL)。超过 TTL 时间的数据会被清除,需要再重新获取新的数据。
以【本地 DNS 解析器】请求【本地 DNS 服务器】进行 www.CDNbook.com 域名的解析为例:
(1)【本地 DNS 解析器】向【本地 DNS 服务器】发送域名解析请求。(8)【本地 DNS 解析器】收到来自【本地 DNS 服务器】的应答。
(2)【本地 DNS 服务器】向【根 DNS 服务器】发送域名解析请求,【根 DNS 服务器】返回 .com 顶级域的域名服务器列表(多条 NS 记录)。
(4)【本地 DNS 服务器】收到应答后,在 .com 顶级域的域名服务器列表中选择一个 IP 地址,向这个 IP 地址对应的 DNS 服务器发送域名解析请求,.com 顶级域的域名服务器返回 CDNbook.com 域的域名服务器列表。
(6)【本地 DNS 服务器】收到应答后,在 CDNbook.com 域的域名服务器列表中选择一个 IP 地址,向这个 IP 地址对应的 DNS 服务器发送域名解析请求,CDNbook.com 域的域名服务器返回 www.CDNbook.com 域的 A 记录列表(多个 IP 地址)。
(8)【本地 DNS 服务器】收到应答后,在 www.CDNbook.com 域的 A 记录列表中选择一个 IP 地址,将该 IP 地址返回给【本地 DNS 解析器】。
记录类型
域名服务器是根据资源记录来对域名解析请求进行应答的。在 DNS 系统中,最常见的资源记录是 Internet 类记录。
资源记录是一个包含了下列字段的 4 元组:Name、Value、Type、TTL。
- TTL 是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间
- Type 是该记录的类型
- Name 和 Value 的值取决于 Type
Internet 类资源记录主要分为以下几种类型:
- A 记录,Address:A 记录用于描述域名到 IP 地址的映射关系。将域名指向一个 IPv4 地址。同一个域名,可以有多条 A 记录。也就是说,一次 DNS 查找可以返回多个 IP 地址。
- NS 记录,Name Server:NS 记录是域名服务器记录,用于指定该域名由哪个 DNS 服务器来进行解析。每个区域可以有多个域名服务器,因此可以有多条 NS 记录。如果需要把子域名交给其他的 DNS 服务器来进行解析,就需要添加 NS 记录。
- SOA 记录,Start Of Authority:SOA 记录用于指定该区域的权威域名服务器。每个区域允许且只允许有一个 SOA 记录,它是资源记录的第一个条目。
- CNAME 记录,Canonical Name:CNAME 记录是规范名称,用于描述域名到规范名称的映射关系。将域名指向另外一个域名,指向的域名是规范名称。【本地 DNS 服务器】收到 CNAME 记录后,它会用 CNAME 记录中的规范名称来重新查询新域名的 A 记录。
- PTR 记录,Pointer Record:PTR 记录是逆向查询记录,返回一个域名,它用于根据 IP 地址查询域名(反向解析)。逆向查询的一个应用是:可以防止垃圾邮件,即验证发送邮件的 IP 地址,是否真的有它所声称的域名。
假设有上述的 DNS zone:当要查询 bar.example.com 的 A 记录时,域名解析服务器会查到对应的 CNAME 记录,即foo.example.com,随即开始查询 foo.example.com 域名的 A 记录,查到 192.0.2.23 返回结果。
CNAME 的意思是真实名称。正确的理解是:bar.example.com 的真实名称是 foo.example.com。请求访问bar.example.com 的客户端会得到 foo.example.com 返回的结果。
域名的应用
域名服务器可以将域名映射为 IP 地址。基于这个特点,域名解析除了可以用于浏览器之外,域名解析还可以用于以下的场景:
- 基于域名实现重定向:使用域名代替 IP 地址。可以让对外提供服务的域名不变,而主机的 IP 地址任意变动。当主机有情况需要下线、迁移时,可以更改 DNS 记录,让域名映射到其他的 IP 地址。
- 基于域名搭建名字服务器:因为域名是一个名字空间,所以可以使用 BIND 9 等开源软件搭建一个内网的本地 DNS 服务器作为名字服务器。这样我们开发的各种内部服务就可以都用域名来标记,比如数据库服务都用域名 “mysql.inner.app”,商品服务都用 “goods.inner.app”,发起网络通信时使用域名,不必再使用写死的 IP 地址了。
- 基于域名实现负载均衡,从而提高系统的可用性:基于域名实现负载均衡有两种方式:
- 第一种方式:域名解析返回多个 IP 地址,客户端收到多个 IP 地址后,自己根据负载均衡策略选择一个 IP 地址使用,把请求分发到不同的服务器。
- 第二种方式:域名解析内部配置负载均衡策略,在 DNS 端把请求分发到不同的服务器。
参考资料
《CDN 技术详解》雷葆华著