DNS 靈魂三問:why,when,how

本文將討論三個問題:html

  • 爲何要有 DNS
  • 何時進行 DNS 查詢
  • DNS 如何工做

DNS 是 Domain Name System 的縮寫,做用很簡單,根據域名查詢對應的 IP 地址。ios

爲何要有 DNS

TCP/IP 約定每一個網絡請求包根據 IP 地址確認接收方。這和你打電話須要知道對方電話號碼同樣。程序員

由於 IP 地址很差記憶,因此有了一層域名映射。數據庫

爲何不設計成直接根據域名確認接收方呢?瀏覽器

在 iPv4 裏,IP 地址是 4 個 0-255 的數,2 的 8 次方,8 bit,1 byte。只要 4 個字節的大小。 若是是支持字符串,就算用最簡單的 ASCII 編碼,一個字符就要 1 個字節。一個常見的域名一般十幾個字符,最長能夠支持 255 個字符,比用 IP 表示大了不少倍。緩存

有的人可能以爲雖然大了不少倍,可是若是隻是一個請求大了幾個字節性能影響也不大。這裏面還有一個誤區,TCP/IP 只是一個協議,網絡中和通信有關設備是多種多樣的。好比我發送一個 5 KB 的字符串,中間有可能經過光纖傳遞傳遞,也有可能經過早期的銅纜。不一樣的鏈接材料的帶寬區別很大。有可能一個包的 maxSize 只能是 1 KB(IP 層的 MTU)。應用層的數據在通信過程當中會根據通信設備的帶寬分紅不少個包。一個 http 請求並非只發了一個包,可能一次請求被拆成了不少個包。因此若是用域名,網絡請求的數據量會增長不少。服務器

何時進行 DNS 查詢

如今咱們知道最後通信的時候咱們經過 DNS 得到了一個 IP 地址。當咱們在瀏覽器輸入一個 URL 後,是在何時、誰進行的查詢?網絡

瀏覽器得到這個請求後,甩給了操做系統,操做系統甩給了網卡,網卡做爲真正幹活的人把包按照鏈路層協議送了出去。架構

DNS 發生在 TCP/IP 以前。前面已經提過,到 TCP/IP 協議棧的時候已是有 IP 地址了。爲何不把 DNS 定義在 TCP/IP 裏呢?反正網絡請求都是 TCP/IP 負責,若是發現是域名就順便解析一下唄。 這就是架構設計的美妙。聯想一下咱們實際生活的場景,你要寄一個禮物給遠方的朋友,收件員來了,他會關心收件人的地址你是怎麼查到的嗎?他有提供根據收件人姓名提供地址的服務嗎?他順便作了也很好啊。沒作是由於這不是他們的核心業務。一樣,TCP/IP 只負責通信,不負責 IP 地址的查詢app

真相就是操做系統進行的 DNS 查詢。因此在操做系統的網絡設置中,能夠進行 DNS 服務器的配置。操做系統也同時管理了 DNS 的緩存。《iOS網絡請求優化之DNS映射》中提到:

像 iOS 系統通常是 24 小時以後會過時,還有進入飛行模式再切回來,開關機,重置網絡設置等也會致使 DNS cache 的清除。因此通常狀況下用戶在次日打開你的 app 都會經歷一次完整的 DNS 解析請求。

DNS 如何工做

一個簡單的版本,在世界的中心有一臺服務器,服務器裏有一個數據庫,數據庫裏有一張表,這張表裏存着域名和 IP 地址的記錄。你想要查什麼服務器都給你。

若是產品經理描述應該就是這樣的,接着會說這是一個小需求,何時能夠上線。

DNS 不只只是查詢 IP

除了域名解析的 A 記錄。還包括了 MX(Mail eXchange)郵件服務器地址,還有別名 CNAME 記錄。 實際上還有不少其餘功能,好比根據 IP 地址反查域名(PTR),查詢域名 DNS 服務器 IP 地址(NS)。

不是一臺服務器,是分佈式服務器

互聯網中有那麼多的域名,所有都存在一臺服務器中顯然是不可能的。全世界天天有那麼多的域名新增、修改,若是全往一臺服務器作 IO ,性能多強也扛不住。

DNS 是分層的數據庫結構。

好比一個域名 live.apple.com, 分紅了4層:根域名、com、apple、live。根域名是用.表示,由於域名的最後的.能夠被忽略,全部經常被人遺忘,完整的域名錶示是live.apple.com.

假設咱們要解析這個域名的 IP ,會去系統配置的 DNS 服務器查,若是 DNS 服務器沒有這個域名的緩存,則會去根域名的服務器查出負責 com 域名的服務器,接着再從 com 找到 apple 的域名。

若是咱們就持有 apple 域名,apple 下的子域名咱們能夠本身控制。有兩種控制方式,一種是直接把子域名一塊兒註冊到 apple 域名裏,記錄在 com 域名服務器下。一種是自建 name server,就是前面提到的 NS 記錄。此時向 com 域名查詢 apple,會返回你本身配置的 name server 服務器地址,解析就由你本身控制了。

自建 name server 一般是對域名商的 ns 性能不滿意。《DNS 基礎知識》裏提到:

雖然頂級域名註冊商都有本身的 nameserver, 但註冊商提供的 nameserver 並不專業,在性能和穩定性上沒法知足企業需求,這時就須要企業搭建本身的高性能 nameserver ,好比增長智能解析功能,讓不一樣地域的用戶訪問最近的 IP,以此來提升服務質量。

根域名服務器

爲何 DNS 服務器知道根域名服務器的地址呢?根域名服務器的地址是固定的,目前全球有 13 個根域名解析服務器,這 13 條記錄持久化在每臺 DNS 服務器中。

爲何是 13 條?由於 DNS 使用 UDP 查詢,UDP 在 IPv4 內的最大有效大小爲 512 字節。要讓全部的根域名包含在一個報文裏,只能把數量限制在 13 個。根域名服務器用單個字母表示,中國大陸境內共有 F、I、J、L 這 4 個根域的 6 臺DNS鏡像(L 有三臺鏡像)在提供服務。

幸運的是,採用 anyCast 技術架設鏡像服務器可解決該問題,並使得實際運行的根域名服務器數量大大增長。截至 2017 年 11 月,全球共有 800 臺根域名服務器在運行。

智能解析

智能解析,就是當一個域名對應多個 IP 時,當你查詢這個域名的 IP,會返回離你最近的 IP。 因爲國內不一樣運營商之間的帶寬很低,因此電信用戶訪問聯通的 IP 就是一個災難,而智能 DNS 解析就能解決這個問題。

智能解析依賴 EDNS 協議,這是 google 起草的 DNS 擴展協議, 修改比較簡單,就是在 DNS 包裏面添加 origin client IP, 這樣 nameserver 就能根據 client IP 返回距離client 比較近的 server IP 了。

國內最新支持 EDNS 的就是 DNSPod 了,DNSPod 是國內比較流行的域名解析廠商,不少公司會把域名利用DNSPod 加速, 它已經被鵝廠收購。

負載均衡、CDN 的實現也利用了 DNS 智能解析。


參考:


歡迎關注個人微博:@沒故事的卓同窗

掘金博客地址:juejin.im/user/5624c8…

若是想與我有更密切的交流也能夠加入個人小密圈:程序員生存指南

相關文章
相關標籤/搜索