絕大多數(shù)網(wǎng)絡(luò)請(qǐng)求的第一步都是DNS解析,解析請(qǐng)求根據(jù)當(dāng)時(shí)網(wǎng)絡(luò)情況不同掩浙,各平臺(tái)的DNS緩存策略差異等因素赖临,對(duì)移動(dòng)端app整體網(wǎng)絡(luò)性能會(huì)產(chǎn)生或大或小的影響。移動(dòng)端app網(wǎng)絡(luò)性能優(yōu)化涉及到很多方面爽茴,DNS映射只是其中一環(huán)葬凳,也是十分重要的一環(huán),因?yàn)樗鼛?lái)的好處不僅僅是降低網(wǎng)絡(luò)請(qǐng)求的延遲室奏。
降低DNS請(qǐng)求帶來(lái)的延遲
客戶端app的請(qǐng)求第一步都是DNS解析火焰,但由于cache的存在使得大部分的解析請(qǐng)求并不會(huì)產(chǎn)生任何延遲。各品臺(tái)都有自己的cache過(guò)期策略胧沫。像iOS系統(tǒng)一般是24小時(shí)之后會(huì)過(guò)期昌简,還有進(jìn)入飛行模式再切回來(lái),開(kāi)關(guān)機(jī)琳袄,重置網(wǎng)絡(luò)設(shè)置等也會(huì)導(dǎo)致DNS cache的清除江场。所以一般情況下用戶在第二天打開(kāi)你的app都會(huì)經(jīng)歷一次完整的DNS解析請(qǐng)求,網(wǎng)絡(luò)情況差的時(shí)候會(huì)明顯增加應(yīng)用請(qǐng)求的總耗時(shí)窖逗。如果能直接跳過(guò)DNS解析這一步址否,當(dāng)然能提升網(wǎng)絡(luò)性能了。
預(yù)防DNS劫持
DNS劫持指的是改變DNS請(qǐng)求的返回結(jié)果,將目的ip指向另一個(gè)地址佑附。一般有兩種方式樊诺,一是通過(guò)病毒的方式改變本機(jī)配置的DNS服務(wù)器地址,而是通過(guò)攻擊正常DNS服務(wù)器而改變其行為音同。不管是哪種方式词爬,都會(huì)影響app本身的業(yè)務(wù)請(qǐng)求。如果遇到惡意的攻擊還會(huì)衍生出各種安全問(wèn)題权均《倥颍客戶端自己做DNS與ip地址的映射就跨過(guò)了解析,讓劫持者無(wú)從下手叽赊。
服務(wù)器動(dòng)態(tài)部署
DNS映射實(shí)際是模擬了DNS請(qǐng)求的解析行為恋沃。如果客戶端將自己的位置信息諸如ip地址,國(guó)家碼等加入映射文件的請(qǐng)求參數(shù)當(dāng)中必指,服務(wù)器就可以根據(jù)客戶端所處的位置不同囊咏,下發(fā)距離其物理位置最近的server ip地址,從而減小整體網(wǎng)絡(luò)請(qǐng)求的延遲塔橡,實(shí)現(xiàn)一定程度的服務(wù)器動(dòng)態(tài)部署梅割。
如何設(shè)計(jì)自己的DNS映射機(jī)制?
DNS解析請(qǐng)求簡(jiǎn)單來(lái)說(shuō)葛家,無(wú)非是輸入一個(gè)域名户辞,輸出一個(gè)ip地址。做自己的映射機(jī)制也就是客戶端本地維護(hù)這樣一個(gè)映射文件惦银,只不過(guò)這個(gè)映射文件需要能從服務(wù)器更新咆课,還要做一些容錯(cuò)處理。我們先從這幾個(gè)基本要求出發(fā)制定下面幾個(gè)必須滿足的需求扯俱。
一個(gè)打包到app包里面的默認(rèn)映射文件书蚪,這樣可以避免第一次去服務(wù)器取配置文件帶來(lái)的延遲。
有一個(gè)定時(shí)器能每隔一段時(shí)間從服務(wù)器獲取最新的映射迅栅,并覆蓋本地殊校。
每次取到最新的映射文件之后,同時(shí)把上一次的映射文件保存起來(lái)作為替補(bǔ)读存,一旦出現(xiàn)線上配置失誤不至于導(dǎo)致請(qǐng)求無(wú)法處理为流。
如果映射文件不能處理域名,要能回滾使用默認(rèn)的DNS解析服務(wù)让簿。
如果一個(gè)映射過(guò)后的ip持續(xù)導(dǎo)致請(qǐng)求失敗敬察,應(yīng)該能從機(jī)制上保證這個(gè)ip地址不再使用。也就是需要一個(gè)無(wú)效映射淘汰機(jī)制尔当。
無(wú)效的ip地址能及時(shí)上報(bào)到服務(wù)器莲祸,及時(shí)發(fā)現(xiàn)問(wèn)題更新映射文件。
基于這些基本需求,可以做出如下簡(jiǎn)單的設(shè)計(jì):
大致有3個(gè)角色锐帜,mapper田盈,validator,reporter缴阎。各自職責(zé)如下:
mapper
mapper是和外部交互的部分允瞧,主要負(fù)責(zé)在輸入domain的情況下輸出ip,同時(shí)還要檢測(cè)來(lái)自應(yīng)用層請(qǐng)求成功和失敗的信息蛮拔。失敗的情況下要將失敗的ip進(jìn)行進(jìn)一步的檢測(cè)述暂,以確定是否真的是ip地址無(wú)效,如果無(wú)效則進(jìn)行上報(bào)建炫。mapper還要負(fù)責(zé)從mapper文件的更新機(jī)制贸典。
validator
validator在接受到請(qǐng)求失敗的ip時(shí),要負(fù)責(zé)對(duì)這個(gè)ip做進(jìn)一步的有效性檢測(cè)踱卵。檢測(cè)規(guī)則的強(qiáng)弱可自己定制尿瞭。但一般來(lái)說(shuō)流程在后臺(tái)線程使用這個(gè)地址做多次連接嘗試浩峡。如果失敗則告訴mapper這個(gè)地址確實(shí)無(wú)效穷当。如果成功則表明這個(gè)地址有效持偏,很有可能只是當(dāng)時(shí)的網(wǎng)絡(luò)環(huán)境導(dǎo)致了請(qǐng)求的失敗劝堪。
reporter
reporter主要負(fù)責(zé)告訴server整個(gè)mapping機(jī)制的健康狀況捶索。在出現(xiàn)某個(gè)ip經(jīng)過(guò)validator檢測(cè)依然失敗的情況下蜈膨,要及時(shí)的告訴server出問(wèn)題的ip躺翻。很有可能出現(xiàn)了某個(gè)服務(wù)器故障或者映射文件的配置失誤等等鳞芙。
在上面這些基礎(chǔ)需求之外眷柔,還可以根據(jù)自身的業(yè)務(wù)特點(diǎn)及技術(shù)條件做一些深度定制。比如從服務(wù)器定期更新映射文件原朝,可以改成socket長(zhǎng)鏈接通道在需要更新時(shí)push驯嘱,或者利用http2.0的server push機(jī)制。還有上報(bào)機(jī)制喳坠,除了上報(bào)錯(cuò)誤的ip地址映射之外鞠评,還可以對(duì)請(qǐng)求的總量,成功率壕鹉,映射成功率等數(shù)據(jù)進(jìn)行偵測(cè)剃幌。
PPDNSMapping
PPDNSMapping是根據(jù)以上設(shè)計(jì)原則所做的iOS平臺(tái)例子,附有測(cè)試demo代碼晾浴。
PPDNSMappingManager對(duì)應(yīng)圖一當(dāng)中的mapper负乡,PPIPValidator對(duì)應(yīng)validator,PPDNSReporter對(duì)應(yīng)reporter脊凰。
github地址
貌似因?yàn)樘O(píng)果在6月份之前要求所有上架的APP要兼容IPv6抖棘,所以IP直連貌似不可行了..