DNS服務器是如何工做的
原文:https://www.slashroot.in/how-dns-worksnode
做者:Sarath Pillai數據庫
原文發表日期:2012年10月22日瀏覽器
翻譯:tommwq服務器
譯文:http://tommwq.tech/blog/?p=344網絡
1 DNS服務器歷史簡介
你們好!在這篇文章中,咱們將討論互聯網世界中最重要、最不可或缺的資源。這個資源咱們每一個人都會用到,不管咱們是否瞭解它。網站
網絡中的每臺機器都被一個數字地址所標識。網絡中的機器使用這個地址相互通訊。若是沒有將數字地址和一個名字相關聯,要記住網絡中全部的數字地址是很是困難的。即便對於本地網絡中的少數主機,記住所有地址也是很難的。更不要說記住互聯網上4億多臺主機的地址了。google
最初瞭解決這個問題,產生了hosts文件的概念。網絡中的每臺機器都有一個hosts文件(/etc/hosts),其中包含了名字到數字地址的映射。但隨着時間的推移,問題來了:url
- 每臺機器都須要本身更新地址映射條目。
- 沒有通知機制,讓客戶端知道添加了新的地址映射條目。
- 隨着時間的推移,hosts文件不斷膨脹,變得難以處理。
在20世紀70年代中期,名字服務器(name servers)的概念出現了。名字服務器背後的思想是:人們更容易記住名字而非數字,尤爲是名字描述了資源的某些特色時。spa
在網絡中把名字轉換成數字地址的問題,幾乎和計算機網絡自己同樣古老。操作系統
若是網絡中存在名字服務器,機器只需知道名字服務器的數字地址,以及目標機器或網站的名字。有了這些信息,機器能夠向名字服務器查詢目標機器的數字地址(IP地址)。
集中式名字服務器比/etc/hosts文件的解決方案更好。如今有了一個專門用於解析名字的中央服務器,機器只須要知道名字服務器的數字地址。不管什麼時候發出請求,名字服務器都會返回目標機器名字對應的數字地址。
擁有中心名字服務器的主要優勢在於,服務器的IP地址能夠在其餘機器無感知的狀況下發生變動。此時名字服務器只須要更新IP地址條目。
可是中心名字服務器也有一些缺點,要是中心服務器不可用了怎麼辦?所以產生了多個名字服務器的想法,在網絡中,一臺做爲主服務器,其餘做爲輔助服務器。若是主服務器不可用,則向輔助服務器查詢答案。
即便是這種方案(主服務器和輔助服務器)也存在一些缺點。具體以下:
- 隨着網絡中名字數量的不斷增長,名字服務器很難從數百萬個條目中檢索信息。咱們須要一種方法來管理這些名字。
- 假設一個名字服務器每秒收到大量查詢請求,在這種狀況下,名字服務器的負載會增長。咱們須要找到一種方法來分散負載。
- 咱們須要一種機制來隔離名字服務器中條目的維護工做,由於許多不一樣的管理員都會添加條目。
2 互聯網域名系統
完整的DNS功能在下面的RFC中解釋:
- RFC 1034
- RFC 1035
互聯網的域名系統是一個倒立的樹狀結構。樹的頂部是根域名服務器(不用擔憂,我會解釋什麼是根服務器),根服務器後面是頂級域名(Top Level Domain,TLD)服務器,以後是二級域名(Second Level Domain,SLD)服務器。各級域名用點(.)分隔。
理解上面加下劃線的文字對於理解DNS的概念很是重要。
根服務器由一個點表示。
頂級域名分爲兩種類型,通用頂級域名(Generic Top Level Domain,gTLD)是諸如.com、.net、.org、.edu的域名。國家頂級域名(Country Code Top Level Domain,ccTLD)是相似.in、.us、.uk的域名。
咱們稱www.slashroot.in是一個域名,這個域名是通用頂級域名、二級域名和主機名的組合。咱們過段時間再討論這個問題。
咱們一般提到的域名,好比google.com,是頂級域名和二級域名的組合。
這個域名系統(樹)中的每一個節點(node)都被分配給一個機構或組織來管理。對特定節點負責的組織被稱爲是是權威的(authoritative)。在DNS系統中,權威這個詞會被屢次用到。
位於系統層級頂點的根名字服務器,其權威機構是一個名爲ICANN(互聯網名稱與數字地址分配機構)的組織。
通用頂級域名也由ICANN管理,並委託給ICANN認證機構。國家頂級域名由ICANN認證給不一樣國家管理。
在DNS系統中,委託是一個重要的概念。我會在另一篇文章中介紹委託。
理解下面這個事實是很是重要的:在相似www.slashroot.in的地址中,最左邊的部分(www)是主機名。網站使用www主機名只是出於慣例。沒有規則要求網站必須使用什麼主機名。網站也能夠命名爲xyz.example.com。
3 當我在瀏覽器地址欄中輸入www.example.com時發生了什麼?
根名字服務器(.)是名字服務器層次結構中最重要的資源。當一個名字服務器查詢不到請求的信息時,它首先會詢問根名字服務器。
一共有13個根名字服務器,包括:
- a.root-servers.net.
- b.root-servers.net.
- c.root-servers.net.
- d.root-servers.net.
- e.root-servers.net.
- f.root-servers.net.
- g.root-servers.net.
- h.root-servers.net.
- i.root-servers.net.
- j.root-servers.net.
- k.root-servers.net.
- l.root-servers.net.
- m.root-servers.net.
如今全部DNS軟件都包含上述所有根服務器的IP地址。所以DNS服務器能夠訪問任意一個根服務器,無需向其餘服務器查詢。
步驟1:用戶在瀏覽器中輸入www.example.com。
步驟2:操做系統首先檢查/etc/hosts文件,查找www.example.com的IP地址。(這一機制能夠經過/etc/nsswitch調整),而後檢查/etc/resolv.conf文件,查找DNS服務器的IP地址。
步驟3:DNS服務器在其數據庫中查詢www.example.com。若是找到記錄,返回。若是沒有找到,向根服務器查詢。
步驟4:根服務器會返回.com頂級域名服務器的地址(頂級域名服務器知道全部二級域名服務器)。在這裏例子中咱們查詢的是www.example.com,因此根服務器將返回.com頂級域名服務器的信息。
若是輸入的是www.example.net,根服務器將返回.net頂級域名服務器的地址。
步驟5:如今.com頂級域名服務器將爲咱們提供example.com二級域名服務器的地址。
步驟6:example.com二級域名服務器將返回www主機(www是主機名)的IP地址。
如今讓咱們看看這個過程其實是如何工做的。
[root@myvm1 ~]# dig +trace www.google.com ; <<>> DiG 9.3.4-P1 <<>> +trace www.google.com ;; global options: printcmd . 5 IN NS a.root-servers.net. . 5 IN NS b.root-servers.net. . 5 IN NS c.root-servers.net. . 5 IN NS d.root-servers.net. . 5 IN NS e.root-servers.net. . 5 IN NS f.root-servers.net. . 5 IN NS g.root-servers.net. . 5 IN NS h.root-servers.net. . 5 IN NS i.root-servers.net. . 5 IN NS j.root-servers.net. . 5 IN NS k.root-servers.net. . 5 IN NS l.root-servers.net. . 5 IN NS m.root-servers.net. ;; Received 228 bytes from 192.168.159.2#53(192.168.159.2) in 49 ms com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. ;; Received 504 bytes from 198.41.0.4#53(a.root-servers.net) in 153 ms google.com. 172800 IN NS ns2.google.com. google.com. 172800 IN NS ns1.google.com. google.com. 172800 IN NS ns3.google.com. google.com. 172800 IN NS ns4.google.com. ;; Received 168 bytes from 192.33.14.30#53(b.gtld-servers.net) in 12 ms www.google.com. 300 IN A 74.125.236.48 www.google.com. 300 IN A 74.125.236.50 www.google.com. 300 IN A 74.125.236.51 www.google.com. 300 IN A 74.125.236.49 www.google.com. 300 IN A 74.125.236.52 ;; Received 112 bytes from 216.239.34.10#53(ns2.google.com) in 108 ms
如今你能夠從dig輸出中清楚地看到,請求首先發送到根服務器。a.root-servers.net返回的都是.com通用頂級域名服務器。而後b.gtld-servers.net返回了google.com的二級域名服務器。最終,ns2.google.com返回了www.google.com的IP地址。
但願大家喜歡這個帖子!!