通常,识别主机有两种方式:主机名(类似于
www.baidu.com
,www.goole.com
等)和IP地址(类似于192.168.1.1
)。主机名方便人们记忆,符合人们阅读习惯;而IP地址的定长性和层次结构有利于路由器识别。 为了同时满足上述两种需求,我们需要进行主机名到IP地址转换的目录服务(即将主机名映射为IP地址),DNS则是提供了主机名到IP地址映射服务。
# 定义
DNS( Domain Name System)是“域名系统”的英文缩写,是互联网的一项服务,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
DNS
① 一个由分层的DNS服务器实现的分布式数据库;
② 一个使得主机能够查询分布式数据库的应用层协议。
# 端口
DNS 使用 TCP 和 UDP 端口 53。
# 限制
当前,对于每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符。
# DNS提供的服务
- 域名解析:实现主机名到IP地址转换的目录服务。
- 主机别名:通过DNS服务获取主机别名对应的复杂规范主机名。
- 邮件服务器别名:类似于主机别名。
- 负载分配:假设对于一个拥有很大流量的站点,其可能部署在多个服务器上,它们所有的IP构成一个IP集合,这个IP集合与同一个规范主机名相联系。DNS 提供了相应的映射服务,使得不同的客户端请求可以轮流访问各个服务器。
# 其他应用层协议使用DNS的过程
1、同一台用户主机上运行着 DNS 应用的客户端
2、浏览器从 URL 中抽取主机名(www.someschool.com
),将此主机名传送到 DNS 应用的客户端
3、DNS 客户端向 DNS 服务器发送一个包含主机名的请求
4、DNS 客户端接受到一个回答报文,回答报文中含有主机名对应的IP地址
5、浏览器接受到 IP 地址后,其向位于该 IP 地址80端口的HTTP服务器进程发起一个 TCP 连接
# 为何采用分布式集群
DNS 为什么不采用单点的集中式的设计方式,而是使用分布式集群的工作方式?
DNS 的一种简单的设计模式就是在因特网上只使用一个 DNS 服务器,该服务器包含所有的映射,在这种集中式的设计中,客户机直接将所有查询请求发往单一的 DNS 服务器,同时该 DNS 服务器直接对所有查询客户机做出响应,尽管这种设计方式非常诱人,但他不适用当前的互联网。
# 集中式DNS服务的缺点
单点故障
如果 DNS 服务器奔溃,整个因特网陷入瘫痪。
通信容量(上亿台主机发送的查询 DNS 报文请求,包括但不限于所有的 HTTP 请求,电子邮件报文服务器,TCP 长连接服务)
单个 DNS 服务器需要处理大数量级的请求。
远距离的时间延迟
对于远距离的集中式数据库,需要经过低俗拥挤的链路,其会导致较长的时延。
维护成本高(因为所有的主机名-ip映射都要在一个服务站点更新)
单个 DNS 服务器需要为所有主机保留记录,数据库庞大,维护成本高。
# 分布式层次式数据库
DNS 是分层的,由多个服务器组成。当输入一个域名时,计算机首先向本地 DNS 服务器(通常由互联网服务提供商提供)发出查询请求,如果本地 DNS 服务器没有所需的信息,它会向其他更高层次的 DNS 服务器发出请求,直到找到能够提供所需信息的服务器为止。
分布式层次式数据库中,分布式指的是其分布在全世界范围内,层次式指的是其按照层次方式组织。
其按照层次可将 DNS 服务器划分为三种类型:
根 DNS 服务器
最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助。
顶级域 DNS 服务器
负责管理在该顶级域名服务器下注册的二级域名。
权威 DNS 服务器
负责一个区的域名解析工作。
本地域名服务器
当一个主机发出DNS查询请求时,这个查询请求首先发给本地域名服务器。
这里还要提到一个本地域名解析服务器。该服务器不严格属于层级体系。每个 ISp 有一个本地域名服务器(也叫默认域名解析服务器)。当主机进行 DNS 查询时,查询被发送到本地域名服务器,其作为代理(proxy),将查询转发给(层次式)域名解析服务器系统。
一个域名服务器所负责的范围,或者说有管理权限的范围,就称为区。
每个层的域名上都有自己的域名服务器,最顶层的是根域名服务器。
每一级域名服务器都知道下级域名服务器的IP地址。
为了容灾, 每一级至少设置两个或以上的域名服务器。
# 域名结构
DNS 系统采用的是分布式的解析方案,整个 DNS 架构是一种层次树状结构,这个树状结构称为 DNS 域名空间,如图:
树状结构最顶层称为根域,用 “.” 表示,相应服务器称为根服务器,整个域名空间解析权都归跟服务器所有,但根服务器无法承担庞大的负载,采用“委派”机制,在根域下设置了一些顶级域,然后将不同顶级域解析权分别委派给相应的顶级域服务器,如将 com 域 的解析全委派给 com 域服务器,以后但凡跟服务器收到以 com 结尾的域名解析请求,都会转发给com 域服务器,同样道理,为了减轻顶级域的压力,又下设了若干二级域,二级域又下设三级域或主机。
根域
位于域名空间最顶层,一般用一个 “.” 表示
顶级域 一般代表一种类型的组织机构或国家地区,如 net、com、org、edu、gov、mil、cn、jp、hk
二级域 用来标明顶级域内的一个特定的组织,国家顶级域下面的二级域名由国家网络部门统一管理,
如 .cn 顶级域名下面设置的二级域名:.com.cn、.net.cn、.edu.cn …
子域 二级域下所创建的各级域统称为子域,各个组织或用户可以自由申请注册自己的域名
主机 主机位于域名空间最下层,就是一台具体的计算机,如 www、mail、都是具体的计算机名字,可用www.sina.com.cn.、mail.sina.com.cn. 来表示,这种表示方式称为 FQDN (完全合格域名),也是这台主机在域名中的全名
例如:
www.baidu.com
- com:一级域名. 表示这是一个企业域名。同级的还有 “net”(网络提供商), “org”(⾮非盈利组织) 等
- baidu:二级域名,指公司名
- www:三级域名
# DNS缓存
所谓DNS缓存,是指本地DNS服务器将某个服务器返回的响应信息进行缓存。如果本地DNS服务器缓存了一对主机名/IP,那么当本地DNS服务器再一次遇到相同主机名的查询请求时,其可以直接返回相应的IP地址。
注:由于主机名和IP地址的映射不是永久的,DNS服务器在一段时间后将丢弃缓存信息。
DNS 缓存在浏览器、操作系统、路由器、ISP(Internet Service Provider)和递归 DNS 服务器中都起着重要的作用。
# DNS 域名解析
浏览器缓存 -> 操作系统缓存 -> 路由器缓存 -> 本地域名服务器(LDNS) -> 根域名服务器
浏览器缓存
浏览器首先会在自身缓存中查找是否有该域名对应的 IP 地址,若命中则解析结束。(域名被缓存的时间也可通过 TTL 属性来设置)。
浏览器会在本地缓存中存储最近访问的域名解析结果。当用户再次访问相同的域名时,浏览器首先检查本地缓存,如果存在相应的解析结果且未过期,则直接使用缓存结果,避免再次发送DNS查询请求。
操作系统缓存
若浏览器缓存中没命中该域名,则会自动检查用户计算机系统 Hosts 文件 DNS 缓存是否有该域名对应 IP 。
操作系统也会维护一个DNS缓存,存储最近的域名解析结果。这个缓存属于系统级别的缓存,被多个应用程序共享。当应用程序发起域名查询请求时,操作系统首先检查自己的缓存,如果有匹配的解析结果,会直接返回给应用程序,而无需进行网络查询。
路由器缓存
当浏览器及操作系统缓存中均无域名对应 IP 则进入路由器缓存中检查,以上三步均为客服端的 DNS 缓存。
一些路由器也会具有DNS缓存功能,以减少内部网络中的DNS查询次数。当设备连接到路由器并发起DNS查询请求时,路由器会检查自己的缓存,如果存在匹配的解析结果,则直接返回给设备,避免向上游DNS服务器发送查询请求。
本地服务器
以上均未命中,则请求**本地域名服务器(LDNS)**来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约 80% 的域名解析到这里就完成了。
根域名服务器
如果 LDNS 仍然没有命中,就直接跳到 Root Server 域名服务器请求解析,根域名收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名(如.com)服务器 IP 告诉本地 DNS 服务器(注意:全球仅有 13 台根域名服务器,1 个主根域名服务器,其余 12 为辅根域名服务器)。
顶级域名服务器
本地 DNS 服务器会发请求给上一步返回的顶级域名服务器,顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名服务器的 IP 地址告诉本地 DNS 服务器。
主域名服务器
本地 DNS 服务器会继续发请求给上一步返回的主域名服务器,主域名服务器接受到请求后查询自己的缓存,如果没有则返回相关的下一级域名服务器的地址,并重复该步骤直至找到正确纪录。
保存结果到缓存
本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个 IP 地址与 web 服务器建立链接。
# DNS查询方式
DNS递归查询与迭代查询
DNS 递归查询是浏览器到本地 DNS 的过程,DNS 迭代查询是本地 DNS 服务器到根域名服务器查询的方式。(本地 DNS:所在区域或城市的 DNS 服务器)
# 迭代查询
1、首先,cis.poly.edu
主机向本地DNS服务器发送一个含有 gaia.cs.umass.edu
主机名的DNS请求报文。
2、本地服务器将报文转发到根 DNS 服务器。
3、根 DNS 服务器根据 edu 前缀向本地 DNS 服务器返回负责 edu 的顶级域 DNS 服务器 IP 地址列表。
4、根 DNS 服务器向顶级域 DNS 服务器(TLD) IP 地址之一发送查询报文。
5、TLD 服务器根据 umass.edu
返回权威DNS服务器IP地址。
6、根 DNS 服务器向权威 DNS 服务器IP地址发送查询报文。
7、权威 DNS 服务器返回 gaia.cs.umass.edu
的 IP 地址作为响应。
8、本地域名服务器向主机返回查询的IP地址。
# 递归查询
1、首先,cis.poly.edu
主机向本地 DNS 服务器发送一个含有 gaia.cs.umass.edu
主机名的DNS请求报文。
2、本地服务器将报文转发到根 DNS 服务器。
3、根 DNS 服务器根据edu前缀向顶级域DNS服务器(TLD)发送查询报文。
4、顶级域 DNS 服务器(TLD)向权威 DNS 服务器发送查询报文。
5、权威 DNS 服务器向 TLD 返回查询的 IP 地址。
6、TLD 将查询的IP地址返回至根 DNS 服务器。
7、根 DNS 服务器将查询结果返回至本地 DNS 服务器。
8、本地 DNS 服务器将查询到的 IP 地址返回至主机。
# DNS记录和报文
DNS记录也称为资源记录(Resource Record)。其格式为一个四元组(name,value,type,TTL),其中TTL为该记录存在时间,Name和value的值取决于Type。
Name | Value | Type | TTL |
---|---|---|---|
主机名 | IP地址 | A | / |
域(如foo.com) | 权威DNS服务器的主机名 | NS | / |
主机别名 | 规范主机名 | CNAME | / |
邮件服务器别名 | 规范邮件服务器名 | MX | / |
DNS 协议为查询和回复,两种格式相同。报文格式如下:
参考资料:
DNS域名工作原理及解析 - Alummox - 博客园 (cnblogs.com) (opens new window)