# DNS 域名系统
# 定义
域名系统(Domain Name System)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
# 端口
DNS 使用 TCP 和 UDP 端口 53。
# 限制
限制每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符。
# 为何采用分布式集群
DNS 为什么不采用单点的集中式的设计方式,而是使用分布式集群的工作方式?
DNS 的一种简单的设计模式就是在因特网上只使用一个 DNS 服务器,该服务器包含所有的映射,在这种集中式的设计中,客户机直接将所有查询请求发往单一的 DNS 服务器,同时该 DNS 服务器直接对所有查询客户机做出响应,尽管这种设计方式非常诱人,但他不适用当前的互联网。
不适应的原因有如下几点:
- 单点故障
- 通信容量(上亿台主机发送的查询 DNS 报文请求,包括但不限于所有的 HTTP 请求,电子邮件报文服务器,TCP 长连接服务)
- 远距离的时间延迟
- 维护开销大(因为所有的主机名-ip映射都要在一个服务站点更新)
DNS 服务器一般分三种:
- 根 DNS 服务器
- 顶级 DNS 服务器
- 权威 DNS 服务器
# DNS 域名解析
浏览器缓存 -> 操作系统缓存 -> 路由器缓存 -> 本地域名服务器(LDNS) -> 根域名服务器
浏览器缓存
浏览器首先会在自身缓存中查找是否有该域名对应的 IP 地址,若命中则解析结束。(域名被缓存的时间也可通过 TTL 属性来设置)。
操作系统缓存
若浏览器缓存中没命中该域名,则会自动检查用户计算机系统 Hosts 文件 DNS 缓存是否有该域名对应 IP 。
路由器缓存
当浏览器及操作系统缓存中均无域名对应 IP 则进入路由器缓存中检查,以上三步均为客服端的 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 服务器)