本文轉載自HttpDns 原理是什么
什么是 DNS
DNS(Domain Name System,域名系統),DNS 服務用於在網絡請求時,將域名轉為 IP 地址。能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的 IP 數串。
傳統的基於 UDP 協議的公共 DNS 服務極易發生 DNS 劫持,從而造成安全問題。
DNS 域名系統結構
Root 域名:DNS 域名使用時,規定由尾部句號來指定名稱位於根或更高級別的域層次結構
Top Level 頂級域名:用來指示某個國家、地區或組織使用的名稱的類型名稱。如 .com
Second Level 域名:個人或組織在 Internet 上使用的注冊名稱。如 linkedkeeper.com
Third Level 域名:已注冊的二級域名派生的域名。如 misc.linkedkeeper.com
DNS 解析過程
-
瀏覽器中輸入 www.linkedkeeper.com,發出解析請求。
-
本機的域名解析器 resolver 程序查詢本地緩存和 host 文件中是否為域名的映射關系,如果有則調用這個 IP 地址映射,完成解析。
-
如果 hosts 與本地解析器緩存都沒有相應的網址映射關系,則本地解析器會向 TCP/IP 參數中設置的首選 DNS 服務器(我們叫它 Local DNS 服務器)發起一個遞歸的查詢請求。
-
服務器收到查詢時,如果要查詢的域名由本機負責解析,則返回解析結果給客戶機,完成域名解析,此解析具有權威性。如果要查詢的域名,不由 Local DNS 服務器解析,但該服務器已緩存了此網址映射關系,則調用這個 IP 地址映射,完成域名解析,此解析不具有權威性。
-
如果 Local DNS 服務器本地區域文件與緩存解析都失效,則根據 Local DNS 服務器的設置(是否遞歸)進行查詢,如果未用開啟模式,Local DNS 就把請求發至13台 Root DNS。如果用的是遞歸模式,此 DNS 服務器就會把請求轉發至上一級 DNS 服務器,由上一級服務器進行解析,上一級服務器如果不能解析,或找根 DNS 或把轉請求轉至上上級,以此循環。
-
Root DNS 服務器收到請求后會判斷這個域名是誰來授權管理,並會返回一個負責該頂級域名服務器的一個 IP。
-
Local DNS 服務器收到 IP 信息后,將會聯系負責 .com 域的這台服務器。
-
負責 .com 域的服務器收到請求后,如果自己無法解析,它就會找一個管理 .com 域的下一級 DNS 服務器地址給本地 DNS 服務器。
-
當 Local DNS 服務器收到這個地址后,就會找 linkedkeeper.com 域服務器,10、11重復上面的動作,進行查詢。
-
最后 www.linkedkeeper.com 返回需要解析的域名的 IP 地址給 Local DNS 服務器。
-
Local DNS 服務器緩存這個解析結果(同時也會緩存,6、8、10返回的結果)。
-
Local DNS 服務器同時將結果返回給本機域名解析器。
-
本機緩存解析結果。
-
本機解析器將結果返回給瀏覽器。
-
瀏覽器通過返回的 IP 地址發起請求。
遞歸查詢和迭代查詢
- 遞歸查詢:如果主機所詢問的本地域名服務器不知道被查詢域名的 IP 地址,那么本地域名服務器就以 DNS 客戶的身份,向其他根域名服務器繼續發出查詢請求報文,而不是讓該主機自己進行下一步的查詢。
- 迭代查詢:當根域名服務器收到本地域名服務器發出的迭代查詢請求報文時,要么給出所要查詢的 IP 地址,要么告訴本地域名服務器:你下一步應當向哪一個域名服務器進行查詢。然后讓本地域名服務器進行后續的查詢,而不是替本地域名服務器進行后續的查詢。
由此可見,客戶端到 Local DNS 服務器,Local DNS 與上級 DNS 服務器之間屬於遞歸查詢;DNS 服務器與根 DNS 服務器之前屬於迭代查詢。
實際環境中,因為采用遞歸模式會導致 DNS 服務器流量很大,所以現在大多數的 DNS 都是迭代模式。
結合 Wireshark 分析 DNS 協議
HttpDns 是什么
HTTPDNS 利用 HTTP 協議與 DNS 服務器交互,代替了傳統的基於 UDP 協議的 DNS 交互,繞開了運營商的 Local DNS,有效防止了域名劫持,提高域名解析效率。另外,由於 DNS 服務器端獲取的是真實客戶端 IP 而非 Local DNS 的 IP,能夠精確定位客戶端地理位置、運營商信息,從而有效改進調度精確性。
HttpDns 主要解決的問題
- Local DNS 劫持:由於 HttpDns 是通過 IP 直接請求 HTTP 獲取服務器 A 記錄地址,不存在向本地運營商詢問 domain 解析過程,所以從根本避免了劫持問題。
- 平均訪問延遲下降:由於是 IP 直接訪問省掉了一次 domain 解析過程,通過智能算法排序后找到最快節點進行訪問。
- 用戶連接失敗率下降:通過算法降低以往失敗率過高的服務器排序,通過時間近期訪問過的數據提高服務器排序,通過歷史訪問成功記錄提高服務器排序。
如何進行改造支持 HttpDns
目前,國內有一部分廠商已經提供了這個解析服務,可以直接使用第三方服務。目前,提供 HttpDns 解析服務的有:阿里雲HttpDNS
阿里雲的 HttpDNS 服務的 API 比較標准,直接發一個 Get 請求,帶上請求參數,返回結果以 json 返回。
http://203.107.1.1/d?host=www.linkedkeeper.com
請求成功時,返回結果如下:
{`` ``"host"``: ``"www.linkedkeeper.com"``,`` ``"ips"``: [`` ``"115.238.23.241"``,`` ``"115.238.23.251"`` ``],`` ``"ttl"``: 57``}
在移動端,將由 HttpDns 獲得的 IP 地址在原有 URL 的基礎上,將域名替換為 IP,然后用新的 URL 發起 HTTP 請求。