關於這個問題,若是你只能回答出爲了防止webview被域名劫持,那這篇文章你就須要好好讀一讀了。本篇文章將從多個角度 剖析爲何對於移動app來講,HTTPDNS十分必要。android
要理解爲何移動app須要httpdns,首先要理解DNS的原理,知道DNS的工做模式,以及有什麼問題,才能分析出HTTPDNS的優點。ios
DNS的工做模式:web
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的做用遠遠不止於此。DNS甚至能夠 作負載均衡。 還記得咱們的權威dns服務器嗎?這個地方就能夠作一個負載均衡的功能,最簡單的,收到dns請求之後, 均衡的分配不一樣的ip地址。甚至是返回一個最優的ip給本地dns。所謂最優的ip固然就是 給你一個離你家最近的ip了。app
1.緩存失效問題。 比方說我在南京南站吃過一次肯德基, 若是我到了南京站的這個位置還想吃肯德基,我固然會選擇南京站附近的肯德基, 沒人會選擇再跑去南京南站吃KFC吧。 本地dns服務器就會有這個問題。負載均衡
他的緩存不會及時更新,就會出現上述狀況。有的時候甚至他還會故意配置一個錯的ip,用來作運營商劫持。移動端web
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,都有現成的android或者ios的demo。這裏再也不重複說了。 大概講一下httpdns的工做原理。
1.客戶端的sdk在收到dns請求之後,會去httpdns服務器上查詢ip。查詢到了就會把這個域名和ip的映射關係保存在本地。
這個地方能夠看出來,這個緩存是由sdk本身控制的跟 運營商無關了。既然是本身控制也就不存在域名劫持,緩存 更新不及時等問題。
2.由於查詢dns的過程是 發一個http請求到 httpdns服務器上,全過程可控,因此咱們的httpdns服務器固然知道 你手機的狀況,你在哪,你是哪一個運營商 均可以拿到你的信息 天然能夠返回你最合適的ip。
避免出現老的dns那種返回不恰當的ip的現象。這個負載均衡就基本完美。
3.老式的dns解析,若是緩存沒命中要遞歸查詢過久了,咱們這裏一個http請求就完事。速度也快
最後,就算使用httpdns也要作降級方案,萬一httpdns掛了咱們還能夠走老的dns,慢一點總比全站癱瘓強