DNS定义
Domain Name System 域名系统, 是互联网使用的命名系统,用来把便于人们使用的域名转换为IP地址。域名是大小写无关的。 互联网的域名系统DNS被设计成一个联机分布式数据库系统,并采用客户服务器方式。 域名到IP地址的解析是由分布在互联网上的许多域名服务程序(简称域名服务器)共同完成的。 DNS的核心系统是一个三层的树状、分布式服务。对应域名的结构:
- 根域名服务器 (Root DNS Server)
- 管理顶级域名服务器,返回“com” “net” “cn”等顶级域名服务器的 IP 地址;
- 全世界目前有13组根域名服务器,又有数百台镜像。
- 顶级域名服务器(Top-level DNS Server)
- 管理各自域名下的权威域名服务器,比如 com 顶级域名服务器可以返回 apple.com 域名服务器的 IP 地址;
- 权威域名服务器(Authoritative DNS Server)
- 管理自己域名下主机的 IP 地址,比如 apple.com 权威域名服务器可以返回 www.apple.com 的 IP 地址。
除了上面三种DNS服务器,还有一种不在DNS层次结构之中,但是很重要的DNS服务器,就是本地域名服务器(也被称为权威域名服务器)。本地域名服务器是电脑解析时的默认域名服务器,即电脑中设置的首选 DNS 服务器和备选 DNS 服务器。常见的有电信、联通、谷歌、阿里等的本地 DNS 服务。
DNS解析过程
把域名映射到IP的过程,叫做域名解析。此过程是 计网7 中摘录。 真实情况要考虑缓存等。 域名到IP地址的解析过程要点如下: 当某一个应用进程需要把主机名解析为IP地址时,
- 该应用进程就调用解析程序(resolver),并成为DNS的一个客户,
- 把待解析的域名放在DNS请求报文中,以UDP 用户数据报的格式发送给本地域名服务器(使用 UDP 是为了减少开销)。
- 本地域名服务器在查找域名后,把对应的IP地址放在响应报文中返回。
🔥DNS解析过程考虑DNS缓存:
- 首先搜索浏览器DNS缓存,缓存中维护一张域名与IP地址的对应表。
- 如果没有命中,系统DNS缓存。 Mac上 nslookup www.baidu.com可以查看系统缓存
- hosts文件
- 路由器缓存
- 本地域名服务器(ISP 互联网服务提供商)
- 根域名服务器
- 顶级域名服务器
- 权威名服务器
🔥DNS查询过程
DNS的查询过程,按查询方式不同,分为递归查询 和 迭代查询。 递归查询:迭代查询:
在实际的网络中,一般采用两段式查询过程,即先递归,后迭代。从本地主机到本地域名服务器采用递归查询,而从本地域名服务器到最终结果则采用迭代方式查询 递归查询:主机和本地域名服务器ISP之间的查询方式是递归查询。 迭代查询:本地域名服务器和其他域名服务器之间的查询方式是迭代查询,防止根域名服务器压力过大。
Question?
1. 递归查询和迭代查询的区别?
递归查询(Recursive Query) 是指某个DNS服务器在收到DNS查询请求后,如果自身无法回答该请求,就以DNS客户端的身份,代理发起查询去其他DNS服务器查询,直到得到最终结果后再将结果返回给启动查询的客户端。
迭代查询(Iterative Query) 是指DNS服务器在收到查询时,如果无法直接回答,就会将自己能够查询到的下一级DNS服务器的地址提供给发initiator,由发起查询的客户端再次向下一级DNS服务器查询,如此循环直到最终找到答案或查无结果。 简单来说:
- 递归查询是DNS服务器代理客户端完成整个查询过程
- 迭代查询是将查询任务转移给客户端,由客户端自行按照返回的下一步地址继续查询
2. 本地主机向ISP发起DNS查询时,使用的是UDP报文协议,为什么?
- 低开销
- DNS查询报文相对较小,不需要可靠的传输,使用轻量级的UDP比重量级的TCP更加高效。
- 传输可靠性要求低
- 对于DNS查询,偶尔丢失几个查询请求或者响应报文是可以接受的,不要求100%可靠性传输。
- 传统惯例
- 如果采用TCP协议需要重新设计DNS协议格式和实现
PS:DNS查询的时候,其实也会使用TCP协议,比如在涉及大量数据传输或对传输可靠性有较高要求的场景,DNS查询就更倾向于使用TCP协议替代默认的UDP协议,以保证数据的完整性和可靠性。
- Zone Transfer(区域传输) 当一台DNS服务器需要从另一台服务器获取一个完整的区域数据库的副本时,需要使用TCP协议进行区域传输。区域数据量往往较大,使用UDP可能由于报文长度限制而被截断。
- DNS动态更新 当需要动态添加、修改或删除DNS记录时,为了保证更新操作的可靠性和原子性,通常会使用TCP协议。
- 查询响应超长 当DNS查询的响应超过了UDP报文最大长度(通常为512字节)限制时,DNS服务器会自动切换到TCP协议传输响应数据。较长的响应一般出现在存在大量Additional区域数据的情形。
3. 前端可以做哪些DNS查询优化?
- 使用link rel="dns-prefetch"预解析DNS
<link rel="dns-prefetch" href="//example.com">
当需要加载该域名资源时已经完成了DNS解析,可以减少DNS查询延迟。但需要权衡是否增加了不必要的DNS查询开销。
- 使用HTTP/2
HTTP/2支持多路复用,一个连接可以并行加载多个资源,从根本上减少了DNS查询的数量。但需要服务端和客户端都支持HTTP/2。
- CDN分发
利用CDN进行资源分发,客户端就近访问节点,可以减少DNS查询的跨网络延迟