Skip to content

DNS.svg

DNS定义

Domain Name System 域名系统, 是互联网使用的命名系统,用来把便于人们使用的域名转换为IP地址。域名是大小写无关的。 互联网的域名系统DNS被设计成一个联机分布式数据库系统,并采用客户服务器方式。 域名到IP地址的解析是由分布在互联网上的许多域名服务程序(简称域名服务器)共同完成的。 DNS的核心系统是一个三层的树状、分布式服务。对应域名的结构:

  1. 根域名服务器 (Root DNS Server)
    • 管理顶级域名服务器,返回“com” “net” “cn”等顶级域名服务器的 IP 地址;
    • 全世界目前有13组根域名服务器,又有数百台镜像。
  2. 顶级域名服务器(Top-level DNS Server)
    • 管理各自域名下的权威域名服务器,比如 com 顶级域名服务器可以返回 apple.com 域名服务器的 IP 地址;
  3. 权威域名服务器(Authoritative DNS Server)
    • 管理自己域名下主机的 IP 地址,比如 apple.com 权威域名服务器可以返回 www.apple.com 的 IP 地址。

除了上面三种DNS服务器,还有一种不在DNS层次结构之中,但是很重要的DNS服务器,就是本地域名服务器(也被称为权威域名服务器)。本地域名服务器是电脑解析时的默认域名服务器,即电脑中设置的首选 DNS 服务器和备选 DNS 服务器。常见的有电信、联通、谷歌、阿里等的本地 DNS 服务。

DNS解析过程

域名映射到IP的过程,叫做域名解析。此过程是 计网7 中摘录。 真实情况要考虑缓存等。 域名到IP地址的解析过程要点如下: 当某一个应用进程需要把主机名解析为IP地址时,

  1. 该应用进程就调用解析程序(resolver),并成为DNS的一个客户,
  2. 把待解析的域名放在DNS请求报文中,以UDP 用户数据报的格式发送给本地域名服务器(使用 UDP 是为了减少开销)。
  3. 本地域名服务器在查找域名后,把对应的IP地址放在响应报文中返回。

🔥DNS解析过程考虑DNS缓存:

  1. 首先搜索浏览器DNS缓存,缓存中维护一张域名与IP地址的对应表。
  2. 如果没有命中,系统DNS缓存。 Mac上 nslookup www.baidu.com可以查看系统缓存
  3. hosts文件
  4. 路由器缓存
  5. 本地域名服务器(ISP 互联网服务提供商)
  6. 根域名服务器
  7. 顶级域名服务器
  8. 权威名服务器

🔥DNS查询过程

DNS的查询过程,按查询方式不同,分为递归查询 和 迭代查询递归查询:迭代查询: 在实际的网络中,一般采用两段式查询过程,即先递归,后迭代。从本地主机到本地域名服务器采用递归查询,而从本地域名服务器到最终结果则采用迭代方式查询 递归查询:主机和本地域名服务器ISP之间的查询方式是递归查询。 迭代查询:本地域名服务器和其他域名服务器之间的查询方式是迭代查询,防止根域名服务器压力过大。

Question?

1. 递归查询和迭代查询的区别?

递归查询(Recursive Query) 是指某个DNS服务器在收到DNS查询请求后,如果自身无法回答该请求,就以DNS客户端的身份,代理发起查询去其他DNS服务器查询,直到得到最终结果后再将结果返回给启动查询的客户端。


迭代查询(Iterative Query) 是指DNS服务器在收到查询时,如果无法直接回答,就会将自己能够查询到的下一级DNS服务器的地址提供给发initiator,由发起查询的客户端再次向下一级DNS服务器查询,如此循环直到最终找到答案或查无结果。 简单来说:

  • 递归查询是DNS服务器代理客户端完成整个查询过程
  • 迭代查询是将查询任务转移给客户端,由客户端自行按照返回的下一步地址继续查询

2. 本地主机向ISP发起DNS查询时,使用的是UDP报文协议,为什么?

  1. 低开销
    1. DNS查询报文相对较小,不需要可靠的传输,使用轻量级的UDP比重量级的TCP更加高效。
  2. 传输可靠性要求低
    1. 对于DNS查询,偶尔丢失几个查询请求或者响应报文是可以接受的,不要求100%可靠性传输。
  3. 传统惯例
    1. 如果采用TCP协议需要重新设计DNS协议格式和实现

PS:DNS查询的时候,其实也会使用TCP协议,比如在涉及大量数据传输或对传输可靠性有较高要求的场景,DNS查询就更倾向于使用TCP协议替代默认的UDP协议,以保证数据的完整性和可靠性。

  1. Zone Transfer(区域传输) 当一台DNS服务器需要从另一台服务器获取一个完整的区域数据库的副本时,需要使用TCP协议进行区域传输。区域数据量往往较大,使用UDP可能由于报文长度限制而被截断。
  2. DNS动态更新 当需要动态添加、修改或删除DNS记录时,为了保证更新操作的可靠性和原子性,通常会使用TCP协议。
  3. 查询响应超长 当DNS查询的响应超过了UDP报文最大长度(通常为512字节)限制时,DNS服务器会自动切换到TCP协议传输响应数据。较长的响应一般出现在存在大量Additional区域数据的情形。

3. 前端可以做哪些DNS查询优化?

  1. 使用link rel="dns-prefetch"预解析DNS
html
<link rel="dns-prefetch" href="//example.com">

当需要加载该域名资源时已经完成了DNS解析,可以减少DNS查询延迟。但需要权衡是否增加了不必要的DNS查询开销。

  1. 使用HTTP/2

HTTP/2支持多路复用,一个连接可以并行加载多个资源,从根本上减少了DNS查询的数量。但需要服务端和客户端都支持HTTP/2。

  1. CDN分发

利用CDN进行资源分发,客户端就近访问节点,可以减少DNS查询的跨网络延迟