iOS網(wǎng)絡請求優(yōu)化之DNS映射

文字轉載:
http://mrpeak.cn/ios/2016/01/22/dnsmapping
圖片轉載:
http://www.itdecent.cn/p/ad038ea54310

絕大多數(shù)網(wǎng)絡請求的第一步都是DNS解析,解析請求根據(jù)當時網(wǎng)絡情況不同,各平臺的DNS緩存策略差異等因素,對移動端app整體網(wǎng)絡性能會產生或大或小的影響。移動端app網(wǎng)絡性能優(yōu)化涉及到很多方面,DNS映射只是其中一環(huán),也是十分重要的一環(huán),因為它帶來的好處不僅僅是降低網(wǎng)絡請求的延遲。

降低DNS請求帶來的延遲

客戶端app的請求第一步都是DNS解析,但由于cache的存在使得大部分的解析請求并不會產生任何延遲。各品臺都有自己的cache過期策略。像iOS系統(tǒng)一般是24小時之后會過期,還有進入飛行模式再切回來,開關機,重置網(wǎng)絡設置等也會導致DNS cache的清除。所以一般情況下用戶在第二天打開你的app都會經(jīng)歷一次完整的DNS解析請求,網(wǎng)絡情況差的時候會明顯增加應用請求的總耗時。如果能直接跳過DNS解析這一步,當然能提升網(wǎng)絡性能了。

預防DNS劫持

DNS劫持指的是改變DNS請求的返回結果,將目的ip指向另一個地址。一般有兩種方式,一是通過病毒的方式改變本機配置的DNS服務器地址,而是通過攻擊正常DNS服務器而改變其行為。不管是哪種方式,都會影響app本身的業(yè)務請求。如果遇到惡意的攻擊還會衍生出各種安全問題??蛻舳俗约鹤鯠NS與ip地址的映射就跨過了解析,讓劫持者無從下手。

服務器動態(tài)部署

DNS映射實際是模擬了DNS請求的解析行為。如果客戶端將自己的位置信息諸如ip地址,國家碼等加入映射文件的請求參數(shù)當中,服務器就可以根據(jù)客戶端所處的位置不同,下發(fā)距離其物理位置最近的server ip地址,從而減小整體網(wǎng)絡請求的延遲,實現(xiàn)一定程度的服務器動態(tài)部署。

如何設計自己的DNS映射機制?

DNS解析請求簡單來說,無非是輸入一個域名,輸出一個ip地址。做自己的映射機制也就是客戶端本地維護這樣一個映射文件,只不過這個映射文件需要能從服務器更新,還要做一些容錯處理。我們先從這幾個基本要求出發(fā)制定下面幾個必須滿足的需求。

  • 一個打包到app包里面的默認映射文件,這樣可以避免第一次去服務器取配置文件帶來的延遲。
  • 有一個定時器能每隔一段時間從服務器獲取最新的映射,并覆蓋本地。
  • 每次取到最新的映射文件之后,同時把上一次的映射文件保存起來作為替補,一旦出現(xiàn)線上配置失誤不至于導致請求無法處理。
  • 如果映射文件不能處理域名,要能回滾使用默認的DNS解析服務。
  • 如果一個映射過后的ip持續(xù)導致請求失敗,應該能從機制上保證這個ip地址不再使用。也就是需要一個無效映射淘汰機制。
  • 無效的ip地址能及時上報到服務器,及時發(fā)現(xiàn)問題更新映射文件。

基于這些基本需求,可以做出如下簡單的設計:

image.png

大致有3個角色,mapper,validator,reporter。各自職責如下:

mapper

mapper是和外部交互的部分,主要負責在輸入domain的情況下輸出ip,同時還要檢測來自應用層請求成功和失敗的信息。失敗的情況下要將失敗的ip進行進一步的檢測,以確定是否真的是ip地址無效,如果無效則進行上報。mapper還要負責從mapper文件的更新機制。

validator

validator在接受到請求失敗的ip時,要負責對這個ip做進一步的有效性檢測。檢測規(guī)則的強弱可自己定制。但一般來說流程在后臺線程使用這個地址做多次連接嘗試。如果失敗則告訴mapper這個地址確實無效。如果成功則表明這個地址有效,很有可能只是當時的網(wǎng)絡環(huán)境導致了請求的失敗。

reporter

reporter主要負責告訴server整個mapping機制的健康狀況。在出現(xiàn)某個ip經(jīng)過validator檢測依然失敗的情況下,要及時的告訴server出問題的ip。很有可能出現(xiàn)了某個服務器故障或者映射文件的配置失誤等等。

在上面這些基礎需求之外,還可以根據(jù)自身的業(yè)務特點及技術條件做一些深度定制。比如從服務器定期更新映射文件,可以改成socket長鏈接通道在需要更新時push,或者利用http2.0的server push機制。還有上報機制,除了上報錯誤的ip地址映射之外,還可以對請求的總量,成功率,映射成功率等數(shù)據(jù)進行偵測。

PPDNSMapping

PPDNSMapping是根據(jù)以上設計原則所做的iOS平臺例子,附有測試demo代碼。

PPDNSMappingManager對應圖一當中的mapper,PPIPValidator對應validator,PPDNSReporter對應reporter。

github地址

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 這種做法的核心就是去掉客戶端通過DNS尋找地址,創(chuàng)建文件映射之后,手動輸入域名然后返回對應的地址,跳過DNS請求起...
    linbj閱讀 4,340評論 0 9
  • 絕大多數(shù)網(wǎng)絡請求的第一步都是DNS解析,解析請求根據(jù)當時網(wǎng)絡情況不同,各平臺的DNS緩存策略差異等因素,對移動端a...
    Gatling閱讀 2,125評論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 1. 概述 在網(wǎng)絡環(huán)境中一般用戶只需要在瀏覽器中輸入url如www.sunny.com就可以到對應服務器獲取相應的...
    ghbsunny閱讀 3,409評論 0 7
  • 能推薦幾本適合19歲女性的書籍么
    Dream_花蕊閱讀 201評論 0 0

友情鏈接更多精彩內容