Android性能优化之网络优化DNS和HttpDNS知识详解

移动开发 Android
在 App 访问网络的时候,DNS 解析是网络请求的第一步,默认我们使用运营商的 LocalDNS 服务。有数据统计,在这一块 3G 网络下,耗时在 200~300ms,4G 网络下也需要 100ms。

[[413589]]

本文转载自微信公众号「Android开发编程」,作者Android开发编程  。转载本文请联系Android开发编程公众号。

前言小计

在 App 访问网络的时候,DNS 解析是网络请求的第一步,默认我们使用运营商的 LocalDNS 服务。有数据统计,在这一块 3G 网络下,耗时在 200~300ms,4G 网络下也需要 100ms。

解析慢,并不是 LocalDNS 最大的问题,它还存在一些更为严重的问题,例如:DNS 劫持、DNS 调度不准确(缓存、转发、NAT)导致性能退化等等,这些才是网络优化最应该解决的问题。

想要优化 DNS,现在最简单成熟的方案,就是使用 HTTPDNS。

今天就来聊聊,DNS、HTTPDNS

一、什么是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中,

(3) 在head中加入link标签:

  1. 如<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网络优化的具体实现方案

 

责任编辑:武晓燕 来源: Android开发编程
相关推荐

2021-07-29 14:20:34

网络优化移动互联网数据存储

2022-02-16 14:10:51

服务器性能优化Linux

2021-11-29 11:13:45

服务器网络性能

2019-12-13 10:25:08

Android性能优化启动优化

2011-06-14 14:32:46

性能优化

2013-02-20 14:32:37

Android开发性能

2013-09-17 10:32:08

Android性能优化数据库

2023-07-10 16:18:18

性能优化开发

2017-01-15 15:13:37

Android性能优化优化点

2015-09-16 14:37:50

Android性能优化运算

2015-09-16 15:48:55

Android性能优化电量

2015-09-16 13:54:30

Android性能优化渲染

2010-03-02 09:53:14

MySQL性能优化

2024-03-07 11:03:21

ElasticseaES索引

2017-12-23 14:38:41

Android编程开发优化

2019-09-25 08:03:21

Android加速Google

2009-06-30 11:23:02

性能优化

2018-01-09 16:56:32

数据库OracleSQL优化

2015-09-14 09:45:58

虚拟化网络网络性能

2017-03-29 14:44:20

网络性能优化
点赞
收藏

51CTO技术栈公众号