客户端开发的同学对于https,http2(后面简称H2),安全,DNS,CDN等不一定都擅长,这是多种原因导致的,今天我们来聊聊HTTPDNS
DNS解析本质上是localDNS的解析,说白了,你给它一个域名,它返回给你一个IPlist
HTTPDNS是使用http请求替换域名解析的过程,但一般这个http请求都是基于https的,且是IP直连的,这样我们就保证了,这个解析域名的http请求不会被劫持并且内容安全
我们一般在客户端上做HTTPDNS服务的解决方案的时候,策略可简单可复杂,但大体要围绕以下几个问题,一,数据要预先获取,二,运营商变化的时候要更新数据,三,为了提升获取ip的成功率要有过期数据的预取策略,四,当由于种种原因,获取不到HTTPDNS的IP时,要降级为获取localDNS的IP
iOS网络库没有Android的网络库订制的那么深度,其实就是AFNetworking和okhttp的差距,所以针对HTTPDNS的网路库适配(我们后面叫最佳实践)iOS会更加原始一些,它处理的问题大致有以下几类
一,域名替换IP,防止劫持的关键就是不采用域名请求,取而代之的是IP直连
二,https的处理,由于替换了IP,https可信任域名检验机制获取不到域名
三,HTTP Proxy的处理,当iOS网络切换成HTTP代理后,由于替换了IP会导致连接失败,一般的处理方式是关闭HTTPDNS服务
四,Cookie的处理,由于替换了IP,导致Cookie的domain获取不到,从而使Cookie失效
五,IPV6的处理,苹果在2016年强制推行的IPV6,由于我们切换成IP直连的方式,所以会在iOS8.4以下的版本,IPV6-only的网络环境下连接失败,苹果官方的建议采用getAddressInfo方法解决这个问题,但这个方法在iOS9.2后才支持将一个IPV4的IP转成一个IPV6的IP,所以我们一般会在这种情况下降级
六,UIWebView/WKWebView的处理,不管是哪种WebView,我们都可以采用苹果的黑科技NSURLProtocol进行网络层面的拦截,从而接管WebView的网络能力,从而支持WebView的DNS反劫持
以上处理或粗暴或精细,但基本是这些方向
以上不包含H2的最佳实践
写在最后的话,以上篇幅虽少,但都是干货,实际落地时还是有很多坑,在此不多赘