DNS&&HTTPDNS

DNS 是什么?

域名系統(tǒng)即 DNS 就相當于是數(shù)字電話簿,負責將URL解析成對應的IP地址。

公共DNS

我們很難在物理上提升網絡傳輸速度,但我們可以減少一些DNS服務器物理距離。

谷歌公共 DNS

是最流行的 DNS 服務器之一,使用 8.8.8.8 和 8.8.4.4 這兩個 IP 地址。這些被稱為任播地址,在世界各地有多個服務器響應來自這些地址的請求。

Cloudflare公共DNS

Cloudflare 聲稱它將是“互聯(lián)網上速度最快且高度關注隱私保護的消費級 DNS 服務”
并承諾永遠不會將查詢 IP 地址寫入磁盤,并在每 24 小時內就清除所有 DNS 查詢日志一次。以保護隱私。

域名

域名是全球唯一的,需要通過專門的域名注冊商才可以申請注冊。為了組織全球互聯(lián)網中的眾多計算機,域名同樣用點來分開,形成一個分層的結構。而每個被點分割開的字符串,就構成了域名中的一個層級,并且位置越靠后,層級越高。

以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

Host文件屬于一個歷史遺留問題。早年間在ARPANET 時期,是沒有DNS的,整個互聯(lián)網上只有數(shù)百臺主機,那時就是通過hosts 文件來解析域名的。后來Internet 爆發(fā)增長,已經不可能再將所有的主機名與ip的對應關系寫進hosts 文件里面了,那樣速度太難。后來就出現(xiàn)了DNS。DNS是一個分布式的數(shù)據(jù)庫。同時原來的hosts 文件也保留了下來 . 當主機進行dns查詢的時候,是先查找hosts文件,如果在hosts文件中找不到對應關系,再詢問dns服務器的。

① 適用于小型公司局域網或本地的域名解析工作。
② 當 DNS 服務器解析出錯的時候,可以通過臨時修改 HOSTS 文件來解決域名解析問題。
③ 通過修改 HOSTS 文件,添加相應的記錄,可以達到屏蔽廣告的效果。
④ 早期的時候可以通過修改 HOSTS 文件,上 google 網站?,F(xiàn)在該方法應該是無效的了。

內網DNS解析

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


DNS的傳輸

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

為什么DNS使用UDP而不是TCP?

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


傳統(tǒng) DNS 存在的問題

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

  2. 域名轉發(fā)問題
    比如NAT,會影響權威服務器對于請求源的地址判斷,可能返回一個跨運營商的ip地址。
    比如跨運營商轉發(fā),用戶就會得到一個不屬于自己運營商的ip地址。

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

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


HttpDNS

HttpDNS不走傳統(tǒng)的 DNS 解析,而是服務商(比如阿里云)搭建基于 HTTP 協(xié)議的 DNS 服務器集群,分布在多個地點和多個運營商。當客戶端需要 DNS 解析的時候,直接通過 HTTP 協(xié)議進行請求這個服務器集群。
使用 HttpDNS 的,往往是手機應用,需要在手機端嵌入支持 HttpDNS 的客戶端 SDK。

工作流程

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

HttpDNS即使使用Http,也比使用UDP的傳統(tǒng)DNS要快

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

雞生蛋還是蛋生雞

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

HttpDNS的ip地址簿從哪來

直接向權威DNS請求,對于特殊的IP也可以由用戶自行配置


HTTP與DNS的關系

以發(fā)送一個HTTP請求為例:

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

提升DNS解析速度的一些方法

更換一個塊的DNS服務

  1. 解析URL的IP地址

$time nslookup time.geekbang.org

// 域名服務器及端口信息
Server:     1.1.1.1
Address:    1.1.1.1#53

// 非權威查詢結果
Non-authoritative answer:
Name:   time.geekbang.org
Address: 39.106.233.176

// 耗時
real    0m0.245s
user    0m0.003s
sys 0m0.005s

可以看到解析用了0.2秒

  1. 查看你的本地DNS

$ cat /etc/resolv.conf

#
# macOS Notice
#
# This file is not consulted for DNS hostname resolution, address
# resolution, or the DNS query routing mechanism used by most
# processes on this system.
#
# To view the DNS configuration used by this system, use:
#   scutil --dns
#
# SEE ALSO
#   dns-sd(1), scutil(8)
#
# This file is automatically generated.
#
nameserver 1.1.1.1   //這個就是你默認的DNS
  1. 檢查DNS服務器的鏈接速度

$ ping -c3 1.1.1.1

PING 1.1.1.1 (1.1.1.1): 56 data bytes
64 bytes from 1.1.1.1: icmp_seq=0 ttl=51 time=175.752 ms
64 bytes from 1.1.1.1: icmp_seq=1 ttl=51 time=213.000 ms

--- 1.1.1.1 ping statistics ---
3 packets transmitted, 2 packets received, 33.3% packet loss
round-trip min/avg/max/stddev = 175.752/194.376/213.000/18.624 ms

平均194.376ms
你也可以比較其他的DNS地址,比如1.1.1.1,8.8.8.8。然后選出一個最快的。

$ ping -c3 114.114.114.114

PING 114.114.114.114 (114.114.114.114): 56 data bytes
64 bytes from 114.114.114.114: icmp_seq=0 ttl=73 time=37.513 ms
64 bytes from 114.114.114.114: icmp_seq=1 ttl=68 time=34.629 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=60 time=76.672 ms

--- 114.114.114.114 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 34.629/49.605/76.672/19.176 ms

平均 49.605ms

  1. 更換你的DNS服務地址
    找一個你覺得不錯的地址替換一下。

$ time nslookup time.geekbang.org

Server:     114.114.114.114
Address:    114.114.114.114#53

Non-authoritative answer:
Name:   time.geekbang.org
Address: 39.106.233.176


real    0m0.019s
user    0m0.003s
sys 0m0.004s

解析變成了0.019秒

DNSmasq

DNSmasq 是最常用的 DNS 緩存服務之一,還經常作為 DHCP 服務來使用。它的安裝和配置都比較簡單,性能也可以滿足絕大多數(shù)應用程序對 DNS 緩存的需求。


參考資料

趣談網絡協(xié)議

Linux性能優(yōu)化實戰(zhàn)

為什么DNS使用UDP而不是TCP?

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

Linux性能優(yōu)化實戰(zhàn)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 點贊關注,不再迷路,你的支持對我意義重大!?? Hi,我是丑丑。本文「計算機網絡」| 導讀 —— 跬步千里,始于足下...
    彭旭銳閱讀 1,300評論 0 9
  • 目錄 1、Dns2、HttpDns 1、Dns 終端向LocalDNS發(fā)起遞歸查詢。 LocalDNS(未開啟轉發(fā)...
    小紅軍storm閱讀 1,252評論 0 1
  • DNS域名解析就是將我們熟知的域名轉換為ip的服務。如將 www.baidu.com 轉換為 61.135.169...
    OOM_Killer閱讀 7,371評論 0 6
  • 背景 IP直連可以避免localDNS解析導致的DNS劫持,但是在iOS中不僅僅是將host直接換成IP地址就可以...
    tom555cat閱讀 6,458評論 0 10
  • 來自公眾號:我是程序員小賤作者L的存在 提到網絡,基本上都能把DNS給扯上去。為啥呢,今天我們來一探究竟。 1 C...
    碼農小光閱讀 486評論 0 2

友情鏈接更多精彩內容