背景
前段時(shí)間在處理iOS端的HTTPDNS相關(guān)SDK横朋,在接入和測試環(huán)節(jié)發(fā)現(xiàn)大家對HTTP的整體請求流程包括HTTP劫持原理以及HTTPDNS的工作原理并不是太清楚,所以寫下這邊文章幫助大家深入web請求過程:如何發(fā)起請求百拓,HTTP協(xié)議解析琴锭,DNS域名解析晰甚。
HTTP發(fā)起一個(gè)請求過程
當(dāng)我們在手機(jī)端請求一個(gè)@"www.baidu.com"的域名的時(shí)候
1.請求到達(dá)運(yùn)營商的DNS服務(wù)器并由其把這個(gè)域名解析成對應(yīng)的IP地址。
2.根據(jù)IP地址在互聯(lián)網(wǎng)上找到對應(yīng)的服務(wù)器决帖,向這個(gè)服務(wù)器發(fā)起一個(gè)get\post請求厕九。
3.由這個(gè)服務(wù)器找到對應(yīng)的資源原路返回給訪問的用戶。
這里只是一個(gè)大概的流程實(shí)際每一步都有復(fù)雜的結(jié)構(gòu)和邏輯例如:服務(wù)器可能有很多臺地回,到底指定哪臺服務(wù)器來處理請求扁远,需要一個(gè)負(fù)載均衡設(shè)備來平均分配所有用戶的請求。請求的數(shù)據(jù)是存儲在分布式緩存中還是一個(gè)靜態(tài)文件中刻像,或是在數(shù)據(jù)庫里畅买。當(dāng)數(shù)據(jù)返回瀏覽器時(shí),瀏覽器解析數(shù)據(jù)發(fā)現(xiàn)還有一些靜態(tài)資源(如CSS细睡、JS或者圖片)時(shí)又會發(fā)起另外的HTTP請求皮获,而這些請求很可能會在CDN上,那么CDN服務(wù)器上又會處理這個(gè)用戶的請求纹冤。
HTTP劫持
我們使用HTTPDNS的主要目的就是解決HTTP劫持問題洒宝。HTTP的劫持分兩種第一種是DNS劫持,第二種是內(nèi)容劫持萌京,后者是基于前者的基礎(chǔ)上發(fā)展出來雁歌,是比較高級的劫持手段,目前無解知残,下面來分開講解:
1:DNS劫持
- 劫持流程
DNS劫持又稱域名劫持靠瞎,是指在劫持的網(wǎng)絡(luò)范圍內(nèi)攔截域名解析的請求,分析請求的域名求妹,把審查范圍以外的請求放行乏盐,否則返回假的IP地址或者什么都不做使請求失去響應(yīng),其效果就是對特定的網(wǎng)絡(luò)不能訪問或訪問的是假網(wǎng)址制恍。其實(shí)本質(zhì)就是對DNS解析服務(wù)器做手腳父能,或者是使用偽造的DNS解析服務(wù)器可以通過下圖來展示
DNS劫持原理
從圖中可以看出紅色的是劫持的流程,劫持后將你的請求轉(zhuǎn)發(fā)到一個(gè)虛假的服務(wù)器净神。 - 解決辦法
- DNS的劫持過程是通過攻擊運(yùn)營商的解析服務(wù)器來達(dá)到目的何吝。我們可以不用運(yùn)營商的DNS解析而使用自己的解析服務(wù)器或者是提前在自己的App中將解析好的域名以IP的形式發(fā)出去就可以繞過運(yùn)營商DNS解析,這樣一來也避免了DNS劫持的問題鹃唯。
- HttpDNS是使用HTTP協(xié)議向DNS服務(wù)器的80端口進(jìn)行請求爱榕,代替?zhèn)鹘y(tǒng)的DNS協(xié)議向DNS服務(wù)器的53端口進(jìn)行請求,繞開了運(yùn)營商的Local DNS,從而避免了使用運(yùn)營商Local DNS造成的劫持和跨網(wǎng)問題
2:內(nèi)容劫持
-
劫持流程
內(nèi)容劫持網(wǎng)上很少有提到坡慌,這也是在做httpDNS SDK所遇到的一個(gè)問題黔酥,其實(shí)內(nèi)容劫持一開始的出發(fā)點(diǎn)是好的,是運(yùn)營商為了加快用戶的訪問速度同時(shí)減少自己的流量損耗而做的一個(gè)緩存機(jī)制,用戶在像服務(wù)器請求數(shù)據(jù)的時(shí)候運(yùn)營商會把用戶的請求轉(zhuǎn)移到這個(gè)緩存池中跪者,如果緩存中有就直接返回棵帽,沒有的話再去像服務(wù)器請求然后攔截并緩存服務(wù)端給用戶的回調(diào)數(shù)據(jù),這樣一來可以極大的降低運(yùn)營商像服務(wù)器請求的次數(shù)坑夯,也能加快用戶的訪問,所以出發(fā)點(diǎn)是好抡四,但是一些非法的商家對緩存池內(nèi)部做一些處理就是直接對返回的內(nèi)容進(jìn)行修改柜蜈,這樣一來我們就會接受到錯(cuò)誤的數(shù)據(jù)
內(nèi)容劫持黃色線條就是比價(jià)危險(xiǎn)的了,因?yàn)榛卣{(diào)的數(shù)據(jù)很可能已經(jīng)被篡改過指巡。
- 解決辦法:
現(xiàn)在暫時(shí)無法通過HTTPdns和其他手段解決淑履,不過這樣的劫持不是很多。
DNS解析過程
如果是iOS設(shè)備請直接跳到第三步驟
1.系統(tǒng)會檢查瀏覽器緩存中有沒有這個(gè)域名對應(yīng)的解析過的IP地址藻雪,如果緩存中有秘噪,這個(gè)解析過程就將結(jié)束。瀏覽器緩存是受這個(gè)域名的失效時(shí)間和緩存的空間大小控制的勉耀。
2.如果用戶的瀏覽器緩存中沒有指煎,瀏覽器會查找操作系統(tǒng)緩存中即為本地的Host文件。
3.如果本地Host文件中沒有那么操作系統(tǒng)會把這個(gè)域名發(fā)送給這里設(shè)置的LocalDNS便斥,也就是本地區(qū)的域名服務(wù)器至壤。這個(gè)DNS通常都提供給你本地互聯(lián)網(wǎng)接入的一個(gè)DNS解析服務(wù)。這個(gè)專門的域名解析服務(wù)器性能都會很好枢纠,它們一般都會緩存域名解析結(jié)果像街,當(dāng)然緩存時(shí)間是受域名的失效時(shí)間控制的,一般緩存空間不是影響域名失效的主要因素晋渺。大約90%的域名解析都到這里就已經(jīng)完成了镰绎,所以LDNS主要承擔(dān)了域名的解析工作。
4.如果LDNS仍然沒有命中木西,就直接到Root Server域名服務(wù)器請求解析
5.根域名服務(wù)器返回給本地域名服務(wù)器一個(gè)所查詢的域的主域名服務(wù)器(gTLD Server)地址畴栖。gTLD是國際頂級域名服務(wù)器,如.com八千,.cn驶臊、.org等。全球只有13臺左右叼丑。
6.本地域名服務(wù)器(Local DNS Server)再向上一步返回的gTLD服務(wù)器發(fā)送請求关翎。
7.接受請求的gTLD服務(wù)器查找并返回此域名對應(yīng)的Name Server域名服務(wù)器的地址,這個(gè)Name Server通常就是你注冊的域名服務(wù)器鸠信,例如你在某個(gè)域名服務(wù)提供商申請的域名纵寝,那么這個(gè)域名解析任務(wù)就由這個(gè)域名提供商的服務(wù)器來完成
8.Name Server域名服務(wù)器會查詢存儲的域名和IP的映射關(guān)系表,正常情況下都根據(jù)域名得到目標(biāo)IP記錄,連同一個(gè)TTL值返回給DNS Server域名服務(wù)器爽茴。
9.返回該域名對應(yīng)的IP和TTL值葬凳,Local DNS Server會緩存這個(gè)域名和IP的對應(yīng)關(guān)系,緩存的時(shí)間由TTL值控制室奏。
-
10.把解析的結(jié)果返回給用戶火焰,用戶根據(jù)TTL值緩存在本地系統(tǒng)緩存中,域名解析過程結(jié)束胧沫。
以上的流程可以簡化為下圖
DNS解析
綠色的為非iOS設(shè)備的操作流程
CDN工作機(jī)制
CDN簡介
CDN昌简,全稱Content Delivery Network,根本的作用是將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的網(wǎng)絡(luò)“邊緣”绒怨,使用戶可以就近取得所需的內(nèi)容纯赎,提高用戶訪問網(wǎng)站的響應(yīng)速度。他-有別于鏡像南蹂,它比鏡像更智能犬金,可以這樣做一個(gè)比喻:CDN=鏡像(Mirror) + 緩存(cache) + 整體負(fù)載均衡(GSLB),因而六剥,CDN可以明顯提高Internet中信息流動的效率晚顷。目前CDN都以緩存網(wǎng)站中的靜態(tài)數(shù)據(jù)為主,如CSS疗疟、JS音同、圖片和靜態(tài)網(wǎng)頁等數(shù)據(jù)。用戶在從主站服務(wù)器請求到動態(tài)內(nèi)容后再從CDN上下載這些靜態(tài)數(shù)據(jù)秃嗜,從而加速網(wǎng)頁數(shù)據(jù)內(nèi)容的下載速度权均,如淘寶有90%以上的數(shù)據(jù)都是由CDN來提供的。這里引用一個(gè)網(wǎng)上比較形象的例子:A家的網(wǎng)速 100M的锅锨,但他只用了10M的速度叽赊,B家的網(wǎng)速是10M的,但是他需要15M的速度才行必搞。怎么辦呢必指。 C是一家CDN服務(wù)商,在A家有個(gè)節(jié)點(diǎn)(就像A是一個(gè)贊助商一樣)B在C家買了CDN加速服務(wù)恕洲。當(dāng)B的速度不夠的時(shí)候塔橡,CDN加速就會選擇有節(jié)余的節(jié)點(diǎn)來幫B,提高B的速度霜第。這樣B的速度就能達(dá)到或超過15M 葛家,A沒浪費(fèi),B速度有了泌类,C賺了錢癞谒,皆大歡喜。 當(dāng)C的節(jié)點(diǎn)在全國都有,非常多的時(shí)候弹砚。那么你用C家的CDN加速服務(wù)双仍,你就會健步如飛了。
CDN工作流程
一個(gè)用戶訪問某個(gè)靜態(tài)文件(如CSS)桌吃,這個(gè)靜態(tài)文件的域名假如是www.baidu.com朱沃,而這個(gè)域名最終會被指向CDN全局中CDN負(fù)載均衡服務(wù)器,再由這個(gè)負(fù)載均衡服務(wù)器來最終分配是哪個(gè)地方的訪問用戶茅诱,返回給離這個(gè)訪問用戶最近的CDN節(jié)點(diǎn)逗物。之后用戶就直接去這個(gè)CDN節(jié)點(diǎn)訪問這個(gè)靜態(tài)文件了,如果這個(gè)節(jié)點(diǎn)中請求的文件不存在让簿,就會再回到源站去獲取這個(gè)文件敬察,然后再返回給用戶秀睛。
負(fù)載均衡
負(fù)載均衡就是對工作任務(wù)進(jìn)行平衡尔当、分?jǐn)偟蕉鄠€(gè)操作單元上執(zhí)行,如圖片服務(wù)器蹂安、應(yīng)用服務(wù)器等椭迎,共同完成工作任務(wù)。它可以提高服務(wù)器響應(yīng)速度及利用效率田盈,避免軟件或者硬件模塊出現(xiàn)單點(diǎn)失效畜号,解決網(wǎng)絡(luò)擁塞問題,實(shí)現(xiàn)地理位置無關(guān)性允瞧,為用戶提供較一致的訪問質(zhì)量简软。
CDN整體的工作流程可以大概歸為下圖:
總結(jié)
以上就是Http請求的一些理解,如果有不對的地方及時(shí)與我來溝通述暂。