APP端的网络优化(DNS优化,HTTP优化)

1、使用httpDNS优化DNS解析和缓存java

  通常来讲在App内用域名发送请求都要通过DNS解析出ip,而后再根据ip去拿对应的资源,这个过程当中,若是LocalDNS中存在这个域名对应的ip,就会直接返回这个ip,相似于App内作缓存。若是不存在,才会去权威DNS查询改访问哪一个ip,而后查询到的ip会在LocalDNS中作缓存。也就是说,若是咱们要访问新浪http://api.weibo.cn,若是LocalDNS里面有该域名对应的ip,就直接返回了ip了。(DNS基础知识:http://www.jianshu.com/p/a73e963b63b1python

 

  一、这里存在两个问题c++

    若是以前访问api.weibo.cn的是联通用户,如今新用户使用电信来访问api.weibo.cn,因为localDNS缓存的存在,不会去查询新浪的权威DNS,这样返回的ip是联通这个运营商的ip,从而会使得用户出现访问变慢等情况。缓存还会致使一点就是,当权威DNS将域名与ip的映射发生改变以后,因为LocalDNS缓存没有及时改变,用户就会访问到错误的服务器,或者直接访问不到资源。web

    不少三四级运营商会把运营解析指向他们的缓存服务器上,并把网页里面的广告替换成他们本身的,或者内嵌他们本身的广告。(以前作的APP出现过这样的状况,投诉以后会好上一段时间,可是过段时间又会出现广告)。编程

 

    居然DNS解析存在问题,那有没有一种调度精准、成本低廉、配置方便的基于域名的流量调度系统呢?答案是确定的。HttpDNS基于Http协议和域名解析的流量调度解决方案,能够在很大程度上防止上面的问题出现。json

  HttpDNS原理:api

    A、客户端直接访问HttpDNS接口,获取业务在域名配置管理系统上配置的访问延迟最优的IP。(基于容灾考虑,app内确定是须要保留使用运营商LocalDNS解析域名方式的。)数组

    B、客户端向获取到的IP后就向直接往此IP发送业务协议请求。以Http请求为例,经过在header中指定host字段,向HttpDNS返回的IP发送标准的Http请求便可。缓存

  总的来讲,采用HttpDNS来解析域名,就绕过了三四级运营商解析域名会出现的问题,在HttpDNS返回了正确的ip以后,咱们是直接采用ip去进行http请求,只须要关注通讯内容的安全便可。安全

 

  二、基于HttpDNS扩展

    A、在App内维护一个Serve IP List。把每次App从HttpDNS取到的ip存储进入该数组,并设置权重,理论上来讲从HttpDns解析下来的ip权重是最大的。这个List能够在App启动的时候,进行更新,同时取出本地缓存的Serve IP List的权重最大的ip进行数据的初始化操做(若是第一次启动,没有该List的话,就使用LocalDNS进行解析)。

      Serve IP List里面的权重设置机制,很明显的一点就是从DNS解析出来的ip具备最大的权重,每次从List里面取ip应该要取权重最大的ip。列表中的ip也是须要能够动态更新配置的,根据链接或者服务的成功失败来进行动态调整,这样即便DNS解析失败,用户在一段时间后也会取到合适的ip进行访问。

    B、对ip进行数据统计。在全部app内统计每一个ip进行请求所需平均时间、最长时间、最短期、请求成功次数、失败次数,须要注意的是,要区分网络环境进行统计,Wifi、4G、3G,对在不一样的网络环境下数据优秀的ip进行存储,下发到App里面使用起来。这样每次启动App时能够对收集起来的ip根据不一样的网络环境进行测速,选择最好的ip进行请求。须要注意的是,在网络环境切换的时候,必需要从新进行速度测试。作到这一步,能够节约DNS解析时间,以及劫持的问题。

 

    C、将图片、音频等资源放到单独的服务器里面,与其余资源分开。

      第一个是多个域名能够增长并行下载条数,由于客户端对同一个域的域名下载条数是有限制的,因此多个域就会增长并行下载条数,从而加快加载速度。固然二级域名也不能使用太多,由于太多要考虑到dns的解析花费的时间。
      第二个是方便管理,通常来讲,图片在站点的加载中是最占带宽的,能够用独立服务器方便后期管理;还可使用异步加载的方式,加强用户体验。同时是图片可能是静态内容,能够更好的使用CDN加速。
      第三是若是使用了独立服务器的话,在安全设置上能够有差异的针对设置,非常方便。

    D、在防止劫持这一块,须要注意把资源的后缀名去掉,好比说.mp3\.json这样的后缀,以避免击中运营商的拦截。

 

2、资源优化

  资源优化基本就是尽量的缩小传输数据的大小,首先是图片大小的解决方案。

    一、在必定程度上使用webp来代替jpg、png图片

          

    上图就是各类图片同等质量下的大小,其中webp是最小的。当咱们下载图片展现的时候,若是在必定程度上使用webp图片,就能大大减小用户流量的损失,以及下载图片的所需时间。

    通常来讲,会在App内固定使用几种尺寸来作展现图,好比说,banner图是640*640,cell展现图多是320*320、280*280,相似头像的多是80*80等。须要注意的是,webp的图片要经过解析才能成为可用的jpg图片,在iOS开发中,可使用SDWebImage框架进行解析,webp->NSData->Image,app内解析是确定须要花费必定时间和性能的。

    根据实际使用的反馈状况,发如今wifi条件下,超过300*300的图片使用webp图片,解析时间+下载时间是比直接使用jpg\png图片要快的,而且在流量方面也是消耗很小。低于300*300的能够直接下载使用jpg\png图片。

    在4G条件下,用户可能会对流量比较敏感,建议都走webp图片。

 

    二、可使用ProtocolBuffer代替Json进行数据传输

    Protocolbuffer(简称Protobuf或PB)是由Google推出的一种数据交换格式,它独立于语言,独立于平台。Google 提供了三种语言的实现:java、c++ 和 python,每一种实现都包含了相应语言的编译器以及库文件。能够把它用于分布式应用之间的数据通讯或者异构环境下的数据交换。与传统的XML和JSON不一样的是,它是一种二进制格式,免去了文本格式转换的各类困扰,而且转换效率很是快,因为它的跨平台、跨编程语言的特色,让它愈来愈普及,尤为是网络数据交换方面日趋成为一种主流。

    在tcp中,咱们可使用 ProtocolBuffer代替Json进行数据传输,由于ProtocolBuffer数据比Json更小,也是跨平台的,序列号与反序列化也很简单。在实际项目中,当数据变小的时候会显著提升传输速度。

相关文章
相关标签/搜索