前言小计
在 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中,<meta http-equiv="x-dns-prefetch-control" content="on">
(3) 在head中加入link标签:
如<link rel="dns-prefetch" href="//tj.koudaitong.com/" />
不过现在的Chrome浏览器会自动将当前页面的所有带href的dns都prefetch一遍。需要手动添加上面的link标签的场景是:你后面访问的域名不在当前页面的所有链接中;
正确使用link标签的姿势:
- 对静态资源域名做手动dns-prefetch
- 对js里发起的跳转、请求做手动的dns-prefetch
- 对重定向跳转的新域名做手动的dns-prefetch
- 不用对当前页面的超链接做手动的dns-prefetch
域名收敛:建议将静态资源只放在一个域名下面,可以减少DNS的请求
2、客户端
HttpDNS
HttpDNS是使用HTTP协议向阿里云的HTTPDNS服务器的80端口直接进行请求,代替传统的DNS协议向LDNS服务器的53端口进行请求。从而可以绕过LDNS,可以避免运行商的域名劫持和调度不精准的问题;
五、HttpDNS介绍
- HttpDNS其实也是对DNS解析的另一种实现方式,只是将域名解析的协议由DNS协议换成了Http协议,并不复杂。使用HTTP协议向D 服务器的80端口进行请求,代替传统的DNS协议向DNS服务器的53端口进行请求,绕开了运营商的Local DNS,从而避免了使用运营商Local DNS造成的劫持和跨网问题;
- 接入HttpDNS也是很简单的,使用普通DNS时,客户端发送网络请求时,就直接发送出去了,有底层网络框架进行域名解析。当接入HttpDNS时,就需要自己发送域名解析的HTTP请求,当客户端拿到域名对应的IP之后,就向直接往此IP发送业务协议请求;
- 这样,就再也不用再考虑传统DNS解析会带来的那些问题了,因为是使用HTTP协议,所以不用担心域名劫持问题了;而且,如果选择好的DNS服务器提供商,还保证将用户引导的访问速度最快的IDC节点上接入HttpDNS之前;
总结:
网络优化的知识点很多,今天主要介绍了dns的知识点
下次继续介绍Android网络优化的具体实现方案
,