title: 【重拾网络】DNS
date: 2017-07-20 21:55:21
tags: 网络
categories: 网络
DNS 是什么
了解网络的同学应该都是知道 DNS的,它提供最基本的从域名到 IP 地址的转换服务。简单可以把 DNS 理解成一个翻译官,这位翻译官每天默默地为我们处理上网请求时域名到 IP 的转换。
上网时每次对域名的请求使用的是 HTTP 协议,而作为翻译官 DNS 发生在HTTP 真实请求之前。尽管 DNS 协议执行在 HTTP 请求之前,但与 HTTP 一样,DNS 也是 TP/IP 协议模型中应用层协议。更具体一点默认使用的是 UDP 的传输方式,端口号为 53 。
补充一下,除了基本的域名到 IP 的转换服务, DNS 还可以提供主机别名,邮件服务器别名,负载均衡功能。
DNS 结构
从功能上来看,DNS 只提供了非常简单的字符串到字符串的转换服务。类似于程序语言中的字典结构就可以完成映射转换。所以在很多网络结构图中 DNS 服务往往被描述成一台服务器,在客户端与服务器请求之前,首先在 DNS 服务器上查询服务器对应的 IP 即可。我们日常的使用中 DNS 也确实扮演了这样一个默默无闻的角色,运行的过程对用户非常透明。
为了使 DNS 可以做到全球范围的高可用,一台简单的服务器肯定是无法满足的。实际上DNS 根据域名的层级也划分出不同的 DNS 层级。
域名层级
域名层级的划分示意:
域名的层级结构:
主机名.次级域名.顶级域名.根域名
host.sld.tld.root
以 www.example.com 域名为例,看看域名的划分:
域名 | 值 | 备注 |
---|---|---|
使用的域名 | www.example.com | 日常真实使用的域名 |
真正的域名 | www.example.com.root | .root通常省略 |
根域名 | .root | 对所有域名 |
顶级域名 | .com | |
次顶级域名 | .example | 用户可注册的 |
三级域名(主机名) | www | 用户在自己的域里面为服务器分配的名称 |
DNS 层级
域名层级结构对应的 DNS 服务结构划分:
上面 DNS 的层级结构很明显是一个树型的结构,解析的过程就是从根到叶子节点的访问过程。作为基础的网络服务,单节点肯定是不可靠的,所以上图的节点实际中不是孤立存在的,而是由一组服务器构成。例如根节点就对应了全世界 13 台根服务器。
DNS 查询过程
既然树型的 DNS 的结构不能一步获取到最终查询结果,这里就有两种方式处理处理查询过程了:
-
递归查询
客户端发出查询请求后,只接受一个准确的查询结果,而不能是查询的中间过程
-
迭代查询
客户端发出查询请求后,DNS 服务器不直接回复查询结果,而是告诉客户端另一台 DNS 服务器地址,客户端再向这台 DNS 服务器请求解析,依此循环直到返回查询的结果
两者各有利弊,通常是将两者结合在一起,一个 DNS 的解析大致可以分两个部分:
- 客户端向 Local DNS 的请求,通常这部分使用递归请求
- Local DNS 的请求,通常这部分使用迭代请求
按照上述规则一个基本的 DNS 解析过程:
- 发出域名解析请求
- 本机的域名解析器 resolver 程序查询本地缓存和 host 文件中是否为域名的映射关系
- 本地解析器向 TCP/IP 参数中设置的首选 DNS 服务器(我们叫它 Local DNS 服务器)发起一个递归的查询请求
- 服务器收到查询时
- 如果要查询的域名由 Local DNS 服务器负责解析,则返回解析结果给客户机,完成域名解析,且此解析具有权威性
- 如果要查询的域名不由 Local DNS 服务器解析,则调用这个 IP 地址映射,完成域名解析,且此解析不具有权威性
- 根据 Local DNS 服务器的设置(是否递归)进行查询
- 如果是迭代查询,Local DNS 就把请求发至13台 Root DNS
- 如果是递归查询,Local DNS 就会把请求转发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环
- Root DNS 服务器收到请求后会判断这个域名是谁来授权管理,并会返回一个负责该顶级域名服务器的一个 IP
- Local DNS 服务器收到 IP 信息后,将会联系负责 .edu 域的这台服务器
- 负责 .edu 域的服务器收到请求后,如果自己无法解析,它就会找一个管理 .edu 域的下一级 DNS 服务器地址给 Local DNS 服务器
- 当 Local DNS 服务器收到这个地址后,就会找 googleplex.edu 域服务器
- 负责 googleplex.edu 域的服务器接收到请求后,如果自己无法解析,继续找管理 googleplex.edu 域的下一级 DNS 服务器地址给 Local DNS 服务器
- 当 Local DNS 服务器收到这个地址后,就会找 compsci.googleplex.edu 域服务器
- 最后 compsci.googleplex.edu 域服务器返回需要解析的域名的 IP 地址给 Local DNS 服务器
- Local DNS 服务器缓存这个解析结果(同时也会缓存,6、8、10返回的结果)
- Local DNS 服务器同时将结果返回给本机域名解析器
- 本机缓存解析结果
- 本机解析器将结果返回给浏览器
- 浏览器通过返回的 IP 地址发起请求
DNS 记录
资源记录:name, value, type, ttl
ttl:记录存活时间
type 分类:
- A:name:主机域名,value:IP地址
- NS:name:域,value:域的权威域名解析服务的主机域名
- CNAME:name:真实域名的别名,value:真实域名
- MX:value是与name相对应的邮件服务器
其他 DNS 相关
常见的 DNS 功能说明
- 权威 DNS: 最终决定域名解析结果的服务器,可以在其上配置具体域名的对应解析结果信息
- 递归 DNS 或本地 DNS:有域名解析结果的决定权,但代理了用户向权威DNS获取域名解析结果的过程,不属于 DNS 层次体系
- 公共 DNS:全网开放的递归 DNS,不同于一般的本地 DNS 由 ISP 提供
DNS 相关命令
- dig
- host
- nslookup
命令的参考:域名解析之dig,host,nslookup命令