DNS服務器是如何工做的

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

  1. 每臺機器都須要本身更新地址映射條目。
  2. 沒有通知機制,讓客戶端知道添加了新的地址映射條目。
  3. 隨着時間的推移,hosts文件不斷膨脹,變得難以處理。

在20世紀70年代中期,名字服務器(name servers)的概念出現了。名字服務器背後的思想是:人們更容易記住名字而非數字,尤爲是名字描述了資源的某些特色時。spa

在網絡中把名字轉換成數字地址的問題,幾乎和計算機網絡自己同樣古老。操作系統

若是網絡中存在名字服務器,機器只需知道名字服務器的數字地址,以及目標機器或網站的名字。有了這些信息,機器能夠向名字服務器查詢目標機器的數字地址(IP地址)。

集中式名字服務器比/etc/hosts文件的解決方案更好。如今有了一個專門用於解析名字的中央服務器,機器只須要知道名字服務器的數字地址。不管什麼時候發出請求,名字服務器都會返回目標機器名字對應的數字地址。

擁有中心名字服務器的主要優勢在於,服務器的IP地址能夠在其餘機器無感知的狀況下發生變動。此時名字服務器只須要更新IP地址條目。

可是中心名字服務器也有一些缺點,要是中心服務器不可用了怎麼辦?所以產生了多個名字服務器的想法,在網絡中,一臺做爲主服務器,其餘做爲輔助服務器。若是主服務器不可用,則向輔助服務器查詢答案。

即便是這種方案(主服務器和輔助服務器)也存在一些缺點。具體以下:

  1. 隨着網絡中名字數量的不斷增長,名字服務器很難從數百萬個條目中檢索信息。咱們須要一種方法來管理這些名字。
  2. 假設一個名字服務器每秒收到大量查詢請求,在這種狀況下,名字服務器的負載會增長。咱們須要找到一種方法來分散負載。
  3. 咱們須要一種機制來隔離名字服務器中條目的維護工做,由於許多不一樣的管理員都會添加條目。

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地址。

但願大家喜歡這個帖子!!

相關文章
相關標籤/搜索