DNS 域名系统
识别主机有两种方式,通过主机名或者 IP 地址。
DNS是:
- 一个由分层的DNS服务器 (DNS server) 实现的分布式数据库
- 一个使得主机能够查询分布式数据库的应用层协议。
DNS 服务器通常是运行 BIND (Berkeley Internet Name Domain) 软件[ BIND 2012 ]
的 UNIX 机器。
DNS 协议运行在 UDP 之上,使用 53 号端口。
过程
- 同一台用户主机上运行着 DNS 应用的客户端。
- 浏览器从URL中抽取出主机名www.school.edu,并将这台主机名传给DNS 应用的客户端。
- DNS 客户向 DNS 服务器发送一个包含主机名的请求。
- DNS 客户最终会收到一份回答报文,其中含有对应于该主机名的IP地址。
- 一旦浏览器接收到来自 DNS 的该 IP 地址,它能够向位千该 IP 地址 80 端口的HTTP服务器进程发起一个 TCP连接。
其他功能
- 主机别名
- 有着复杂主机名的主机(如:
blog.merlin218.top
)能拥有一个或者多个别名,如merlin218.top
、www.merlin218.top
blog.merlin218.top
叫规范主机名- 主机别名(当存在时)比主机规范名更加容易记忆。应用程序可以调用 DNS 来获得主机别名对应的规范主机名以及主机的 IP地址。
- 有着复杂主机名的主机(如:
- 邮件服务器别名
- 负载分配
- 一个 IP 地址集合与同一个规范主机名相联系。 DNS数据库中存储着这些 IP 地址集合 。
- 当客户对映射到某地址集合的名字发出一个 DNS 请求时,该服务器用 IP 地址的整个集合进行响应,但在每个回答中循环这些地址次序 。 因为客户通常总是向 IP 地址排在最前面的服务器发送 HTTP 请求报文。
DNS工作机理
如果只是使用一台DNS服务器,会有什么问题?
- 单点故障,如果机器瘫痪了,整个因特网随之瘫痪。
- 通信容量,单个DNS服务器要处理所有的DNS查询。
- 远距离的集中式数据库,导致严重的延迟。
- 维护,需要保留所有因特网主机的保留记录,需要频繁更新。
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)