0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么要有DNS?它的設計有哪些是值得我們學習的

jf_ro2CN3Fa ? 來源:小白debug ? 2023-02-06 15:14 ? 次閱讀

為什么要有DNS

如果我們想要訪問某度,你可以在瀏覽器上的搜索欄里輸入112.80.248.76這個IP地址,直達頁面。

e2a276da-a404-11ed-bfe3-dac502259ad0.png

通過IP訪問網頁

這樣的行為,合法,但有病 。

大部分人,連自己對象的電話號碼都記不住,又怎么可能記得住這么一串IP地址呢。

哦,不好意思,傷害到兄弟們了,你們沒對象。

但我假設你們有。

回想一下,雖然你記不住對象的電話號碼,但卻不影響你給她打電話。你的操作過程是不是打開通訊錄 ,輸入"富婆",然后就彈出一個電話號碼。點擊即撥打。

在計算機領域,你大概率也記不住IP,所以也需要有類似的通訊錄的功能 。比如,你只需要輸入www.baidu.com,它就能幫你找到對應的 112.80.248.76,然后進行訪問。

e2b0ee40-a404-11ed-bfe3-dac502259ad0.png用域名訪問

其中www.baidu.com 是域名 ,通過這個域名可以獲得它背后的IP是112.80.248.76。

就像一個人可以有多個電話號碼一樣,一個域名也可以對應有多個IP地址。

而將域名解析為IP的過程,也就是查"通訊錄"的過程 ,其實就是DNSD omain N ame S ystem,域名系統(tǒng))協(xié)議需要做的事情。

另外需要注意的是,上面的這個IP地址,我寫這篇文章的時候能訪問,不代表大家看文章的時候能訪問。因為這背后的IP地址是有可能變更的??梢酝ㄟ^使用 ping www.baidu.com獲得最新的IP地址。

e311ad7a-a404-11ed-bfe3-dac502259ad0.pngping獲得IP

但問題就來了。

普通人的通訊錄,一般有一千個電話號碼就算是社交小達人 了,放在通訊錄里綽綽有余。

然而網站域名,卻不一樣,據說2015年的時候就已經超過3億了。

如果將這3億條記錄都放在一個服務器里,會有兩個問題

? 超過3億條域名數據,數據量過大 ,并且數據量持續(xù)增加

? 需要承受大量的讀請求 。每個網站域名都可能會有成千的訪問。這加起來,四舍五入也有千億qps了。

顯然,如果將DNS做成類似手機通訊錄這樣的單點服務,那是不可能實現這樣的能力的,必須得是分布式系統(tǒng) 。

于是,問題就變成了,如何設計一個支持千億+qps請求的大型分布式系統(tǒng)

我知道肯定有人要說:"這是服務只有10qps的人該考慮的事情嗎?"

雖然我們做的服務可能只有10qps,但這并不妨礙我們學習DNS里優(yōu)秀的設計。

我們就從URL的層次結構聊起。

URL的層次結構

舉個例子。一個常見的域名,比如 www.baidu.com。

可以看到,這個域名中間用了兩個句點 。通過句點符號,可以將域名分為三部分。

其中com被稱為一級域頂級域 ,其他常見的頂級域還有cn,co等,baidu是二級域 ,www則是三級域

除此之后,在com后面,其實還有一個被省略掉的句點號 。它叫根域 。

域名的層次結構

當域名多起來了之后,將它們相同的部分抽取出來,多個域名就可以變成這樣的樹狀層級結構

e3776a34-a404-11ed-bfe3-dac502259ad0.png

層次結構

這時候我們就可以看到,這些域之間其實是一種層級關系 ,就像是學校,年級,班級那樣。

當你想要去定位一個具體域名的時候,你就可以通過這樣的層級找到對應的域名。

舉個例子。大家應該還記得那句廣告詞,"三年級2班的李小明同學,你媽媽拿了兩罐旺仔牛奶給你",其實李小明的媽媽,就是通過,學校、年級、班級的層級形式,一層層找到人。

DNS的原理

我們重新回來看下大佬們是怎么設計DNS。

先直接說最重要的結論。

? 利用層級結構去拆分服務

? 加入多級緩存

接下來展開。

利用URL層級結構去拆分服務

DNS承載的流量壓力非常大,必須要做成分布式服務 ,于是問題的關鍵就變成了如何拆分服務

既然URL是樹狀的層級結構,那保存它們的服務,也可以依據這個,非常自然的拆成樹狀的形式。

一臺服務器維護一個或多個域的信息。于是服務就變成了下面這樣的層級形式。

當我們需要訪問www.baidu.com。

查詢過程就跟下圖一樣。

e3b2695e-a404-11ed-bfe3-dac502259ad0.png

DNS查詢過程

請求會先打到最近的DNS服務器(比如你家的家用路由器)中,如果在DNS服務器中找不到,則DNS服務器會直接詢問根域服務器,在根域服務器中雖然沒有www.baidu.com這條記錄的,但它可以知道這個URL屬于com域,于是就找到com域服務器的IP地址,然后訪問com域服務器,重復上面的操作,再找到放了baidu域的服務器是哪個,繼續(xù)往下,直到找到www.baidu.com的那條記錄,最后返回對應的IP地址。

可以看到,原理比較簡單,但這里涉及到兩個問題。

? 本機怎么知道最近的DNS服務器IP是什么?

? 最近的DNS服務器怎么知道根域的IP是多少?

我們一個個來回答。

本機怎么知道最近的DNS服務器的IP是什么?

這個在之前寫過的《剛插上網線,電腦怎么知道自己的IP是什么?》 提到過,插上網線時,機子會通過DHCP協(xié)議獲得本機的IP地址,子網掩碼,路由器地址,以及DNS服務器的IP地址

e3d6d30c-a404-11ed-bfe3-dac502259ad0.png

DHCP協(xié)議

下面是我的mac機子,第二階段DHCP Offer中的抓包截圖??梢钥吹剑@里面返回的信息里包含了DNS服務器的IP 。

e3f4580a-a404-11ed-bfe3-dac502259ad0.png

offer階段

同時也可以在左上角的點左上角的蘋果圖標->系統(tǒng)表偏好設置->網絡->高級->DNS中查看到DNS服務器的IP地址。

e42b8e9c-a404-11ed-bfe3-dac502259ad0.png

這里有個小細節(jié),從上面的抓包圖里可以看到路由器地址和DNS服務器地址,以及DHCP服務器地址 ,其實都是192.168.31.1,這個其實是我這邊的家用路由器 的IP地址,也就是說一般家用路由器自帶這幾個功能。

而在某里云服務器里,DNS服務器也是一樣,是通過dhcp協(xié)議獲得。查看DNS服務器的IP地址也很方便,執(zhí)行cat /etc/resolv.conf就好了。

e43b8388-a404-11ed-bfe3-dac502259ad0.png

這上面的nameserver中,可以看出有兩臺DNS服務器,機子會按照文件中出現的順序來發(fā)起請求,如果第一臺服務器沒反應,就會去請求第二臺。

最近的DNS服務器怎么知道根域的IP是多少?

我們也知道根域,就是域名樹的頂層,既然是頂層,那信息一般也就相對少一些。對應的IPV4地址只有13個,IPV6地址只有25個。

我們可以通過dig命令的+trace選項來查看一個域名的dns解析過程。

e44bbc4e-a404-11ed-bfe3-dac502259ad0.png

而前面提到的傳說中的13個根域,從字母a-m,就都在上圖中。

但這又引發(fā)了一個問題,上面看到的都是域名。

這。。。

"我本來是想通過域名去找IP的,你又讓我去找其他域名的IP?"

聽起來不科學,這不就死循環(huán) 了嗎。

是的,所以這些根域名對應的IP會以配置文件的形式,放在每個 域名服務器中。

也就是說并不需要再去請求根域名對應的IP ,直接在配置里能讀出來就好了。

下面這個截圖是域名服務器里的配置內容。

可以看到A開頭的根域,它的IPV4地址是198.41.0.4。

e475bada-a404-11ed-bfe3-dac502259ad0.png

加入多級緩存

對于高并發(fā)讀多寫少的場景,加入緩存幾乎就是標配。

DNS也不例外,它加了緩存,而且不止一層。

從在瀏覽器的搜索框中輸入URL。它會先后訪問瀏覽器緩存 、操作系統(tǒng)的緩存 /etc/hosts、最近的DNS服務器緩存 。如果都找不到,才是到根域,頂級(一級)域,二級域等DNS服務器進行查詢請求。

e4938ba0-a404-11ed-bfe3-dac502259ad0.png

加入緩存后的DNS查詢順序

于是請求過程就成了下圖這樣??梢钥吹缴厦嫣岬降暮脦子芯彺娴牡胤轿叶技恿藗€綠色的小文件圖標,優(yōu)先在緩存里做查詢。

e4ae84d2-a404-11ed-bfe3-dac502259ad0.png

加入緩存后的DNS查詢過程

由于緩存了上面樹狀結構的信息,最近的DNS服務器也不再需要每次都從根域 開始查起。比如在緩存里能找到baidu.com的服務器IP,就直接跳到二級域服務器上做查找就好了。

正因為多級緩存的存在,每一層實際接收到的請求都大大減少了。并且每個人日常訪問的網站也就那么幾個,所以大部分時候都能命中緩存直接返回IP地址。

簡單小結下。

DNS的設計中,通過層次結構將服務進行拆分 ,流量分散到多個服務器中。

又通過加入多級緩存 ,讓每個層級實際接收到的請求大大減少,因此大大提高了系統(tǒng)的性能。

兩點 ,是我們做業(yè)務開發(fā)的過程中可以參考的優(yōu)秀設計。

還有一點 ,是我們大概率學不來的,叫任播 ,它也為DNS實現高并發(fā)處理能力提供了重要支持,我會把它放到放到下一篇文章展開聊聊。

協(xié)議格式

DNS是個域名解析系統(tǒng),而運行在這套系統(tǒng)上的協(xié)議,就叫DNS協(xié)議 。

和HTTP類似,DNS協(xié)議也是個應用層協(xié)議 。

e4c59848-a404-11ed-bfe3-dac502259ad0.png

DNS是應用層協(xié)議

下圖是它的報文格式。

e4e906d4-a404-11ed-bfe3-dac502259ad0.png

DNS報文

字段太多,很暈?這就對了。

我們就挑幾個重點的說說。

Transsaction ID 是事務ID,對于一次請求 和這個請求對應的應答 ,他們的事務ID是一樣的,類似于微服務系統(tǒng)中的log_id。

flag字段 是指標志位,有2個Byte,16個bit,需要關注的是QR,OpCode, RCode。

? QR 用來標志這是個查詢還是響應報文,0是查詢,1是響應。

? OpCode 用來標志操作碼,正常查詢都是0,不管是域名查ip,還是ip查域名,都屬于正常查詢 ??梢源直┑恼J為我們平時只會看到0。

? RCode 是響應碼,類似于HTTP里的404, 502 這樣的status code。用來表示這次請求的結果是否正常。0是指一切正常。1是指報文格式錯誤,2服務域名服務器內部錯誤。

Queries 字段,是指你實際查詢的內容。這里其實包含三部分信息,Name, Type, Class。

e50aa47e-a404-11ed-bfe3-dac502259ad0.png

查詢的內容分成三部分信息

? Name 可以放域名或者IP。比如你要查的是baidu.com這個域名對應的IP,那里面放的就是域名 ,反過來通過IP查對應的域名,那Name字段里放的就是IP 。

? Type 是指你想查哪種信息,比如你想查這個域名對應的IP地址是什么,那就是填A(address),如果你想查這個域名有沒有其他別名,就填CNAME(Canonical Name)。如果你想查 xiaobaidebug@gmail.com對應的郵箱服務器地址是什么(比如 gmail.com),那就填MX(Mail Exchanger)。除此之外還有很多類型,下面是常見的Type表格。

e5230956-a404-11ed-bfe3-dac502259ad0.png

? Class字段就比較有意思了,你可以簡單的認為,我們只會看到它填IN (Internet)。其實DNS協(xié)議本來設計出來是考慮到可能會有更多的應用場景的,比如這里還能填CH,HS。大家甚至都不需要知道它們是什么含義,因為隨著時間的發(fā)展,這些都已經成化石了,我們知道這個字段的唯一作用,可能 就是可以在面試的時候可以隨意裝個x,深藏功與名。

e544ef08-a404-11ed-bfe3-dac502259ad0.png

Answers 字段,從名字可以看出,跟Queries對應,一問一答 。作用是返回查詢結果,比如通過域名查對應的IP地址,這個字段里就會放入具體的IP信息。

e583f432-a404-11ed-bfe3-dac502259ad0.png

抓包

原理看完了,來抓個包吧。

我們打開wireshark。然后執(zhí)行

digwww.baidu.com

此時操作系統(tǒng)會發(fā)出DNS請求,查詢 www.baidu.com對應的IP地址。

e60a9b5e-a404-11ed-bfe3-dac502259ad0.pngDNS_Query

上面的圖里是DNS查詢(request)的內容,可以看到它是應用層的協(xié)議,傳輸層用的是UDP協(xié)議 進行數據傳輸。截圖里標紅的部分,也就是上面提到的需要重點關注的報文字段內容。其中flag字段是按bit展示的,因此抓包里進行了分行展示。

接下來再看下響應(response)的數據包內容。

e6c78bec-a404-11ed-bfe3-dac502259ad0.png

DNS_Response

可以看到事務ID (Transaction ID)跟DNS請求 報文是一致的。并且Answers字段里帶有兩個IP地址。試了下,兩個IP地址都是可以正常訪問的。

e6fda6e6-a404-11ed-bfe3-dac502259ad0.pnge71235f2-a404-11ed-bfe3-dac502259ad0.png

總結

? DNS是非常優(yōu)秀的高并發(fā)分布式系統(tǒng),通過層次結構將服務進行拆分 ,流量分散到多個服務器中。又通過加入多級緩存 ,讓每個層級實際接收到的緩存大大減小,因此大大提高了系統(tǒng)的性能。這兩點在做業(yè)務開發(fā)的過程中是可以借鑒的。

? 插上網線通網時,本機通過DHCP協(xié)議獲得DNS服務器的地址。

? 根域服務器的IP會以配置的形式加載到每一臺DNS服務器當中。因此訪問任意一臺DNS服務器都能輕松找到根域對應的IP地址。

最后

最后給大家留下兩個問題。

e731159e-a404-11ed-bfe3-dac502259ad0.png

DNS基于UDP協(xié)議

? 從抓包可以看出,DNS在傳輸層上使用了UDP協(xié)議,那它只用UDP嗎?

? 上面提到,DNS的IPV4根域名 只有13個,這里面其實有不少都部署在漂亮國,那是不是意味著,只要他們不高興了,切斷我們的訪問,我們的網絡就得癱瘓了呢?







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    8701

    瀏覽量

    84565
  • DNS
    DNS
    +關注

    關注

    0

    文章

    211

    瀏覽量

    19700
  • URL
    URL
    +關注

    關注

    0

    文章

    138

    瀏覽量

    15220
  • DHCP協(xié)議

    關注

    0

    文章

    4

    瀏覽量

    4946

原文標題:DNS中有哪些值得學習的架構設計

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    值得多看的FPGA 學習路線

    這個語言做驗證 。 FPGA入門學習第二部分:基礎知識 說完了編程語言,我們再來看看入門FPGA的第二部分內容:基礎知識。這里主要有專業(yè)基礎課和FPGA相關的專業(yè)知識兩部分。 專業(yè)基礎課不多說了,都是
    發(fā)表于 01-02 23:03

    esp8266 DNS失敗的原因?

    情況下返回錯誤代碼get_hosted_name召回 錯誤代碼: -1 = ESPCONN_MEM -5 =ESPCONN_INPROGRESS 只有當 ESP8066 重新啟動時,才能成功請求 DNS
    發(fā)表于 07-12 07:15

    如何解決DNS解析錯誤故障

    DNS解析出現錯誤,就是把一個域名解析成一個錯誤的IP地址,或者根本不知道某個域名對應的IP地址是什么時,我們就無法通過域名訪問相應的站點了,這就是DNS解析故障。出現DNS解析故障最
    發(fā)表于 09-29 15:14

    DNS攻擊防范科普系列1》—你的DNS服務器真的安全么?

    的網絡安全威脅,一直是網絡基礎架構中較弱的一環(huán)。 我們先來看看DNS服務器的威脅之一:DDoS攻擊。DDoS攻擊,即分布式拒絕服務攻擊,攻擊者通過控制大量的傀儡機,對目標主機發(fā)起洪水攻擊,造成服務器癱瘓
    發(fā)表于 10-16 15:21

    DNS攻擊防范科普系列2》 -DNS服務器怎么防DDoS攻擊

    在上個系列《你的DNS服務真的安全么?》里我們介紹了DNS服務器常見的攻擊場景,看完后,你是否對ddos攻擊憂心重重?本節(jié)我們來告訴你,怎么破局!!首先回顧一下DDoS攻擊的原理。DD
    發(fā)表于 10-16 15:28

    組播DNS的潛在問題

    我們目前使用的是和聲V2.01,但這個問題也在后來的版本中,包括V2.06。這里是framework/tcpip/src/zero_conf_mulitcast_dns.c:bMsgIsAQuery
    發(fā)表于 03-24 09:47

    值得學習的機器學習編程語言

    選擇最能滿足個人需求,以及保證自己將來能夠在 AI 和機器學習領域順利發(fā)展的編程語言。在本文中,我們將介紹最值得學習的 5 種編程語言,這些語言不僅能夠為機器
    發(fā)表于 03-02 06:22

    qt值得學習嗎?

    關注+星標公眾號,不錯過精彩內容作者 |李肖遙轉自|技術讓夢想更偉大qt值得學習嗎?嵌入式要學的東西真的很多,我們可能會說不寫界面的話就不用學qt了?我不贊同。Qt的實現主要是采用p...
    發(fā)表于 11-08 06:01

    什么是DNS

    什么是DNS  英文縮寫: DNS 中文譯名: 域名系統(tǒng) 分  類: IP與多媒體 解  釋: 遍布于因特網的數據庫。
    發(fā)表于 02-22 17:25 ?1076次閱讀

    DNS是什么DNS原理入門指南資料概述

    DNS 是互聯網核心協(xié)議之一。不管是上網瀏覽,還是編程開發(fā),都需要了解一點的知識。本文詳細介紹DNS的原理,以及如何運用工具軟件觀察的運作。我的目標是,讀完此文后,你就能完全理解
    的頭像 發(fā)表于 02-03 08:58 ?5172次閱讀

    DNS服務器和DNS服務器地址是什么

    今日就來同大家分享什么是DNS服務器地址,DNS服務器地址怎么找,幫助大家更了解DNS服務器。首先,我們一起來聊聊什么是DNS服務器,什么是
    的頭像 發(fā)表于 03-30 15:57 ?8504次閱讀

    DNS污染是是什么,DNS污染怎么解決

    DNS污染是指有意或無意進行的域名服務器分組,將域名指向錯誤的IP地址。 什么是DNS污染? DNS污染有哪些處理方法 一般而言,網站通常在Internet上具有可靠的域名服務器,但是為了減少
    發(fā)表于 04-19 09:43 ?1w次閱讀

    dns是什么意思 dns作用是什么介紹

    dns是什么意思 dns作用是什么介紹
    發(fā)表于 10-17 14:44 ?0次下載

    DNS服務器是什么?有哪些類型?

    每當我們單擊網站上的鏈接時,我們的計算機都會搜索其DNS信息。DNS是互聯網地址的數據庫。在互聯網上搜索信息時,我們會提交
    的頭像 發(fā)表于 08-14 17:40 ?2122次閱讀

    一文了解常見DNS結構

    的理解。 主DNS服務器 : 主DNS服務器是負責特定區(qū)域的權威DNS信息的主要來源。保存著該區(qū)域內域名與IP地址等資源記錄的原始、準確和權威的信息。對該區(qū)域內域名的查詢,主
    的頭像 發(fā)表于 07-05 15:32 ?200次閱讀