DNS学习笔记

一、DNS的作用

  在网络世界中,不同的机器之前互相通讯,使用的IP地址和MAC地址。但是IP地址和MAC地址对人来说,并不友好,一串数字难以记忆,并且很多IP地址是动态变化的。因此需要给一些固定的服务器不会变化的域名(例如:www.baidu.com,www.taobao.com)。想要访问该网络的用户只需要记住域名,通过域名系统(DNS: Domain Name System,一种基础UDP实现的应用层协议)就能获取到域名对应的IP地址,对于用户而言,使用的是便于记忆的域名地址,对于机器而言,使用的依然是IP地址进行互相通信。

  我们可以在命令窗口里用nslookup命令查询DNS的解析结果。如下图1

 (图1)

  nslookup www.baidu.com 之后的结果,其中service和address的地址是192.168.3.2,这个地址是局域网内无线路由的IP。Non-authoritative answer表示本地解析不是通过权威服务器返回的,来源本地域名服务器缓存。解析结果里面 www.baidu.com被CNAME到www.a.shifen.com(真实域名),最后解析出www.a.shifen.com的地址的两个IP。

二、DNS解析过程

  假设现在往电脑的浏览器上输入www.baidu.com时,DNS要将当前域名解析为IP地址时,大致需要进行以步骤,如图2。

(图2)

  1、查询浏览器缓存,每种浏览器对DNS的缓存时间各不相同,有的几十秒,有的几分钟,有的几十分钟

      2、查询本机缓存(),缓存为空时也会查询/etc/hosts文件,本地缓存可通过命令清除,比如windows 的(ipconfig/flushdns),mac的 sudo killall -HUP mDNSResponder

  3、如果缓存中查询不到,则到本地域名服务器上进行查询(),一般来说,本地域名服务器可以简单理解为ISP(Internet Service Provider)的DNS服务器,ISP即常见的如移动/联通/电信。所以一般对应的本地域名服务器,正常情况下,都是在用户所属运营商的机房里。

      4、当本地域名服务器中的DNS缓存中查询不到该域名和IP地址的映射信息,本地域名服务器则递归地查询域名服务器。首先会先向根域名服务器查询.com的顶级域名服务器的地址(),跟域名服务器会返回一批顶级域名(.com)服务器所对应的地址(),让本地服务器去咨询去顶级域名服务器。根域名服务器全球一共有十三套(a.root-services.net -  m.roolt-service.net),分布在全球不同的地方,由不同的机构进行维护。

  5、本地域名服务器会从获取到顶级域名服务器中选择一个进行询问:.baidu.com的权威服务器地址在哪里?(),顶级域名服务器一样将.baidu.com所对应的权威域名服务器的地址返回给本地域名服务器(),一般也是多个。

  6、一般情况,权威域名服务器是域名注册商的DNS服务器,本地域名服务器选择一个权威域名服务器发送请求(),权威域名服务器返回最终的地址或者CNAME将域名指向负载均衡器()。常见的如CDN,就是通过DNS的权威域名服务器将域名CNAME到CDN的域名上。

  7、本地域名服务器会访问全局负载均衡器()。全局负载均衡器会根据访问方的运营商和地理位置,挑选最合适的一个或者多个地址返回给本地域名服务器(),最后由本地域名服务器返回给应用方()。

  

  通过在命令窗口输入dig www.baidu.com +trace 命令可以大概看到这个流程

(图3) 

    1、首先本地域名服务器获取十三个根域名服务器

        2、选择一个根域名服务器(j.root-servers.net)查询获取到.com的顶级域名服务器

        3、再选择一个顶级域名服务器(d.gtld-servers.net)查询获取到.baidu.com的权威域名服务器

        4、再选择一个权威域名服务器(ns7.baidu.com) 查询到www.baidu.com对应的信息,因为第一条记录为www.baidu.com 通过CNAME 指向到www.a.shifen.com,因此本地DNS服务器会再对www.a.shifen.com进行一次域名解析

        5、再次对www.a.shifen.com进行域名解析,最终得到对应的IP地址如(图4),一般情况CNAME不宜过长,CNAME次数过多,会导致域名的解析时间变长。

 (图4)

 

三、HTTPDNS

  传统的DNS大部分情况下可以满足要求,但是也存在一些弊端。比如:

  • DNS劫持问题:黑客通过攻击用户路由器或者DNS服务器,将用户引导向钓鱼网站,窃取用户信息,如银行卡等。
  • 域名缓存无法定制的问题:本地域名服务器的缓存,无法精细将用户引导到最适合的地方,并且缓存过长也可能导致用户访问到的不是最新的数据
  • 有些小运营商转发域名解析给大运营商,导致用户访问服务跨运营商,网络传输效率低,影响体验
  • 长链路的域名递归解析可能导致的高耗时

 

  为了解决DNS可能存在的问题,就有了HTTPDNS。HTTPDNS通过自建基于HTTP协议的DNS服务器集群,部署在不同的运营商和网点上,可以自己定制缓存、负载均衡等规则,让用户的DNS解析获取到最合适的访问地址。

 

  HTTPDNS一般流程

  1. 查询客户端本地DNS缓存,如果缓存存在并且未过期,则不进行查询,使用缓存数据直接访问
  2. 如果缓存不存在或者过期,则查询HTTPDNS服务器,HTTPDNS服务器返回域名对应的IP地址,客户端将结果保存到缓存中
  3. 通过IP地址访问域名指向的服务器

   因为客户端可以直接获取到用户所在地址、运营商信息等信息,因此将用户的网络信息提交到HTTPDNS服务器是时,HTTPDNS服务器可以根据用户的网络情况,综合用户与服务器距离、网络运营商、服务器的近一段时间的表现等情况,返回最合适的服务器集合,实现负载均衡和智能调度。而客户端可以自定义缓存策略,缓存不再依赖于域名商的本地域名服务器,DNS缓存策略可以根据具体情况定制,更加灵活。

  上面的第二步,客户端需要去查询HTTPDNS服务器,客户端是怎么知道HTTPDNS服务器对应的地址?一种方式是将HTTPDNS服务器的IP地址写死,保证HTTPDNS服务器的IP地址不会变化。 二是第一次访问HTTPDNS服务器的时候使用的是DNS协议,通过DNS获取到HTTPDNS服务器之后,后续的再查询不再使用DNS,改用HTTPDNS协议。当然,HTTPDNS服务器除了需要做集群来保证可用性以外,如果客户端访问HTTPDNS失败之后需要自行降级使用DNS协议,防止因为HTTPDNS服务器可不用,导致整个项目出现问题。

  目前HTTPDNS只适用于客户端,浏览器上无法使用HTTPDNS协议。

posted on 2021-11-30 19:55  阿姆斯特朗回旋炮  阅读(704)  评论(0编辑  收藏  举报

导航