浅聊DNS
最近遇到一些用户反馈加载网页(首页加载)很慢,技术支持同事远端支持发现这部分用户大多数都是使用一些比较差(不知名)的运营商网络,而技术支持同事一般的解决方案则是配置本地DNS,所以近期梳理了一些关于DNS的知识以作补充。
本文行文包括如下四点:
1、什么是DNS
2、DNS解析的基本过程
3、DNS的主要问题
4、HttpDNS
什么是DNS
DNS,全称Domain Name Server, 中文译为 域名系统。它的核心服务是提供域名到IP的映射,所以本质上是一个数据库。
工作原理如下:
image.png
域名系统的基本结构:
image.png
DNS解析的基本过程
- 浏览器中输入 www.baidu.com
- 本机的域名解析器(resolver)程序会查询本地缓存/host文件等是否有该域名的IP映射关系,如果有则返回该IP,解析完成
- 否则,向本地域名解析服务器(Local DNS 服务器,是TCP/IP参数设置的首选DNS服务器)发起域名解析请求。
- Local DNS 服务器查询是否有该域名与IP的映射关系,如果有,则返回给客户机并完成解析。
- 否则,根据 Local DNS 服务器的设置(是否递归)进行查询
- 如果未用开启模式,Local DNS 就把请求发至13台 Root DNS服务器。
- 如果用的是递归模式,此 DNS 服务器就会把请求转发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环
- Root DNS 服务器收到请求后会根据域名进行处理,先检查是否有该域名的IP映射关系,有则返回给Local DNS 服务器,再返回给客户机完成解析,否则返回该域名对应的顶级DNS服务器的某一个IP
- Local DNS 服务器收到 IP 信息后,会向该IP发起请求
- 顶级 DNS 服务器收到请求后会根据域名进行处理,先检查是否有该域名的IP映射关系,有则返回给Local DNS 服务器,再返回给客户机完成解析,否则返回该域名对应的权威DNS服务器的某一个IP
- Local DNS 服务器收到IP信息后,会向该IP发起请求
- 权威 DNS 服务器收到请求后会根据域名进行处理,先检查是否有该域名的IP映射关系,有则返回给Local DNS 服务器,再返回给客户机完成解析。如果是有二级派生域名,比如top.baidu.com这样的,则可能需要继续返回其他的权威DNS服务器进行解析。
- Local DNS 服务器收到IP后对该域名与IP建立映射关系并缓存
- Local DNS 服务器同时将结果返回给本机域名解析器
- 本机域名解析器(resolver)将会缓存该结果,并将该结果返回给浏览器
- 浏览器获取IP后,向该IP地址所在服务器发起请求
基本过程如下:
image.png
其中要关注一个问题:
1、递归查询,是指本地DNS服务器向根域名系统发起递归查询,会走跟域名系统,顶级域名系统到权威系统的过程
2、迭代查询,是指本地DNS服务器向其他DNS解析器发起查询,由其他DNS服务器进行解析或者进行递归/迭代查询
DNS的主要问题
1、域名缓存
2、解析转发
3、LocalDNS递归出口NAT
域名缓存
从DNS解析查询流程去看,域名缓存是每个域名服务器都会有的能力。
域名缓存会带来什么问题呢
缓存的域名并不是一个最合适的域名。比如一个深圳的用户由于某些原因缓存到了北京节点的IP。所以域名缓存可能导致全局域名解析失效,进而导致流量调度失效。
为什么需要进行域名缓存?
- 1、每一次都进行全流程解析,链路太长了,缓存让域名解析快速完成
- 2、保证用户访问流量在本网内消化:国内的各互联网接入运营商的带宽资源、网间结算费用、IDC机房分布、网内ICP资源分布等存在较大差异。为了保证网内用户的访问质量,同时减少跨网结算,运营商在网内搭建了内容缓存服务器,通过把域名强行指向内容缓存服务器的IP地址,就实现了把本地本网流量完全留在了本地的目的
解析转发
除了域名缓存以外,运营商的LocalDNS还存在解析转发的现象。解析转发是指运营商自身不进行域名递归解析,而是把域名解析请求转发到其它运营商的递归DNS上的行为。
正常的域名解析,是本地域名解析可以直接向权威域名系统发起请求,一般的权威域名系统会根据请求的IP进行解析,并根据请求的IP携带的信息,比如所在区域,从而返回距离用户最近的IP节点。(这样的技术方案称为全局负载均衡,GSLB)
当本地DNS服务器设置了非递归模式,它自己不进行域名解析,而是会把域名解析请求转发给其他运营商(本运营商远端)的递归DNS服务器上,这样的话,这部分流量就可以被合作的运营商所拿下(或者请求带远端的IDC上)
image.pngLocalDNS递归出口NAT
LocalDNS递归出口NAT指的是运营商的LocalDNS按照标准的DNS协议进行递归,但是因为在网络上存在多出口且配置了目标路由NAT,结果导致LocalDNS最终进行递归解析的时候的出口IP就有概率不为本网的IP地址。
image.png总结
当DNS服务器发起递归查询时的IP地址非常重要,不管解析出别的运营商地址,还是远端地址,都是不可取的,且全局流量调度失效简直就是灾难。
HttpDNS
域名解析既然有这么多坑,那有没有一种更好的解决方案,可以绕过Local DNS 服务器直接由GSLB来进行解析处理呢?
常见的,低成本又高效的解决方案是HttpDNS。通俗的解释,客户端使用Http协议请求自身部署的DNS服务器进行解析。
HttpDNS的优势
- 从根本上解决了运营商域名劫持的问题,因为绕过了Local DNS
- 流量调度更加精确,相比运营商的提供的DNS解析而言,在解析转发与NAT出口问题下GSLB可能会失效。而HttpDNS由于直接通过IP地址请求DNS服务器进行解析,所以与不存在转发问题,也不存在运营商DNS服务器NAT出口问题。
- 成本低廉,主要体现在接入成本低,高效。
- 可扩展性强,通过Http协议可以做更加精确的流量调度
- 高可用,HttpDNS使用了Anycast IP网络,正常情况下可以实现对不同地域用户使用同一IP提供服务,在单个节点出现故障的情况下,无缝切换到其他节点,实现了高可用。在节点内部,依托阿里云优质的网络环境和负载均衡技术,HttpDNS服务端集群化部署,保障服务可用性。
参考阿里云HttpDNS:https://help.aliyun.com/document_detail/150646.html?spm=5176.10695662.5694434980.5.faa977686lkw70