前言小计在 App 访问网络的时候,DNS 解析是网络请求的第一步,默认我们使用运营商的 LocalDNS 服务。有数据统计,在这一块 3G 网络下,耗时在 200~300ms,4G 网络下也需要 100ms。 解析慢,并不是 LocalDNS 最大的问题,它还存在一些更为严重的问题,例如:DNS 劫持、DNS 调度不准确(缓存、转发、NAT)导致性能退化等等,这些才是网络优化最应该解决的问题。 想要优化 DNS,现在最简单成熟的方案,就是使用 HTTPDNS。 今天就来聊聊,DNS、HTTPDNS 本文已在在公众号【Android开发编程】发表 一、什么是DNS DNS(Domain Name System)是域名系统的英文缩写,是一个组织的系统管理机构,维护系统内的每一个主机的ip和主机名(域名)的对应关系;DNS即域名解析系统,这个东西说对于开发者来说,应该是没有不知道的。说简单点,这个系统的作用就是将域名解析成IP地址。我们的每一次网络请求,如果是使用域名,那么就是进行域名解析;一个优秀的域名服务应该能够满足两点要求,一个是能够正确的返回IP地址,二就是能够根据网络情况返回所请求的域名最近的服务器IP; 二、DNS域名结构 1、DNS域名命名每个域名都是一个标号序列,用字母、数字和连接符(-)组成;标号序列总长度不能超过255字符,每个标号都可以看成一个层次域名;级别最低的域名写在左边,级别最高的域名写在右边;域名服务主要通过UDP实现,服务器的端口为53; 2、域名的分级 域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域名、二级域名、三级域名等 顶级域名可以分为三大类: 国家顶级域名:cn、us、uk等 通用域名:常见的有7个,com、net、org、edu、int、gov、mil 方向域名: arpa,用于将ip地址转为域名 域名服务器 域名服务器按照由高到低进行层次划分: 注意: 一个域名服务器所负责的范围,称为区 三、域名解析过程 域名解析的重要两点:主机向本地域名服务器查询一般都是采用递归查询。所谓递归查询就是:如果主机所查询的本地服务器不知道被查询的域名的ip地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文(即代替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的ip地址,或者是报错,表示无法查询到所需的ip地址;本地域名服务器向根域名服务器的查询是迭代查询。所谓迭代查询就是:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所查询的ip地址,要么告诉本地服务器:"你下一步应当向哪一个域名服务器进行查询"。然后让本地域名服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的ip地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的ip地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的ip地址或者报错,然后把这个结果返回给发起查询的主机; 以上两点是域名解析的重要两步。但是这并不是解析ip地址的完整过程,如果浏览器的缓存中有该域名对应的ip地址,就不需要向本地域名服务器请求了等等。下面来看详细过程: 例如要解析:www.example.com该域名的ip地址;浏览器缓存:当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的ip地址;操作系统缓存:当浏览器缓存中无域名对应IP则自动检查用户计算机系统hosts文件,看是否有该域名对应的ip地址;路由器缓存:当浏览器及系统缓存中都没有域名对应ip地址,则进入路由器缓存中检查。以上三点都是客户端的DNS缓存;ISP(网络服务提供商)的LDNS(本地域名服务器):如果上述三点都没有找到对应的地址,就要本地域名服务器中进行查询。比如你是电信的网,则会进入电信的DNS缓存服务器进行查找;根域名服务器:本地域名服务器没有找到,本地域名服务器就会到根域名进行查询。全球仅有13台根域名服务器。根域名服务器收到请求后,会查看区域文件记录,若无则将其管辖下的对应的顶级域名的ip地址,这里返回.com的地址;顶级域名服务器:根域名服务器没有,则本地域名服务器向顶级域名服务器发送请求,然后返回次级域名服务器的ip地址,这里会返回.example的地址;主域名服务器:主域名服务器接收请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确记录。保存结果至缓存:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个ip地址与web服务器建立连接; 四、DNS安全和优化 1、dns安全问题DNS反射/放大攻击;DDOS攻击可能造成域名解析瘫痪;DNS/域名劫持:在劫持的网络范围内拦截域名解析的请求,分析请求的域名,返回假的ip地址或者使请求失去响应。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现;DNS污染:DNS污染是当用户发起域名解析请求时,某个服务器(非DNS)监控到用户访问的已经被标记的地址时,该服务器伪装成DNS服务器向用户发回错误的地址;DNS污染与DNS劫持的区别:DNS劫持修改了dns解析的结果,DNS污染是不经过DNS服务器的,而是直接返回了错误的地址;DNS信息被修改; 2、DNS优化 DNS解析是一个漫长的过程,那么它的优化有哪些? 1、网页端 用户在请求请求某个链接之前,浏览器先尝试解析该链接的域名再将其进行缓存。 可以这样做: (1) 在服务器中响应设置X-DNS-Prefetch-Control的值为on启动预解析 (2) 在HTML中,