全面理解 DNS 及 HTTPDNS

架構師(JiaGouX)

說明

移動場景下 DNS 解析開銷是整個網絡請求中不可忽略的一部分。在弱網環境下,基於 UDP 的 LocalDNS 解析非常容易出現解析超時的問題,並且即使解析成功會消耗數百毫秒乃至更甚,對我們整個業務請求而言是非常不利的,它直接影響了客戶的體驗。

對於一個比較大衆的應用而言,DNS 的優化對整個應用的網絡優化所佔的權重是很大的。我們接下來從以下幾個方面全面理解 DNS,相信對我們開發中的網絡優化會有不小的幫助。

1. DNS

1.1 認識 DNS

DNS(Domain Name System)是域名 “系統” 的英文縮寫,是一種組織成域層次結構的計算機和網絡服務命名系統,它用於 TCP/IP 網絡,它所提供的服務是用來將主機名和域名轉換爲 IP 地址的工作。

作爲網絡通信的最靠前的一個環節,其在整個網絡通信的過程中的重要性不言而喻。

ios10 之後,apple 提供的原生 http 請求方法能返回 http 請求各個階段的時間指標,其中就包含 DNS 解析時間。

1.2 DNS 解析相關概念

1.2.1 DNS 域名層次結構

DNS 是一種分層結構,在整個互聯網中組成一個樹狀系統,頂層是系統的根域名,下層爲 TLD 以及二級域名,葉子就構成了所謂的 FQDN(Fully Qualified Domain Names),根域名通常使用 "." 來表示,其實際上也是由域名組成,全世界目前有 13 組域名根節點,由少數幾個國家進行管理,而國內僅有幾臺根節點鏡像。

1.2.2 權威 DNS

權威DNS是經過上一級授權對域名進行解析的服務器,同時它可以把解析授權轉授給其他人,如COM頂級服務器可以授權xxorg.com這個域名的的權威服務器爲NS.ABC.COM,同時NS.ABC.COM還可以把授權轉授給NS.DDD.COM,這樣NS.DDD.COM就成了ABC.COM實際上的權威服務器了。平時我們解析域名的結果都源自權威DNS。eg: 阿里云云解析  [https://wanwang.aliyun.com/domain/dns](https://wanwang.aliyun.com/domain/dns) 
複製代碼

1.2.3 遞歸 DNS

遞歸 DNS 又稱爲 Local DNS,它沒有域名解析結果的決定權,但代理了用戶向權威 DNS 獲取域名解析結果的過程。遞歸 DNS 上有緩存模塊,當目標域名存在緩存解析結果並且 TTL 未過期時(每個域名都有 TTL 時間,即有效生存時間,若域名解析結果緩存的時間超過 TTL,需要重新向權威 DNS 獲取解析結果),遞歸 DNS 會返回緩存結果,否則,遞歸 DNS 會一級一級地查詢各個層級域名的權威 DNS 直至獲取最終完整域名的解析結果。eg: 我們自己的電腦,運營商提供的 dns 服務器等等。

1.2.4 公共 DNS

公共 DNS 是遞歸 DNS 的一種特例,它是一種全網開放的遞歸 DNS 服務,而傳統的遞歸 DNS 信息一般由運營商分發給用戶。

在 DNS 的解析過程中,用戶向遞歸 DNS 發起請求,遞歸 DNS 向權威 DNS 請求解析結果,可以說遞歸 DNS 起到一種轉發的作用。ISP DNS 就是遞歸 DNS;同時一些個人或互聯網服務提供商也會架設自己的遞歸 DNS 開放給所有人使用,稱爲公共 DNS。

全國 DNS 彙總:  www.114dns.com/DNS_List.ht…  ipip: tools.ipip.net/dns.php

1.2.5 轉發 DNS

可以理解爲遞歸 DNS 和用戶之間的一箇中轉站,它不提供直接解析域名的服務,它將請求轉發給遞歸 DNS,然後將遞歸 DNS 的結果轉發一下,也提供緩存作用。比如,日常家用的路由器,它的 DNS 服務器一般都是 192.168.1.1,只是轉發給遞歸 DNS。

1.3 域名解析記錄方式

域名解析記錄主要分爲 A 記錄、MIX 記錄、CNAME 記錄、NS 記錄和 TXT 記錄:

1.4 域名解析過程

然後我們再用 nslookup 命令查看一下百度的 ip 是不是上面顯示的兩個:

  1. 終端向 Local DNS 發起域名解析請求

  2. Local DNS 在獲取到域名請求後,首先從 Root hins 獲取根域名服務器的地址 (Root hints 包含了互聯網 DNS 根服務器的地址信息)

  3. 獲取到了根域名服務器地址後,Local DNS 向根域名服務器發起 DNS 解析請求,根域名服務器返回頂級域名服務器地址 (com 或者 cn 或者其它)

  4. 隨後 Local DNS 向 com 域名服務器發起解析請求,並得到 baidu.com 二級域名服務器地址

  5. Local DNS 向 baidu.com 二級域名服務器發起解析請求,並最終貨到了 www.baidu.com 的 ip 地址信息

  6. Local DNS 將遞歸查詢獲得的 IP 地址信息緩存並返回給客戶端

3. 全局負載均衡 GSLB

GSLB 是 Global Server load Blance 的縮寫,即全局負載均衡。目的是實現互聯網上不同地域的服務器間的流量調配,保證使用戶的請求能被離用戶最近或者服務質量更好的服務器來處理。從而確保服務質量。

能通過判斷服務器的負載,包括 CPU 佔用、帶寬佔用等數據,決定服務器的可用性,同時能判斷用戶(訪問者)與服務器間的鏈路狀況,選擇鏈路狀況最好的服務器。因此 GSLB 是對服務器和鏈路進行綜合判斷來決定由哪個地點的服務器來提供服務,實現異地服務器羣服務質量的保證。

3.1  智能 DNS

智能 DNS 是 GSLB 的一種應用。

4. DNS 解析存在的問題

有時候我們在訪問百度或者在應用中發出一個 http 請求時,如果 DNS 解析被劫持,我們可能最終訪問到的不是我們想要訪問的服務器。

4.1 運營商劫持

DNS 劫持 就是通過劫持了 DNS 服務器,通過某些手段取得某域名的解析記錄控制權,進而修改此域名的解析結果,導致對該域名的訪問由原 IP 地址轉入到修改後的指定 IP,其結果就是對特定的網址不能訪問或訪問的是假網址,從而實現竊取資料或者破壞原有正常服務的目的。

4.2 DNS 解析域名時緩存解析結果

我們在開發中有時候會遇到這樣的情況:你是一個聯通用戶,你在手機瀏覽器中輸入 baidu.com,由一個 LocalDNS 服務器像百度權威服務器查應該訪問哪一臺服務器,權威把結果返回給 LocalDNS 服務器, localDNS 服務器返回結果給用戶。

如果當 LocalDNS 緩存的有 baidu.com 對應的結果,那麼他就不會像百度的權威服務器查詢其對應的 ip,而是直接返回緩存中的結果。如果此時權威服務器中的 baidu.com 對應的 ip 發生了變化,LocalDNS 沒有及時更新,這樣會導致用戶訪問不到服務器。

‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍4.3 轉發解析‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

你用手機訪問 baidu.com 時,會到當前運營商的 DNS 服務器查,然後運營商的 DNS 服務再去百度權威服務器去查,最終把權威服務器中的正確 ip 返回。

上面是正常的情況,但是如果當前運營商 (比如聯通) 的 LocalDNS 不訪問百度權威 DNS 服務器,而是直接訪問了其它運營商 (比如電信) 的 LocalDNS 服務器,有些小的運營商就是通過這樣做來降低成本。如果電信的 LocalDNS 對非自家 ip 的訪問限了速那麼很明顯會影響你的 DNS 解析時間。如果你應用中的某些服務需要運營商信息 isp(eg: 只能 dns, cdn 等服務).

下面截圖是我手機的網路環境 (NetPing 開源地址:github.com/mediaios/ne…)

我直接 ping 百度的地址,然後用 wireshark 抓包結果,正常結果如下:

如果發生了轉發則邏輯如下:

5. HTTPDNS

5.1 什麼是 HTTPDNS

HTTPDNS 使用 HTTP 與 DNS 服務器交互,代替傳統的基於 UDP 的 DNS 協議,域名解析請求直接發送到 HTTPDNS 服務端,從而繞過運營商的 Local DNS

5.2 HTTPDNS 的特性

5.2.1 防止域名劫持

由於 HttpDns 是通過 IP 直接請求 HTTP 獲取服務器 A 記錄地址,不存在向本地運營商詢問 domain 解析過程,所以從根本避免了劫持問題。

5.2.2 精準調度

HTTPDNS 能夠直接獲取到用戶的 IP 地址,從而實現精確定位與導流

5.2.3 用戶連接失敗率下降

通過算法降低以往失敗率過高的服務器排序,通過時間近期訪問過的數據提高服務器排序,通過歷史訪問成功記錄提高服務器排序。

原來的請求地址爲 “apis.juhe.cn/simpleWeath…”,通過 HTTPDNS 替換域名後最終的結果如下:

5.3 HTTPS IP Content

發送 HTTPS 請求首先要進行 SSL/TLS 握手,握手過程大致如下:

上述過程中,和 HTTPDNS 有關的是第 3 步,客戶端需要驗證服務端下發的證書,驗證過程有以下兩個要點:

如果上述兩點都校驗通過,就證明當前的服務端是可信任的,否則就是不可信任,應當中斷當前連接。

當客戶端使用 HTTPDNS 解析域名時,請求 URL 中的 host 會被替換成 HTTPDNS 解析出來的 IP,所以在證書驗證的第 2 步,會出現 domain 不匹配的情況,導致 SSL/TLS 握手不成功。

6. 問題

6.1 主機是如何知道 DNS 服務器地的 IP 地址的?

通過 DHCP 動態獲得,或者手工配置的。

DHCP 協議:DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)通常被應用在大型的局域網絡環境中,主要作用是集中的管理、分配 IP 地址,使網絡環境中的主機動態的獲得 IP 地址、Gateway 地址、DNS 服務器地址等信息,並能夠提升地址的使用率。

6.2 爲什麼 DNS 採用 UDP 協議 ?

TCP 通信過程太複雜並且開銷大,一次 TCP 交換需要 9 個包:三個連接包,四個斷開包,一個 request 包,一個響應包。

UDP 通信過程簡單,只需要一個查詢包和一個響應包。

如喜歡本文,請點擊右上角,把文章分享到朋友圈
如有想了解學習的技術點,請留言給若飛安排分享

作者:iosmedia

來源:https://juejin.cn/post/6844903987796246542

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/tjGPGkDLnL9n80qvS1jdvQ