当前位置: 首页 > 科技观察

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

时间:2023-03-13 00:05:06 科技观察

本文转载自微信公众号《Android开发编程》,作者Android开发编程。转载本文请联系Android开发编程公众号。前言小计App访问网络时,DNS解析是网络请求的第一步。默认情况下,我们使用运营商的LocalDNS服务。据统计,在这种3G网络下,需要200~300ms,4G网络下也需要100ms。解析慢并不是LocalDNS最大的问题。它还存在一些比较严重的问题,比如:DNS劫持、不准确的DNS调度(缓存、转发、NAT)导致性能下降等,这些都是网络优化最应该解决的问题。优化DNS,最简单成熟的方案就是使用HTTPDNS。今天来说说DNS、HTTPDNS一、什么是DNSDNS(DomainNameSystem)是DomainNameSystem的英文缩写。是一个组织的系统管理组织,维护着系统中各个主机的ip和主机名(域名)的对应关系;DNS就是域名解析系统,开发者应该都知道。简单来说,这个系统的作用就是将域名解析成IP地址。对于我们的每一次网络请求,如果使用了域名,则进行域名解析;一个优秀的域名服务应该能够满足两个要求,一是能够正确返回IP地址,二是能够根据网络情况返回请求的域名最近的服务器IP;二、DNS域名结构1、DNS域名命名。每个域名都是一个由字母、数字和连字符(-)组成的标签序列;标签序列的总长度不能超过255个字符,每个标签可以视为一个层次域名;级别最低的域名写在左边,级别最高的域名写在右边;域名服务主要通过UDP实现,服务器端口为53;2.域名的层级域名可以划分为各种子域,子域还可以进一步划分为子域的子域,从而形成顶级域名、二级域名、三级域名等.;顶级域名可分为三类:国家顶级域名:cn、us、uk等;通用域名:常见的有7个,com、net、org、edu、int、gov、mil;directiondomainname:arpa,用于将ip地址转换为域名;域名服务器;3、域名解析过程中域名解析的两个要点:host对本地域名服务器的查询,一般都是递归查询。所谓递归查询就是:如果主机查询的本地服务器不知道被查询域名的ip地址,那么本地域名服务器会作为DNS不断向其他根域名服务器发送查询请求报文客户端(即继续查询而不是主机)),而不是让主机自己进行下一次查询。所以递归查询返回的查询结果要么是要查询的ip地址,要么报错,查询不到需要的ip地址;从本地域名服务器到根域名服务器的查询是一个迭代查询。所谓迭代查询就是:当根域名服务器收到本地域名服务器发送的迭代查询请求报文时,要么给出要查询的ip地址,要么告诉本地服务器:“哪个域名服务器应该你接下来查询”。然后让本地域名服务器进行后续的查询。根域名服务器通常会把自己知道的顶级域名服务器的ip地址告诉本地域名服务器,然后让本地域名服务器去查询顶级域名服务器。顶级域名服务器收到本地域名服务器的查询请求后,要么给出要查询的IP地址,要么告诉本地服务器下一步授权哪个域名服务器查询。最后知道要解析的IP地址或报错,然后将结果返回给发起查询的主机;以上两点是域名解析的两个重要步骤。但这并不是解析ip地址的完整过程。如果浏览器的缓存中有域名对应的ip地址,就不需要去请求本地的域名服务器等等。下面看详细过程:比如解析:域名www.example.com的ip地址;IP地址;操作系统缓存:当浏览器缓存中没有该域名对应的IP时,会自动检查用户电脑系统的hosts文件,看是否有该域名对应的ip地址;路由器缓存:当浏览器中没有对应的域名和系统缓存的ip地址时,进入路由器缓存查看。以上三点是客户端的DNS缓存;ISP(InternetServiceProvider)的LDNS(LocalDomainNameServer):如果以上三点都没有找到对应的地址,就要在本地域名服务器中查询。比如你在中国电信的网络,就进入中国电信的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中添加链接标签:如但是,目前的Chrome浏览器会自动预取当前页面所有带href的dns。需要手动添加上述链接标签的场景是:您之后访问的域名不在当前页面的所有链接中;正确使用link标签的姿势:静态资源的域名手动dns-prefetchjs中发起的跳转和请求手动dns-prefetch手动dns-prefetch新域名手动dns-prefetch重定向和跳转。当前页面的超链接不需要手动做dns-prefetch域名收敛:建议静态资源只放在一个域名下,可以减少DNS流量请求2.客户端HttpDNSHttpDNS直接使用HTTP协议请求阿里云HTTPDNS服务器的80端口,代替传统的DNS协议请求LDNS服务器的53端口。这样就可以绕过LDNS,避免域名劫持和运营商调度不准确的问题;5、HttpDNS简介HttpDNS其实是实现DNS解析的另一种方式。只是把域名解析协议从DNS改成Http协议,并不复杂。使用HTTP协议向D+服务器的80端口请求,而不是传统的DNS协议向DNS服务器的53端口请求,绕过了运营商的LocalDNS,从而避免了使用造成的劫持和跨网问题运营商的本地DNS;访问HttpDNS也很简单。使用普通DNS时,客户端发送网络请求时,直接发送。有一个域名解析的底层网络框架。访问HttpDNS时,需要发送HTTP请求进行域名解析。当客户端获取到域名对应的IP后,直接向该IP发送业务协议请求;这样就不用再考虑传统的DNS解析了。带来的那些问题,因为使用的是HTTP协议,所以不用担心域名劫持;而且,如果选择好的DNS服务器提供商,也能保证用户引导访问速度最快的IDC节点先连接到HttpDNS;总结:关于网络优化的知识点很多。今天我们主要介绍一下dns的知识点。下期我们会继续介绍Android网络优化的具体实施方案。