Skip to content
On this page

DNS 域名系统

识别主机有两种方式,通过主机名或者 IP 地址。

DNS是:

  1. 一个由分层的DNS服务器 (DNS server) 实现的分布式数据库
  2. 一个使得主机能够查询分布式数据库的应用层协议。

DNS 服务器通常是运行 BIND (Berkeley Internet Name Domain) 软件[ BIND 2012 ]的 UNIX 机器。

DNS 协议运行在 UDP 之上,使用 53 号端口。

过程

  1. 同一台用户主机上运行着 DNS 应用的客户端。
  2. 浏览器从URL中抽取出主机名www.school.edu,并将这台主机名传给DNS 应用的客户端。
  3. DNS 客户向 DNS 服务器发送一个包含主机名的请求。
  4. DNS 客户最终会收到一份回答报文,其中含有对应于该主机名的IP地址。
  5. 一旦浏览器接收到来自 DNS 的该 IP 地址,它能够向位千该 IP 地址 80 端口的HTTP服务器进程发起一个 TCP连接。

其他功能

  • 主机别名
    • 有着复杂主机名的主机(如:blog.merlin218.top)能拥有一个或者多个别名,如merlin218.topwww.merlin218.top
    • blog.merlin218.top叫规范主机名
    • 主机别名(当存在时)比主机规范名更加容易记忆。应用程序可以调用 DNS 来获得主机别名对应的规范主机名以及主机的 IP地址。
  • 邮件服务器别名
  • 负载分配
    • 一个 IP 地址集合与同一个规范主机名相联系。 DNS数据库中存储着这些 IP 地址集合 。
    • 当客户对映射到某地址集合的名字发出一个 DNS 请求时,该服务器用 IP 地址的整个集合进行响应,但在每个回答中循环这些地址次序 。 因为客户通常总是向 IP 地址排在最前面的服务器发送 HTTP 请求报文。

DNS工作机理

如果只是使用一台DNS服务器,会有什么问题?

  1. 单点故障,如果机器瘫痪了,整个因特网随之瘫痪。
  2. 通信容量,单个DNS服务器要处理所有的DNS查询。
  3. 远距离的集中式数据库,导致严重的延迟。
  4. 维护,需要保留所有因特网主机的保留记录,需要频繁更新。

DNS采用了分布式的设计方案。事实上,DNS 是一个在因特网上实现分布式数据库的精彩范例。

首先 DNS使用了大量的服务器,它们以层次方式组织,并分布在全世界范围内,没有一台DNS拥有因特网上所有主机的映射。以此来解决扩展性的问题。

大致来说,分成三种DNS服务器:根DNS服务器、顶级域(TLD)服务器,权威DNS服务器。

  • 根DNS服务器:全球400多个,由13个组织管理。根DNS服务器提供顶级域服务器的IP地址
  • 顶级域服务器:像com、top等结尾的,以及所有国家的顶级域(cn、uk等)都有顶级域服务器(或集群)。TLD服务器提供权威DNS服务器的IP地址
  • 权威DNS服务器:在因特网上具有公共可访问主机(如 Web 服务器和邮件服务器)的每个组织机构必须提供公共可访问的 DNS记录,这些记录将这些主机的名字映射为 IP 地址。

其实还有一类服务器:本地DNS服务器。对于每一个ISP(互联网服务提供商)都会有一台本地DNS服务器。当主机与ISP连接时,ISP可以提供一个或多个本地DNS服务器的IP地址。

了解过程

假设我们想通过www.baidu.com获取blog.merlin218.top的IP地址,并假设我们发起请求的主机的本地DNS服务器为dns.baidu.com,且blog.merlin218.top的权威DNS服务器是dns.merlin218.top

那么我们从我们的主机www.baidu.com出发,先向本地DNS服务器dns.baidu.com发送DNS查询报文。该报文包含了需要转换的主机名blog.merlin218.top

本地服务器将报文转发给根服务器,根服务器注意到top前缀,并向本地服务器返回负责top的顶级域服务器的IP地址列表。

本地服务器再次向这些IP地址之一发送查询报文。该TLD服务器注意到merlin218.top前缀,并用权威服务器的IP地址进行响应。

此时本地服务器再向权威服务器的IP地址发送查询报文,权威服务器负责的是dns.merlin218.top,接收到请求之后,将blog.merlin.top的IP地址进行响应。

最后再将目标主机的IP地址返回给我们的主机。

在这个过程中,一共发送了8份报文,4份查询报文,4份响应报文,DNS将利用缓存减少查询的流量。

在上述过程中,包含了DNS递归查询和迭代查询,主机向本地DNS服务器发送请求,到最后返回目标主机的IP地址,是递归查询。而本地DNS主机分别向根服务器、顶级域服务器、权威DNS服务器发送请求报文的过程是迭代查询。在实际中也是这样子的。

还有另外一种方式:全过程是一个递归查询。

DNS缓存

为了改善时延性能并减 少在因特网上到处传输的 DNS 报文数 量 DNS 广泛使用了缓存技术 。 DNS 缓存的原理非常简单 。 在一个请求链中,当某 DNS 服务器接收一个 DNS 回答(例如,包含某主机名到 1P地址的映射)时,它能将映射缓存在本地存储器中。

由于 主机和主机名 与 IP 地址间的映射并不是永久的, DNS 服务器在一段时间后(通常设置为两天)将丢弃缓存的信息 。

DNS 记录和报文

DNS记录

资源记录是一个包含了下列字段的 4 元组 : (Name, Value, Type, TTL)

TTL决定了资源记录应当从缓存中删除的时间 。

主要分为四种:

  • Type是A,Name为主机名,Value是主机名对应的IP地址
  • Type是NS,Name是个域,Value是可以知道如何获取这个域中IP地址的权威服务器的主机名
  • Type是CNAME,则Value是Name主机对应的规范主机名
  • Type是MX,Value是个别名为Name的邮件服务器的规范主机名

如果一台 DNS 服务器是用于某特定主机名的权威 DNS 服务器,那么该 DNS 服务器会有一条包含用于该主机名的类型 A 记录(即使该 DNS 服务器不是其权威 DNS 服务器,它也可能在缓存中包含有一条类型 A 记录) 。

如果服务器不是用千某主机名的权威服务器, 那么该服务器将包含一条 NS 记录,该记录对应于包含主机名的域。它还将包括一条 类型 A 记录,该记录提供了在 NS 记录的 Value 字段中的 DNS 服务器的 IP 地址 。

举个例子:

假设一台 edu TLD 服务器不是主机 gaia.cs.umass.edu 的权威 DNS 服务器, 则该服务器将包含一条包括主机cs.umass.edu的域记录,如 (umass.edu, dns.umass.edu, NS)

该 edu TLD 服务器还将包含一条类型 A 记录,如 (dns.umass.edu, 128.119.40.111, A)

DNS报文

MIT Licensed | Copyright © 2021 - 2022