DNS 基本概述
DNS(Domain Name System)域名系统是一个将ip地址映射称为域名或者将域名映射成为ip地址的一种服务。DNS协议是应用层协议,运行在UDP
之上,使用53端口。DNS使用客户 - 服务器模式运行在通信的端系统之间,在通信的端系统之间通过端到端的传输协议来传送DNS报文。
下面通过一个示例来简单描述DNS
的解析过程,例如,你在浏览器中输入了 “mail.qq.com”,实际会发生以下操作:
- 同一台用户主机上运行着
DNS
应用的客户端- 浏览器将主机名 “mail.qq.com” 发送给
DNS
应用的客户端DNS
客户端向DNS
服务端发送一个包含主机名的请求DNS
客户端最终会收到一份回答报文,其中包含该目标主机的IP地址- 一旦浏览器收到目标主机的IP地址后,它就能够向位于该IP地址80端口的
HTTP
服务器进程发起一个TCP
连接
除了提供IP地址到主机名的转换,DNS还提供了下面几个重要的服务
- 主机别名(host aliasing),有着复杂的主机名的主机能够拥有一个或者多个其他别名,比如说一台名为 aaabbbcdef.com 的主机,同时会拥有 a.com 和 b.com 两个主机别名,在这种情况下 aaabbbcdef.com 也称为
规范主机名
,而主机别名比规范主机名更加容易记忆。应用程序可以调用DNS
来获得主机别名对应的规范主机名以及对应的IP地址。 - 邮件服务器别名(mail server aliasing),同样的,电子邮件的应用程序也可以调用
DNS
对提供的主机名进行解析。 - 负载均衡(load distribution),DNS也用于冗余的服务器之间进行负载分配。繁忙的站点例如 cnn.com 被冗余分布在多台服务器上,每台服务器运行在不同的端系统之间,每个都有着不同的IP地址。由于这些冗余的Web服务器,一个IP地址集合因此与同一个规范主机名联系。DNS数据库中存储着这些IP地址的集合。由于客户端每次都会发起 HTTP 请求,所以DNS就会在所有这些冗余的Web服务器之间循环分配了负载。
DNS的域名空间结构
域名系统作为一个层次结构和分布式数据库,包含各种类型的数据,包括主机名和域名。DNS数据库中的名称形成一个分层树状结构称为命名空间
了解域名结构
以
mail.qq.com
域名为例,com
为顶级域名,qq.com
为二级域名,mail.qq.com
为三级域名
顶级域名服务器
顶级域名为最后一个
.
右侧部分的内容,如mail.qq.com
的com
就是顶级域名,顶级域名对应的服务器称之为顶级域名服务器
二级域名服务器
域名
mail.qq.com
中的倒数第二个.
右侧部分qq.com
成为二级域名
根域名服务器
在2016年之前全球一共拥有13台根服务器,1台主根服务器在美国,其他12台为辅根服务器,其中美国9台,英国1台,瑞典1台,日本1台,这13台根服务器主要管理互联网的主目录,主要作用IPV4。 2016年,中国下一代互联网工程中心领衔发起雪人计划,旨在为下一代互联网(IPV6)提供更多的根服务器解决方案,该计划于2017年完成,其中包含3台主根服务器,中国1台,美国1台,日本1台,22台辅根服务器,中国3台,美国2台,印度和法国分别有3台,德国2台,俄罗斯、意大利、西班牙、奥地利、智利、南非、澳大利亚、瑞士、荷兰各1台,共22台,从此形成了13台原有根加25台IPV6根服务器的新格局
本地域名服务器
本地域名服务器的范围非常广,没有一个详细的定位,可能是某个运营商部署在该城市的一台服务器,也可能是某个公司的一台服务器,甚至可能是某个学校的服务器
- 根域名
DNS 域名使用中规定由尾部句点
.
来指定名称位于根或者更高层次的域层次结构
- 顶级域名
用来表示国家、地区或者组织。采用三个字符,如
com
表示商业公司,edu
表示教育机构,net
表示网络公司,gov
表示非军事政府机构等等。
- 二级域名
表示归属于某个公司或组织的域名
DNS 工作概述
假设运行在用户主机上的某些应用程序(如Web浏览器或邮件阅读器)需要将主机名转换成 IP 地址。这些应用程序将调用 DNS
的客户端,并指明需要被转换的主机名。用户主机上的 DNS 收到后,会使用 UDP
通过 53 端口向网络上发送一个 DNS 查询报文,经过一段时间后,用户主机以上的 DNS
会收到一个主机名对应的DNS回答报文。因此,从用户主机的角度来看,DNS
就像是一个黑盒子,其内部的操作你无法看到。但是实际上,实现DNS这个服务的黑盒子非常复杂,它由分布于全球的大量DNS服务器以及定义了DNS
服务器与查询主机通信方式的应用层协议组成。
DNS 最早的设计是只有一台 DNS
服务器。这台服务器会包含所有的 DNS
映射。这是一种集中式的设计,这种设计并不适用于当今的互联网,因为互联网有着数量巨大并且持续增长的主机,这种集中式的设计会存在以下几个问题:
- 单点故障(a single point of failure),如果 DNS 服务器崩溃,那么整个网络随之瘫痪。
- 通信容量(traffic volume),单个 DNS 服务器不得不处理所有的DNS查询,这种查询级别可能是百万、千万级
- 远距离集中式数据库(distant centralized databases),单个 DNS 服务器不可能邻近所有的用户,假设在美国的 DNS 服务器不可能邻近让澳大利亚的查询使用,其中查询请求势必会经过低速和拥堵的链路,造成严重的时延。
- 维护(maintenance),维护成本巨大,而且需要频繁更新。
存放地址
- 浏览器缓存
- 系统缓存
- 本地域名服务器
- 根域名服务器
- 顶级域名服务器
- 二级域名服务器 … …
查询顺序
- 检查浏览器缓存中是否存在改域名与IP地址的映射关系,如果有则解析结束,没有则继续
- 到系统本地查找映射关系,一般存在
hosts
文件中,如果有则解析结束,否则继续 - 本地域名服务器去查询 根域名服务器,该过程不会返回映射关系,只会告诉你去下级服务器(顶级域名服务器)查询
- 到本地域名服务器去查询,有则结束,否则继续
- 本地域名服务器查询顶级域名服务器(即
com
服务器),同样不会返回映射关系,只会引导你去二级域名服务器查询 - 本地域名服务器查询二级域名服务器(即
qq.com
服务器),引导去三级域名服务器 - 本地域名服务器查询三级域名服务器(即
mail.qq.com
), 此时已经是最后一级,如果有则返回映射关系,并且本地服务器加入自身的映射表中,方便下次查询,同时返回给用户的计算机,没有找到则网页报错