移动端为什么需要HTTPDNS?

2,306 阅读6分钟

移动端为什么需要HTTPDNS?

关于这个问题,如果你只能回答出为了防止webview被域名劫持,那这篇文章你就需要好好读一读了。本篇文章将从多个角度 剖析为什么对于移动app来说,HTTPDNS十分必要。

回顾下DNS的原理

要理解为什么移动app需要httpdns,首先要理解DNS的原理,知道DNS的工作模式,以及有什么问题,才能分析出HTTPDNS的优势。

DNS的工作模式:

1.在一台pc上输入 网址 www.taobao.com. 此时这台电脑会发出一个dns请求,注意这个dns请求是被发给本地dns服务器的。

基本上本地dns服务器如果不经过特殊设置的话,我们可以理解为你的网络提供商比如中国电信在你附近设置的一个本地dns服务器

2.这台中国电信的本地dns服务器接收到这条请求以后,就会查看自己的缓存表,如果发现taobao.com这个在缓存表里有,那么就 直接返回ip,如果没有 就只能去根dns服务器查找。这里要注意啊,根域名服务器全球就只有13台,不负责解析dns请求,也就说 这13台服务器不会直接告诉你这个域名的ip地址但是会告诉你去哪里找,类似于你找总统办事,总统不会亲自帮你做事,但是会 找下面的小弟来帮你解决

3.根dns服务器收到请求以后会告诉你 去 顶级域名服务器找,然后顶级域名服务器就告诉你 你去 负责taobao.com的 权威dns 服务器找ip吧。所谓权威dns服务器一般都是大的顶级网站自家会放一个,所以叫权威dns服务器,毕竟自己解析自己当然权威了, 所以最终 权威dns服务器就会把ip 告诉你家附近的本地dns服务器,然后本地dns服务器就返回一个ip地址 告诉你的电脑这个域名 对应的ip是多少。

DNS仅仅有返回IP地址的作用吗?

可能对于多数客户端开发来说,对dns的理解就仅仅是通过域名找ip的作用了。但其实dns的作用远远不止于此。DNS甚至可以 做负载均衡。 还记得我们的权威dns服务器吗?这个地方就可以做一个负载均衡的功能,最简单的,收到dns请求以后, 均衡的分配不同的ip地址。甚至是返回一个最优的ip给本地dns。所谓最优的ip当然就是 给你一个离你家最近的ip了。

DNS有哪些不足和问题?

1.缓存失效问题。 比方说我在南京南站吃过一次肯德基, 如果我到了南京站的这个位置还想吃肯德基,我当然会选择南京站附近的肯德基, 没人会选择再跑去南京南站吃KFC吧。 本地dns服务器就会有这个问题。

他的缓存不会及时更新,就会出现上述情况。有的时候甚至他还会故意配置一个错的ip,用来做运营商劫持。

2.运营商偷懒转发dns请求。 这个对于移动端来说也是常见的问题,比方说中国移动的基站发现这个时候压力太大了,他就会偷懒,把这个dns请求 转发给中国联通,然后中国联通一番操作以后查询到你的权威dns服务器,你的权威dns服务器以为你是联通的用户 就给你一个联通的ip地址,但其实你是移动的用户。你后续的访问都会因为涉及到 运营商跨域的问题而降低接口响应速度。

3.对于在家连wifi的用户来说还有更坑的情况。 大家都知道我们在家上网的地址都是所谓内网地址,我们与外界的访问都是通过运营商提供的nat服务来进行的, 也就说我们在家上网的时候每次请求都会由运营商把我们的内网地址转换成与外网连接的外网地址。这个过程叫NAT. 这个NAT转换就坑爹了,他转换过的地址不是固定的,这会导致我们的权威dns服务器认错,比如你明明是中国移动的宽带用户, nat以后,权威dns就认为这个是联通的用户,又返回了一个联通的ip节点。。。。 这里不得不吐槽长城宽带,nat出来的地址全国飘。

4.无法做容灾处理。 比方说,我现在有台服务器ip为1.2.3.4的 server挂了,我现在权威dns服务器发现这个问题以后我更新这个ip为1.3.5.7, 这样新的dns请求就不会访问这个1.2.3.4了,问题是老的用户呢?谁也不知道运营商本地dns服务器的更新频率, 那这个服务器的灾备容灾还咋做?没办法做

5.DNS解析时间过长 在一些信号差的地方,对移动用户影响是致命的,如果本地dns查询不到这个域名的ip,他就会走一段很长的路查询这个对应的ip, 如果信号不稳定的话,这个递归遍历查ip的过程很可能会超时甚至挂掉。

那么总体来说,DNS面临的就是这些问题,可以看出来,这些问题对于移动app来说影响都很致命。哪怕没有dns劫持导致 移动端webview展示一些奇怪的广告,就这些体验问题和技术问题也是不允许存在的。所以我们才有了httpdns来解决上述问题。

HTTPDNS 如何解决上述问题?

对httpdns还陌生的人,可以先去阿里云上玩一玩这个httpdns,都有现成的android或者ios的demo。这里不再重复说了。 大概讲一下httpdns的工作原理。

1.客户端的sdk在收到dns请求以后,会去httpdns服务器上查询ip。查询到了就会把这个域名和ip的映射关系保存在本地。

这个地方可以看出来,这个缓存是由sdk自己控制的跟 运营商无关了。既然是自己控制也就不存在域名劫持,缓存 更新不及时等问题。

2.因为查询dns的过程是 发一个http请求到 httpdns服务器上,全过程可控,所以我们的httpdns服务器当然知道 你手机的情况,你在哪,你是哪个运营商 都可以拿到你的信息 自然可以返回你最合适的ip。

避免出现老的dns那种返回不恰当的ip的现象。这个负载均衡就基本完美。

3.老式的dns解析,如果缓存没命中要递归查询太久了,我们这里一个http请求就完事。速度也快

  1. 至于sdk的dns本地缓存策略就是你们自己和服务器商量的事了。精准可控,选择一套最适合你们的缓存策略吧。

最后,就算使用httpdns也要做降级方案,万一httpdns挂了我们还可以走老的dns,慢一点总比全站瘫痪强