DNS&&HTTPDNS

域名

域名是全球唯一的,需要通過專門的域名註冊商纔可以申請註冊。爲了組織全球互聯網中的衆多計算機,域名同樣用點來分開,形成一個分層的結構。而每個被點分割開的字符串,就構成了域名中的一個層級,並且位置越靠後,層級越高。

以time.geekbang.org 爲例,來理解域名的含義。
這個字符串中,最後面的 org 是頂級域名,中間的 geekbang 是二級域名,而最左邊的 time 則是三級域名。
所有域名都以點作爲後綴,也可以理解爲,在域名解析的過程中,所有域名都以點結束。



DNS解析

幾種DNS服務器:

  1. 本地 DNS服務器:
    如果是通過 DHCP 配置,本地 DNS 由你的網絡服務商(ISP),如電信、移動等自動分配,它通常就在你網絡服務商的某個機房
  2. 根 DNS 服務器 :
    持有所有頂級域(.cn/.com/.org.....)DNS服務器地址,並返回對應服務器
  3. 頂級域 DNS 服務器:
    持有所有下屬權威域(dex.org/geekbang.org.....)DNS服務器地址,並返回對應服務器
  4. 權威 DNS 服務器:
    持有所屬域名(www.geekbang.org/time.geekbang.org....)主機ip,並返回對應ip地址

以查詢time.geekbang.org對應ip地址爲例:


dig +trace +nodnssec

也可以用更加詳細的命令,查看整個流程:

dig +trace +nodnssec 域名

本地host解析

可以把主機名和 IP 地址的映射關係,寫入本機的 /etc/hosts 文件中

$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain
::1         localhost6 localhost6.localdomain6
192.168.0.100 domain.com

內網DNS解析

搭建自定義的 DNS 服務器,專門用來解析內網中的域名。而內網 DNS 服務器,一般還會設置一個或多個上游 DNS 服務器,用來解析外網的域名


DNS的傳輸

DNS 協議在 TCP/IP 棧中屬於應用層,不過實際傳輸還是基於 UDP 或者 TCP 協議(UDP 居多) ,並且域名服務器一般監聽在端口 53 上。

爲什麼DNS使用UDP而不是TCP?

由於TCP三次握手的規則限制,採用UDP傳輸,DNS域名解析時間更小。
再加上多級域服務器的遞歸查詢,三次握手的耗時會被更加放大。


傳統 DNS 存在的問題

  1. 域名緩存問題
    不是每一個請求,它都會去訪問權威 DNS 服務器,而是訪問過一次就把結果緩存到自己本地用於之後的查詢。
    一旦想要訪問的ip地址發生變化(負載均衡,頁面更新),可能就無法返回最新、最高效的ip地址了

  2. 域名轉發問題
    比如NAT,會影響權威服務器對於請求源的地址判斷,可能返回一個跨運營商的ip地址。

  3. 域名更新
    本地 DNS 服務器是由不同地區、不同運營商獨立部署的。對域名解析緩存的處理上,實現策略也有區別,有快有慢。
    在負載均衡和觸發容災時,權威 DNS更新速度決定有多少用戶會出現訪問異常。

  4. 解析延遲問題
    DNS 的查詢過程需要遞歸遍歷多個 DNS 服務器,才能獲得最終的解析結果。


HttpDNS

HttpDNS不走傳統的 DNS 解析,而是自己搭建基於 HTTP 協議的 DNS 服務器集羣,分佈在多個地點和多個運營商。當客戶端需要 DNS 解析的時候,直接通過 HTTP 協議進行請求這個服務器集羣。
使用 HttpDNS 的,往往是手機應用,需要在手機端嵌入支持 HttpDNS 的客戶端 SDK。

工作流程

在客戶端的 SDK 裏動態請求服務端,獲取 HttpDNS 服務器的 IP 列表,緩存到本地。隨着不斷地解析域名,SDK 也會在本地緩存 DNS 域名解析的結果。
當手機應用要訪問一個地址的時候,首先看是否有本地的緩存,如果有就直接返回。這個緩存和本地 DNS 的緩存不一樣的是,這個是手機應用自己做的,而非整個運營商統一做的。如何更新、何時更新,手機應用的客戶端可以和服務器協調來做這件事情。
如果本地沒有,就需要請求 HttpDNS 的服務器,在本地 HttpDNS 服務器的 IP 列表中,選擇一個發出 HTTP 的請求,會返回一個要訪問的網站的 IP 列表。

HttpDNS即使使用Http,也比使用UDP的傳統DNS要快

HttpDNS服務端不會使用遞歸的方式依次通過根域名、頂級域名、權威域名去遞歸查詢,而是直接返回目標IP。

雞生蛋還是蛋生雞

HttpDNS服務器的地址一般不變 可以使用DNS的方式獲取HttpDNS服務器的ip地址 也可以直接把HttpDNS服務器的ip地址寫死在客戶端中。


HTTP與DNS的關係

以發送一個HTTP請求爲例:

  1. 生成HTTP請求消息
  2. 根據域名,通過DNS查詢解析出ip地址
  3. 找到IP地址對應的服務器通過三次握手建立TCP連接,向服務器發送HTTP Request請求,並得到服務器的Response響應

參考資料

趣談網絡協議

Linux性能優化實戰

爲什麼DNS使用UDP而不是TCP?

HTTP請求過程(一)——DNS解析過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章