DNS 靈魂三問 why,when,how

2021-09-11 10:03:46 字數 1915 閱讀 3711

dns 是 domain name system 的縮寫,作用很簡單,根據網域名稱查詢對應的 ip 位址。

tcp/ip 約定每個網路請求包根據 ip 位址確認接收方。這和你打**需要知道對方**號碼一樣。

因為 ip 位址不好記憶,所以有了一層網域名稱對映。

為什麼不設計成直接根據網域名稱確認接收方呢?

在 ipv4 裡,ip 位址是 4 個 0-255 的數,2 的 8 次方,8 bit,1 byte。只要 4 個位元組的大小。 如果是支援字串,就算用最簡單的 ascii 編碼,乙個字元就要 1 個位元組。乙個常見的網域名稱通常十幾個字元,最長可以支援 255 個字元,比用 ip 表示大了很多倍。

現在我們知道最後通訊的時候我們通過 dns 獲得了乙個 ip 位址。當我們在瀏覽器輸入乙個 url 後,是在什麼時候、誰進行的查詢?

瀏覽器獲得這個請求後,甩給了作業系統,作業系統甩給了網絡卡,網絡卡作為真正幹活的人把包按照鏈路層協議送了出去。

乙個簡單的版本,在世界的中心有一台伺服器,伺服器裡有乙個資料庫,資料庫裡有一張表,這張表裡存著網域名稱和 ip 位址的記錄。你想要查什麼伺服器都給你。

如果產品經理描述應該就是這樣的,接著會說這是乙個小需求,什麼時候可以上線。

除了網域名稱解析的 a 記錄。還包括了 mx(mail exchange)郵件伺服器位址,還有別名 cname 記錄。 實際上還有很多其他功能,比如根據 ip 位址反查網域名稱(ptr),查詢網域名稱 dns 伺服器 ip 位址(ns)。

網際網路中有那麼多的網域名稱,全部都存在一台伺服器中顯然是不可能的。全世界每天有那麼多的網域名稱新增、修改,如果全往一台伺服器做 io ,效能多強也扛不住。

dns 是分層的資料庫結構。

自建 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 智慧型解析。

參考:歡迎關注我的微博:@沒故事的卓同學

如果想與我有更密切的交流也可以加入我的小密圈:程式設計師生存指南

自動化測試的靈魂三問

在軟體測試領域,有兩種測試技術 手動測試和自動測試。兩種方法都旨在執行測試用例,然後將實際結果與預期結果進行比較。概括來講手動測試是一種人工執行操作的測試技術,可確保軟體 完成應有的功能。那麼什麼是自動化測試呢?相反,這是一種自動執行測試技術,管理測試資料以及利用結果來提高軟體質量的實踐。對於一名測...

TCP協議靈魂12問

tcp 作為傳輸層的協議,是乙個軟體工程師素養的體現,也是面試中經常被問到的知識點。在此,我將 tcp 核心的一些問題梳理了一下,希望能幫到各位。首先概括一下基本的區別 tcp是乙個面向連線的 可靠的 基於位元組流的傳輸層協議。而udp是乙個面向無連線的傳輸層協議。就這麼簡單,其它tcp的特性也就沒...

python入門靈魂5問

對於剛接觸python程式設計或者想學習python自動化的人來說,基本都會有以下python入門靈魂5問 python學習路線,python教程,python學哪些,python怎麼學,python學到什麼程度?需要學習哪些內容才能征服python這條蟒蛇呢?前言 python分為2.x和3.x之...