DNS解析原理

什么是DNS

DNS(Domain Name System,域名系统),互联网上域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。

域名系统结构

  1. 根域名服务器:根域名服务器是最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。
  2. 顶级域名服务器: 这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当找的域名服务器的IP地址)。
  3. 权限域名服务器:这是负责一个区的域名服务器。当一个权限域名服务器还不能给出最后的查询回答时,就会告诉发出查询请求的DNS客户,下一步应当找哪一个权限域名服务器。
  4. 本地域名服务器:本地域名服务器并不属于域名服务器层次结构,但它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。

域名记录类型

A记录:子域名对应的目标主机地址。目标主机地址类型只能使用IP地址
MX记录:将以该域名为结尾的电子邮件指向对应的邮件服务器以进行处理。
NS记录:解析服务器记录。用来表明由哪台服务器对该域名进行解析。
CNAME 记录:通常称别名指向。目标主机地址只能使用主机名,不能使用IP地址。一个主机地址同时存在A记录和CNAME记录,则CNAME记录不生效。

常见的DNS

权威DNS:权威DNS即最终决定域名解析结果的服务器,开发者可以在权威DNS上配置、变更、删除具体域名的对应解析结果信息。
递归DNS:递归DNS又称为Local DNS,它没有域名解析结果的决定权,但代理了用户向权威DNS获取域名解析结果的过程。递归DNS上有缓存模块,当目标域名存在缓存解析结果并且TTL未过期时(每个域名都有TTL时间,即有效生存时间,若域名解析结果缓存的时间超过TTL,需要重新向权威DNS获取解析结果),递归DNS会返回缓存结果,否则,递归DNS会一级一级地查询各个层级域名的权威DNS直至获取最终完整域名的解析结果。
公共DNS:公共DNS是递归DNS的一种特例,它是一种全网开放的递归DNS服务,而传统的递归DNS信息一般由运营商分发给用户。Google的8.8.8.8属于公共DNS。

DNS解析过程

图片地址

  1. 浏览器中输入“www.net.compsci.googleplex.edu”,发出解析请求。
  2. 本机的域名解析器( resolver程序)查询本地缓存和host文件中是否为域名的映射关系,如果有则调用这个IP地址映射,完成解析。
  3. 如果hosts与本地解析器缓存都没有相应的网址映射关系,则本地解析器会向TCP/IP参数中设置的首选DNS服务器(我们叫它本地DNS服务器)发起一个递归的查询请求。
  4. 服务器收到查询时,如果要查询的域名由本机负责解析,则返回解析结果给客户机,完成域名解析,此解析具有权威性。如果要查询的域名,不由本地DNS服务器解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
  5. 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否递归)进行查询,如果未用开启模式,本地DNS就把请求发至13台根DNS。如果用的是递归模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。
  6. 根DNS服务器收到请求后会判断这个域名(.edu)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。
  7. 本地DNS服务器收到IP信息后,将会联系负责.edu域的这台服务器。
  8. 负责.edu域的服务器收到请求后,如果自己无法解析,它就会找一个管理.edu域的下一级DNS服务器地址(googleplex.com)给本地DNS服务器。
  9. 当本地DNS服务器收到这个地址后,就会找googleplex.com域服务器,10、11重复上面的动作,进行查询。
  10. 最后compsci.googleplex.edu返回需要解析的域名的IP地址给本地DNS服务器。
  11. 本地域名服务器缓存这个解析结果(同时也会缓存,6,8,10返回的结果)。
  12. 本地域名服务器同时将结果返回给本机域名解析器。
  13. 本机缓存解析结果。
  14. 本机解析器将结果返回给浏览器。
  15. 浏览器通过返回的IP地址发起请求。

递归查询和迭代查询

  • 递归查询:如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步的查询。
  • 迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询,而不是替本地域名服务器进行后续的查询。

由此可见,客户端到本地DNS服务器,本地DNS与上级DNS服务器之间属于递归查询;DNS服务器与根DNS服务器之前属于迭代查询。

实际环境中,因为采用递归模式会导致DNS服务器流量很大,所以现在大多数的DNS都是迭代模式。这也是CDN厂商实现智能DNS的前提。

智能DNS的基本实现原理

智能DNS主要实现的功能是能够判断用户所在的具体运营商和省份,在根据域名的覆盖配置策略,返回应该为用户提供服务的IP地址。例如,当上海电信的用户解析域名时,返回上海电信的ip地址;北京电信的用户访问时,访问北京电信的ip地址。

DNS解析常见问题

  1. 域名缓存
    正常情况下,域名会在各级dns缓存,当缓存超过一个ttl后,解析请求会递归到权威dns上。但是部分运营商有时会恶意缓存dns的解析结果,主要原因:
    保证用户访问流量在本网内消化:国内的各互联网接入运营商的带宽资源、网间结算费用、IDC机房分布、网内ICP资源分布等存在较大差异。为了保证网内用户的访问质量,同时减少跨网结算,运营商在网内搭建了内容缓存服务器,通过把域名强行指向内容缓存服务器的IP地址,就实现了把本地本网流量完全留在了本地的目的。
    推送广告:有部分LocalDNS会把部分域名解析结果的所指向的内容缓存,并替换成第三方广告联盟的广告。
    域名缓存的结果是主要会导致域名更换解析地址后用户不能及时更新导致访问失败。有些缓存服务器只缓存80端口的服务,导致对其他端口的访问失败。另外,当缓存服务器故障时也会影响到用户的正常访问。

  2. 解析不精准
    解析转发:运营商自身不进行域名递归解析,而是把域名解析请求转发到其它运营商的递归DNS上的行为。通常小运营商会将解析请求转发到其他运营商的递归dns上。这样导致权威dns服务器无法获取客户端的运营商信息。
    出口NAT:运营商的LocalDNS虽然是按照标准的DNS协议进行递归,但是因为在网络上存在多出口且配置了目标路由NAT,结果导致LocalDNS最终进行递归解析的时候的出口IP就有概率不为本网的IP地址。

  3. 解析延迟高
    DNS首次查询或缓存过期后的查询,需要递归遍历多个DNS服务器以获取最终的解析结果,这增加了网络请求的前置延时时间。特别是在移动互联网场景下,移动网络质量参差不齐,弱网环境的RTT时间可能高达数百毫秒,对于一次普通的业务请求而言,上述延时是非常沉重的负担。另一方面,弱网环境下的解析超时、解析失败等现象屡见不鲜。

HttpDNS原理

客户端以HTTP的形式通过IP请求域名,并带上一些参数。服务器根据户端地理位置、运营商信息以及给定的参数进行精准调度,给出最优的ip或者IP列表。

HttpDNS主要解决的问题

  1. LocalDNS劫持:由于HttpDNS是通过ip直接请求http获取服务器A记录地址,不存在向本地运营商询问domain解析过程,所以从根本避免了劫持问题。 (对于http内容tcp/ip层劫持,可以使用验证因子或者数据加密等方式来保证传输数据的可信度)
  2. 平均访问延迟下降:由于是ip直接访问省掉了一次domain解析过程,(即使系统有缓存速度也会稍快一些‘毫秒级’)通过智能算法排序后找到最快节点进行访问。
  3. 用户连接失败率下降:通过算法降低以往失败率过高的服务器排序,通过时间近期访问过的数据提高服务器排序,通过历史访问成功记录提高服务器排序。如果ip(a)访问错误,在下一次返回ip(b)或者ip(c) 排序后的记录。(LocalDNS很可能在一个ttl时间内(或多个ttl)都是返回记录。

参考:
DNS101
全局精确流量调度新思路-HttpDNS服务详解
移动互联网时代,如何优化你的网络 —— 域名解析篇
企业级移动应用如何优化域名解析和业务访问