HTTPDNS使用HTTP協議進行域名解析,代替現有基於UDP的DNS協議,域名解析請求直接發送到阿里雲的HTTPDNS服務器,從而繞過運營商的Local DNS,可以避免Local DNS形成的域名劫持問題和調度不精準問題。
HTTPDNS是面向移動開發者推出的一款域名解析產品,具備域名防劫持、精準調度等特性。開通HTTPDNS服務後,您就能夠在管理控制檯添加要解析的域名,調用服務API進行域名解析。HTTPDNS是一款遞歸DNS服務,與權威DNS不一樣,HTTPDNS並不具有決定解析結果的能力,而是主要負責解析過程的實現。html
衆所周知,發送HTTP請求後,會經過DNS解析,找到服務器後再響應請求。不過,傳統的DNS系統存在不少問題,最多見的就是DNS劫持、平均訪問延遲較高、用戶鏈接失敗率較高這三個問題。其中最重要的是DNS劫持,由於DNS解析是交給運營商來作的,因此解析結果被運營商劫持插入廣告,解析結果不按 TTL 緩存,解析被錯誤遞歸(跨地區甚至跨運營商)等問題致使咱們不得不去尋找一種能夠繞開運營商的辦法來作【域名->IP】的映射方式,那就是HttpDNS。算法
HttpDNS是經過ip直接請求http獲取服務器A記錄地址,不存在向本地運營商詢問domain解析過程,因此從根本避免了劫持問題。同時因爲是ip直接訪問省掉了一次domain解析過程,能夠在必定程度上下降平均訪問延遲。HttpDNS和LocalDNS最大的區別在與:前者使用HTTP協議進行域名解析;後者協議運行在UDP協議之上,使用端口號53。json
網絡通信大部分是基於TCP/IP協議的,而TCP/IP是基於IP尋址的,因此計算機在網絡上進行通信時只能識別如「202.96.134.133」之類的IP地址,而不能認識域名,而其中的轉換工做就須要藉助DNS域名解析服務。簡單來講,DNS就是提供將主機名和域名轉換爲IP地址的工做,工做原理以下圖。設計模式
事實上,DNS是一個應用層協議,他爲其餘應用層協議提供解析工做,包括不限於HTTP和SMTP以及FTP,用於將用戶提供的主機名解析爲ip地址。具體的工做過程以下:
①用戶主機上運行着DNS的客戶端,就是咱們的PC機或者手機客戶端運行着DNS客戶端了;
②瀏覽器將接收到的url中抽取出域名字段,就是訪問的主機名,好比http://www.baidu.com/, 並將這個主機名傳送給DNS應用的客戶端;
③DNS客戶機端向DNS服務器端發送一份查詢報文,報文中包含着要訪問的主機名字段(中間包括一些列緩存查詢以及分佈式DNS集羣的工做);
④該DNS客戶機最終會收到一份回答報文,其中包含有該主機名對應的IP地址;
⑤一旦該瀏覽器收到來自DNS的IP地址,就能夠向該IP地址定位的HTTP服務器發起TCP鏈接。瀏覽器
能夠發現,當應用程序發送網絡請求時,會調用DNS的客戶機端,並指明須要被轉換的主機名。當用戶主機的DNS客戶端接收到請求後,會向網絡中發送一個DNS查詢報文。全部DNS請求和回答報文使用的UDP數據報通過端口53發送,通過若干ms到若干s的延時後,用戶主機上的DNS客戶端接收到一個提供所但願映射的DNS回答報文。所以,從用戶主機上調用應用程序的角度看,DNS是一個提供簡單、直接的轉換服務的黑盒子。但事實上,實現這個服務的黑盒子很是複雜,它由分佈於全球的大量DNS服務器以及定義了DNS服務器與查詢主機通訊方式的應用層協議組成。而且,全球的根域名服務器只有13個,爲何是13個,而不是更多,請看爲什麼根域名服務器只有13個?。緩存
DNS的一種簡單的設計模式就是在因特網上只使用一個DNS服務器,該服務器包含全部的映射,在這種集中式的設計中,客戶機直接將全部查詢請求發往單一的DNS服務器,同時該DNS服務器直接對全部查詢客戶機作出響應,儘管這種設計方式很是誘人,但他不適用當前的互聯網,由於當今的因特網有着數量巨大而且在持續增加的主機,這種集中式設計會有單點故障(嗝屁一個,全球着急),通訊容量(上億臺主機發送的查詢DNS報文請求,包括但不限於全部的HTTP請求,電子郵件報文服務器,TCP長鏈接服務),遠距離的時間延遲(澳大利亞到紐約的舉例),維護開銷大(由於全部的主機名-ip映射都要在一個服務站點更新)等問題。服務器
DNS服務器通常分三種,根DNS服務器,頂級DNS服務器,權威DNS服務器,架構圖以下。網絡
假設全國有多個數據中心,託管在多個運營商,每一個數據中心三個可用區。對象存儲經過跨可用區部署,實現高可用性。在每一個數據中心中,都至少部署兩個內部負載均衡器,內部負載均衡器後面對接多個對象存儲的前置服務器。
在上面的DNS架構體系中,其工做的流程大致以下:架構
不過,正如文章開頭說的,傳統的DNS存在不少缺點:
域名緩存問題:本地作一個緩存,直接返回緩存數據。可能會致使全局負載均衡失敗,由於上次進行的緩存,不必定是此次離客戶最近的地方,可能會繞遠路。
域名轉發問題:若是是A運營商將解析的請求轉發給B運營商,B去權威DNS服務器查詢的話,權威服務器會認爲你是B運營商的,就返回了B運營商的網站地址,結果每次都會誇運營商。
出口NAT問題:作了網絡地址轉化後,權威的DNS服務器,無法經過地址來判斷客戶究竟是哪一個運營商,極有可能誤判運營商,致使跨運營商訪問。
域名更新問題:本地DNS服務器是由不一樣地區,不一樣運營商獨立部署的,對域名解析緩存的處理上,有區別,有的會偷懶忽略解析結果TTL的時間限制,致使服務器沒有更新新的ip而是指向舊的ip。
解析延遲:DNS的查詢過程須要遞歸遍歷多個DNS服務器,才能得到最終結果。可能會帶來必定的延時。app
HTTPDNS 利用 HTTP 協議與 DNS 服務器交互,代替了傳統的基於 UDP 協議的 DNS 交互,繞開了運營商的 Local DNS,有效防止了域名劫持,提升域名解析效率。另外,因爲 DNS 服務器端獲取的是真實客戶端 IP 而非 Local DNS 的 IP,可以精肯定位客戶端地理位置、運營商信息,從而有效改進調度精確性。
正是因爲傳統的DNS存在諸多的缺點,因此如今稍微有點規模的公司都會本身搭建HTTPDNS服務器。HTTPDNS 的原理很簡單,將 DNS 這種容易被劫持的協議,轉爲使用 HTTP 協議請求 Domain <-> IP 映射。 得到正確 IP 以後,Client 本身組裝 HTTP 協議,從而避免 ISP 篡改數據。它的架構圖也比較簡單,以下圖所示。
使用HttpDns,能夠有效解決傳統DNS的DNS劫持、訪問時間延遲等問題。
關於HTTPDNS改造的文章和方案也不少,以下:
【鵝廠網事】全局精確流量調度新思路-HttpDNS服務詳解
滬江從DNS到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 請求便可。