深入理解Http請求、DNS劫持與解析。

茉莉兒發表於2017-09-14

背景

前段時間在處理iOS端的HTTPDNS相關SDK,在接入和測試環節發現大家對HTTP的整體請求流程包括HTTP劫持原理以及HTTPDNS的工作原理並不是太清楚,所以寫下這邊文章幫助大家深入web請求過程:如何發起請求,HTTP協議解析,DNS域名解析。

HTTP發起一個請求過程

當我們在手機端請求一個@"www.baidu.com"的域名的時候

  • 1.請求到達運營商的DNS伺服器並由其把這個域名解析成對應的IP地址。

  • 2.根據IP地址在網際網路上找到對應的伺服器,向這個伺服器發起一個get\post請求。

  • 3.由這個伺服器找到對應的資源原路返回給訪問的使用者。

這裡只是一個大概的流程實際每一步都有複雜的結構和邏輯例如:伺服器可能有很多臺,到底指定哪臺伺服器來處理請求,需要一個負載均衡裝置來平均分配所有使用者的請求。請求的資料是儲存在分散式快取中還是一個靜態檔案中,或是在資料庫裡。當資料返回瀏覽器時,瀏覽器解析資料發現還有一些靜態資源(如CSS、JS或者圖片)時又會發起另外的HTTP請求,而這些請求很可能會在CDN上,那麼CDN伺服器上又會處理這個使用者的請求。

HTTP劫持

我們使用HTTPDNS的主要目的就是解決HTTP劫持問題。HTTP的劫持分兩種第一種是DNS劫持,第二種是內容劫持,後者是基於前者的基礎上發展出來,是比較高階的劫持手段,目前無解,下面來分開講解:

1:DNS劫持
  • 劫持流程
    DNS劫持又稱域名劫持,是指在劫持的網路範圍內攔截域名解析的請求,分析請求的域名,把審查範圍以外的請求放行,否則返回假的IP地址或者什麼都不做使請求失去響應,其效果就是對特定的網路不能訪問或訪問的是假網址。其實本質就是對DNS解析伺服器做手腳,或者是使用偽造的DNS解析伺服器可以通過下圖來展示
    DNS劫持原理
    DNS劫持原理

    從圖中可以看出紅色的是劫持的流程,劫持後將你的請求轉發到一個虛假的伺服器。
  • 解決辦法
    DNS的劫持過程是通過攻擊運營商的解析伺服器來達到目的。我們可以不用運營商的DNS解析而使用自己的解析伺服器或者是提前在自己的App中將解析好的域名以IP的形式發出去就可以繞過運營商DNS解析,這樣一來也避免了DNS劫持的問題。
2:內容劫持
  • 劫持流程
    內容劫持網上很少有提到,這也是在做httpDNS SDK所遇到的一個問題,其實內容劫持一開始的出發點是好的,是運營商為了加快使用者的訪問速度同時減少自己的流量損耗而做的一個快取機制,使用者在像伺服器請求資料的時候運營商會把使用者的請求轉移到這個快取池中,如果快取中有就直接返回,沒有的話再去像伺服器請求然後攔截並快取服務端給使用者的回撥資料,這樣一來可以極大的降低運營商像伺服器請求的次數,也能加快使用者的訪問,所以出發點是好,但是一些非法的商家對快取池內部做一次些處理就是直接對返回的內容進行修改,這樣一來我們就會接受到錯誤的資料
    內容劫持
    內容劫持
    黃色線條就是比價危險的了,因為回撥的資料很可能已經被篡改過。
  • 解決辦法:
    現在暫時沒有發現辦法,不過這樣的劫持不是很多。

    DNS解析過程

    如果是iOS裝置請直接跳到第三步驟
  • 1.系統會檢查瀏覽器快取中有沒有這個域名對應的解析過的IP地址,如果快取中有,這個解析過程就將結束。瀏覽器快取是受這個域名的失效時間和快取的空間大小控制的。

  • 2.如果使用者的瀏覽器快取中沒有,瀏覽器會查詢作業系統快取中即為本地的Host檔案。

  • 3.如果本地Host檔案中沒有那麼作業系統會把這個域名傳送給這裡設定的LocalDNS,也就是本地區的域名伺服器。這個DNS通常都提供給你本地網際網路接入的一個DNS解析服務。這個專門的域名解析伺服器效能都會很好,它們一般都會快取域名解析結果,當然快取時間是受域名的失效時間控制的,一般快取空間不是影響域名失效的主要因素。大約90%的域名解析都到這裡就已經完成了,所以LDNS主要承擔了域名的解析工作。

  • 4.如果LDNS仍然沒有命中,就直接到Root Server域名伺服器請求解析

  • 5.根域名伺服器返回給本地域名伺服器一個所查詢的域的主域名伺服器(gTLD Server)地址。gTLD是國際頂級域名伺服器,如.com,.cn、.org等。全球只有13臺左右。

  • 6.本地域名伺服器(Local DNS Server)再向上一步返回的gTLD伺服器傳送請求。

  • 7.接受請求的gTLD伺服器查詢並返回此域名對應的Name Server域名伺服器的地址,這個Name Server通常就是你註冊的域名伺服器,例如你在某個域名服務提供商申請的域名,那麼這個域名解析任務就由這個域名提供商的伺服器來完成

  • 8.Name Server域名伺服器會查詢儲存的域名和IP的對映關係表,正常情況下都根據域名得到目標IP記錄,連同一個TTL值返回給DNS Server域名伺服器。

  • 9.返回該域名對應的IP和TTL值,Local DNS Server會快取這個域名和IP的對應關係,快取的時間由TTL值控制。

  • 10.把解析的結果返回給使用者,使用者根據TTL值快取在本地系統快取中,域名解析過程結束。
    以上的流程可以簡化為下圖

    DNS解析
    DNS解析

    綠色的為非iOS裝置的操作流程

    CDN工作機制

    CDN簡介

    CDN,全稱Content Delivery Network,根本的作用是將網站的內容釋出到最接近使用者的網路“邊緣”,使使用者可以就近取得所需的內容,提高使用者訪問網站的響應速度。他-有別於映象,它比映象更智慧,可以這樣做一個比喻:CDN=映象(Mirror) + 快取(cache) + 整體負載均衡(GSLB),因而,CDN可以明顯提高Internet中資訊流動的效率。目前CDN都以快取網站中的靜態資料為主,如CSS、JS、圖片和靜態網頁等資料。使用者在從主站伺服器請求到動態內容後再從CDN上下載這些靜態資料,從而加速網頁資料內容的下載速度,如淘寶有90%以上的資料都是由CDN來提供的。這裡引用一個網上比較形象的例子:A家的網速 100M的,但他只用了10M的速度,B家的網速是10M的,但是他需要15M的速度才行。怎麼辦呢。 C是一家CDN服務商,在A家有個節點(就像A是一個贊助商一樣)B在C家買了CDN加速服務。當B的速度不夠的時候,CDN加速就會選擇有節餘的節點來幫B,提高B的速度。這樣B的速度就能達到或超過15M ,皆大歡喜。A沒浪費,B速度有了,C賺了錢。 當C的節點在全國都有,非常多的時候。那麼你用C家的CDN加速服務,你就會健步如飛了

    CDN工作流程

    一個使用者訪問某個靜態檔案(如CSS),這個靜態檔案的域名假如是www.baidu.com,而這個域名最終會被指向CDN全域性中CDN負載均衡伺服器,再由這個負載均衡伺服器來最終分配是哪個地方的訪問使用者,返回給離這個訪問使用者最近的CDN節點。之後使用者就直接去這個CDN節點訪問這個靜態檔案了,如果這個節點中請求的檔案不存在,就會再回到源站去獲取這個檔案,然後再返回給使用者。

    負載均衡

    負載均衡就是對工作任務進行平衡、分攤到多個操作單元上執行,如圖片伺服器、應用伺服器等,共同完成工作任務。它可以提高伺服器響應速度及利用效率,避免軟體或者硬體模組出現單點失效,解決網路擁塞問題,實現地理位置無關性,為使用者提供較一致的訪問質量。
    CDN整體的工作流程可以大概歸為下圖:

    image.png
    image.png

    總結

    以上就是Http請求的一些理解,如果有不對的地方及時與我來溝通。

相關文章