計算機網路-DNS和HTTPDNS

語言: CN / TW / HK

DNS 和 HTTPDNS

DNS

使用者與網際網路中的某臺主機通訊的時,必須知道對方的 IP 地址,然而使用者很難記住長達 32 位的 IP 二進位制主機地址,即使是點分十進位制的 IP 地址也是不太容易記憶。為了方便記憶,引入了域名系統,用來便於人們使用的機器名字轉換成 IP 地址。

域名和 IP 地址的對映關係就是記錄在 DNS 伺服器中的。

域名解析的過程

  • 主機向本地域名伺服器的查詢採⽤遞迴查詢。如果本地域名伺服器不能解析域名的 IP 地址,本地域名伺服器就以 DNS 客戶的身份,向根域名伺服器發出查詢請求報⽂;

  • 本地域名伺服器向根域名伺服器的查詢採⽤迭代查詢。當根域名伺服器收到本地域名伺服器的迭代查詢請求報⽂時,要麼給出所要查詢的 IP 地址,要麼告訴本地域名伺服器:“你下⼀步應當向哪⼀個域名伺服器進⾏查詢”。

這裡首先來看幾個重要的概念

根域名伺服器

根域名伺服器是最高層次,最重要的域名伺服器。根域名伺服器知道所有的頂級域名伺服器的域名和 IP 地址。本地域名伺服器要對互聯⽹上任何⼀個域名進⾏解析,如果⾃⼰⽆法解析,⾸先求助根域名伺服器。

頂級域名伺服器

這些域名伺服器負責管理在該頂級域名伺服器註冊的所有二級域名。當收到 DNS 查詢請求時,就給出相應的回答(可能是最後的結果,也可能是下一步應當查詢的域名伺服器的 IP 地址)

許可權域名伺服器

負責一個區的域名伺服器,當一個許可權域名伺服器,還不能給出最後的查詢回答時,就會告訴發出請求的 DNS 客戶端,下一步應當找哪個許可權域名伺服器。

本地域名伺服器

當一個主機發出 DNS 查詢的時候,首先就是傳送給本地域名伺服器。每一個網際網路提供者 ISP ,或者一個大學都可以有自己的本地域名伺服器。

如果是通過DHCP配置,本地 DNS 由你的網路服務商(ISP),如電信、移動等自動分配,它通常就在你網路服務商的某個機房。

來看下查詢的步驟

1、主機向本地域名伺服器查詢 www.tsinghua.edu.cn 的 IP 地址,這一步是遞迴查詢;

2、本地域名伺服器會在自己的伺服器中查詢對應的域名對映關係,如果找了直接返回 IP 地址,沒有就會詢問根域名伺服器;

3、根域名伺服器會告訴本地域名伺服器,下一次查詢的頂級域名伺服器的 IP 地址;

4、本地伺服器繼續向頂級域名伺服器發起查詢請求;

5、頂級域名伺服器找到了就返回結果,如果沒找到就會告訴本地域名伺服器,下一次查詢的許可權域名伺服器的 IP 地址;

6、本地伺服器繼續向許可權域名伺服器發起查詢請求;

7、許可權域名伺服器會告訴本地域名伺服器,查詢的主機 IP 地址,當一個許可權域名伺服器,還不能給出最後的查詢回答時,就會告訴發出請求的 DNS 客戶端,下一步應當找哪個許可權域名伺服器;

8、本地域名伺服器最終把查詢結果返回給主機,主機就能和目標建立連線了。

傳統 DNS 存在的問題

1、域名快取問題

會在本地做一個快取,這樣就不用每一個請求都去請求權威 DNS 伺服器,當再次訪問直接拿取本地的快取即可。

既然是有快取,就會存在快取同步不及時的情況,這樣一些請求就會發送到舊的頁面。

再就是本地的快取,往往使得全域性負載均衡失敗,因為上次進行快取的時候,快取中的地址不一定是這次訪問離客戶最近的地方,如果把這個地址返回給客戶,那肯定就會繞遠路。

2、域名轉發問題

經過域名轉發,域名查詢可能會跨運營商。

慄如:

如果是A運營商的客戶,訪問自己運營商的 DNS 伺服器,如果 A 運營商去權威 DNS 伺服器查詢的話,權威 DNS 伺服器知道你是A運營商的,就返回給一個部署在 A 運營商的網站地址,這樣針對相同運營商的訪問,速度就會快很多。

但是A運營商偷懶,將解析的請求轉發給 B 運營商,B 運營商去權威 DNS 伺服器查詢的話,權威伺服器會誤認為,你是 B 運營商的,那就返回給你一個在 B 運營商的網站地址吧,結果客戶的每次訪問都要跨運營商,速度就會很慢。

3、出口 NAT 問題

我們知道,網路出口的時候,很多機房都會配置NAT,也即網路地址轉換,使得從這個網關出去的包,都換成新的IP地址。NAT不僅能解決IP地址不足的問題,而且還能夠有效地避免來自網路外部的攻擊,隱藏並保護網路內部的計算機。當然請求返回的時候,在這個閘道器,再將IP地址轉換回去,所以對於訪問來說是沒有任何問題。

但是一旦做了網路地址的轉換,權威的DNS伺服器,就沒辦法通過這個地址,來判斷客戶到底是來自哪個運營商,而且極有可能因為轉換過後的地址,誤判運營商,導致跨運營商的訪問。

4、DNS 域名更新問題

本地DNS伺服器是由不同地區、不同運營商獨立部署的。對域名解析快取的處理上,實現策略也有區別,有的會偷懶,忽略域名解析結果的TTL時間限制,在權威DNS伺服器解析變更的時候,解析結果在全網生效的週期非常漫長。但是有的時候,在DNS的切換中,場景對生效時間要求比較高。

例如雙機房部署的時候,跨機房的負載均衡和容災多使用DNS來做。當一個機房出問題之後,需要修改權威DNS,將域名指向新的IP地址,但是如果更新太慢,那很多使用者都會出現訪問異常。

5、解析延遲問題

DNS的查詢過程需要遞迴遍歷多個DNS伺服器,才能獲得最終的解析結果,這會帶來一定的時延,甚至會解析超時。

6、運營商劫持

本地運營商可能對某些域名進行劫持、遮蔽。

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

HTTPDNS

因為傳統的 DNS 存在上面的一些問題,所以這裡引出了 HTTPDNS。

HTTPNDS 其實就是,不走傳統的 DNS 解析,而是自己搭建基於 HTTP 協議的 DNS 伺服器叢集,分佈在多個地點和多個運營商。當客戶端需要 DNS 解析的時候,直接通過 HTTP 協議進行請求這個伺服器叢集,得到就近的地址。

同時因為預設的域名解析都是走 DNS 的,使用 HTTPDNS 需要繞過預設的 DNS 路徑,所以使用 HTTPDNS 的,大多數是手機應用,需要在手機端嵌入支援 HTTPDNS 的客戶端 SDK。

HTTPDNS 的優點

1、跳過 LocalDNS,防止本地 DNS 劫持;

2、直接通過 IP 訪問,平均訪問延遲下降;

3、伺服器演算法篩選最佳節點 IP,提升請求成功率;

4、快速更換 IP(不受 TTL 的限制)。

HTTPDNS 的適用場景

1、App 防止惡意劫持;

2、對訪問速度要求高的應用;

3、應用、影片加速服務,配合 CDN,通過 DNS 伺服器返回最佳節點,提高訪問效率;

4、提供更靈活的流量排程能力。

HTTPDNS 的工作模式

1、在客戶端的 SDK 裡動態請求服務端,獲取 HTTPDNS 伺服器的IP列表,快取到本地。隨著不斷地解析域名,SDK 也會在本地快取 DNS 域名解析的結果;

2、當手機應用要訪問一個地址的時候,首先看是否有本地的快取,如果有就直接返回,沒有就請求 HTTPDNS 伺服器;

2、請求 HTTPDNS 的伺服器,HTTPDNS 的伺服器都會提供 api 介面,選擇對應的介面發出介面請求,會返回一個要訪問的網站的 IP 列表;

3、客戶端,收到返回的 IP 列表,就能選擇 IP ,建立連線,發起正常訪問操作;

4、若客戶端向 HttpDNS 伺服器請求失敗,則啟用備選,走正常 DNS 解析過程,向 Local DNS 發起請求;

5、 LocalDNS 進行遞迴查詢;

6、最終返回 DNS 結果;

7、客戶端拿到最優 IP 後,建立連線,發起正常訪問操作。

總結

1、傳統的DNS有很多問題,例如解析慢、更新不及時。因為快取、轉發、NAT 問題導致客戶端誤會自己所在的位置和運營商,從而影響流量的排程。

2、HTTPDNS 通過客戶端 SDK 和服務端,通過 HTTP 直接呼叫解析 DNS 的方式,繞過了傳統 DNS 的這些缺點,實現了智慧的排程。

參考

【極客時間-趣談網路協議】https://time.geekbang.org/column/intro/100007101

【計算機網路第八版】https://www.bilibili.com/video/BV1WP4y1j7JU?p=1

【計算機網路學習筆記】https://github.com/boilingfrog/Go-POINT/tree/master/tcp

【全面理解DNS及HTTPDNS】https://juejin.cn/post/6844903987796246542