為什麼域名根伺服器只能有13台呢?


大家把13個根伺服器受限於UDP報文 512位元組說的很清楚,但對於為何是512位元組卻沒怎麼談論,這裡談談我的看法。

看上圖,會發現Internet大多數網路介面MTU&>512,即使DNS報文 + UDP+ IP= 512+8+20=540,這個大小几乎可以在Internet上暢通無阻,而無需IP分片。

為何IP分片不好?

一個UDP報文如果因為size &> MTU,則會被IP層分成兩片多片,但是只有一片有埠號,由於其它分片沒有埠號,能否通過防火牆則完全看防火牆的臉色,所以對於能否通信成功是一個未知數。

如果防火牆網開一面,不檢查埠號,分片可以全部通行,到目的地再組裝到一起,IP層提交給UDP/DNS,一點問題沒有。但是防火牆的安全功能大打折扣,如何阻止非法的外來攻擊包?

如果防火牆嚴格檢查埠號,則沒有埠號的分片則統統丟棄,造成通信障礙。

所以選擇一個合適的UDP size至關重要,避免分片。

有同學說,對於MTU &<512物理介面的DNS如何處理?這個其實好辦,這些只是接入層介面,用於接入終端用戶,用戶的DNS請求是請求其上一級DNS伺服器做遞歸查詢(告訴我最終查詢結果),不會直接去根伺服器查詢DNS,所以這個問題可以迎刃而解。


看了一圈答案,說實話還是一頭霧水。

大家都提到了受限於 UDP 512 Bytes 的影響,但具體是怎麼一個結構得出13這個數字,覺得沒有一個回答講清楚的。

@小小郭 說位元組長度無法驗證,這個是不對的,既然是數字,一定能計算出來個緣由。

Google 了一番,覺得這篇 Blog 講的最清楚。

Why 13 DNS root servers?

作為翻譯搬運工,總結來說是:

12 Header + 5 Question section + 31 Resource record + 15 * n (Other resource record) + 16*n (A record in additional section)

15的組成:

第一個 Resource record 要是全場度,nameserver name需要20bytes. 加上前面 root label 之類的信息後是 root-label: 1 byte + ttl: 4 bytes + class: 2 bytes + type: 2 bytes + rdlength: 2 bytes + 20 = 31 bytes.

之後的 resource record 的 nameserver name 可以被壓縮(DNS compression),只需要4bytes. 需要:11 + 4 = 15bytes.

16的組成:

Additional section 類似情況,ttl: 4 bytes + class: 2 bytes + type: 2 bytes + rdlength: 2 bytes + address: 4 bytes = 14 bytes. 外加被壓縮的 nameserver name 2 bytes. = 16 bytes

最後512bytes 的分配為: 12 + 5 + 31 + 31*n = 512

n = 14.96

當初設計的時候,安排了13個,空出了以後位元組空間給以後的 feature 使用。

QED.

希望這樣有說清楚。


要知道為什麼只有13個根域名伺服器,就要了解DNS(Domain Name System,域名系統)的整個原理才行。

DNS是計算機域名系統 (Domain Name System 或Domain Name Service) 的縮寫,它是由域名解析器和域名伺服器組成的。域名伺服器是指保存有該網路中所有主機的域名和對應IP地址,並具有將域名轉換為IP地址功能的伺服器。其中域名必須對應一個IP地址,一個域名只能對應一個IP地址(比如訪問一個域名不可能向兩個ip地址請求),而IP地址不一定有域名且可以對應多個域名。域名系統採用類似目錄樹的等級結構。域名伺服器為客戶機/伺服器模式中的伺服器方,它主要有兩種形式:主伺服器和轉發伺服器。將域名映射為IP地址的過程就稱為「域名解析」。

①DNS是應用層協議,client端(一般指瀏覽器)構建DNS查詢請求,依次被傳輸層,網路層,數據鏈路層等封裝傳送到達DNS伺服器端,最終client端接收到DNS響應消息

②DNS主要基於UDP運輸層協議,這裡解釋下為什麼使用UDP(User Datagram Protocol)這樣的無連接的,盡最大能力交付的不可靠數據連接,而不是使用TCP(Transmission Control Protocol 傳輸控制協議)這樣的面向連接的可靠數據連接。

一次UDP名字伺服器交換可以短到兩個包:一個查詢包、一個響應包。一次TCP交換則至少包含9個包:三次握手初始化TCP會話、一個查詢包、一個響應包以及四次分手的包交換。

考慮到效率原因,TCP連接的開銷大得,故採用UDP作為DNS的運輸層協議,這也將導致只有13個根域名伺服器的結果。

只會在UDP報文中表明有截斷的時候使用TCP查詢。

③為什麼只有13個根域名伺服器?等會再寫

---------------------分割線-------------------------

原因似乎是UDP數據包512位元組(為什麼是512位元組又是一個故事)限制了信息量,又因為要UDP報文中包含所有的根伺服器信息(為什麼?怎麼包含的?)所以只能有13個,但是我查了很多資料,沒有相關敘述。有大神知道求指導


通常網頁訪問的申請都是由一個數據包完成的,而一個數據包的長度為256B位元組,這就決定了一個數據包只能有13個塊,這從根本上限制了根域名伺服器的數量,也就是說根域名伺服器只能有13個。


這裡面有很多13:

  • 根伺服器有13個
  • 一個名字寫NS伺服器,最多允許寫13個NS(僅用於說明在頂級域或根域做NS授權)
  • 一個NS名字對應IP地址,最多允許寫13個(僅用於說明在頂級域或根域對NS名字做指向)

註:在CN註冊局,上述的13個則調整為6個。

為什麼13個?像樓上說的,當時一個udp包是512位元組,為了把13個都放進去,限制了13個而不是130個。具體rfc或文檔?還沒找到,找到再補充。

當然,現在很多dns系統已經支持使用tcp查詢了,可以接收和響應更大更大更大大的包。


http://compnetworking.about.com/b/2008/11/19/why-there-are-only-13-dns-root-name-servers.htm


其他同學指出了回答中的一些問題,我重新修改了下回答,謝謝。

是13個根域名(從a到m a.rootservers.net,b.rootservers.net,...,http://m.rootservers.net ),不是13台伺服器,伺服器到後面其實有很多了(到2016年2月全球有588個地點放根域名伺服器,當前分布參考 Root Server Technical Operations Assn )

所以問題變成了:為什麼只有13個根域名?

這個...我也不知道..

如有知曉的,煩請告知。

看了其他回答,其中有兩個說法我認為是有問題的,這裡指出下。

說法一:

一個數據包的長度為256b,這就決定了一個數據包只能有13個塊,這就從根本上限制了根域名伺服器的數量

整段話都是錯的:

1.一個數據包的長度不止256b。

2.只能有13塊?這個塊是什麼意思?劃分的依據是什麼?

所以我認為這個說法是無依據的,不可信的

說法二

一個UDP數據包的大小為512位元組,一個IPv4的大小為32個位元組(包含IP、埠、協議等),13個IPv4的大小為416個位元組,剩下的96個位元組,用於存放其他信息。

有兩個明顯的錯誤:

錯誤1:普通的DNS報文中只包含了ipv4地址。沒包含ip埠,ip協議這些。

錯誤2:ipv4地址的長度是32位(4位元組),不是32個位元組,注意單位不一樣。

我們可以看下DNS的報文格式,順便計算下需要多少位元組。

這5個內容可劃分為三部分:頭部(header),查詢部分(Question),應答部分(Anser,Authority,Additional 這個三個格式一樣,一個報文中不一定都出現)。

header 頭部,包含12個位元組,格式如下:

Question 查詢部分,含三個欄位:QNAME(可變長度),QTYPE(2個位元組),QCLASS(2個位元組),格式如下

Anser,Authority,Additional 應答部分,格式如下

這部分的各欄位對應如下,必要位元組有2+2+4+2=10位元組

匯總下這三部分的各位元組使用

頭部 12位元組

查詢部分 QTYPE 2位元組 + QCLASS 2位元組 + CNAME最大63位元組 = 67位元組

應答部分 一個ip長度是4位元組,加上必須的10位元組,則是10+13*4=62位元組

總共 12+67+62=141位元組

如果應答部分都算上則是 12+67+62*3=265位元組

評論中指出了這種情況不存在,則以兩部分的情況來算(這種情況是有的): 12+67+62*2=203位元組

通過計算髮現,必要位元組是遠遠少於512位元組的,加上報文的擴展欄位也還有富足的空間,那應該可以再放多幾個ip,只要不超過512就行了。

所以還是解釋不了為什麼是13個。

或者這個計算方法也有問題的,如果能抓個根域伺服器間通信的包來看看,情況應該馬上明了吧。


不是13個。準確的說是13個集群。


第一次玩,好緊張...

bbs.chinaunix.net/thread-1490948-2-1.html

這邊13樓解答的比較好。 之前我也一直搞不明白,看了就懂了。

有時候某些域名(http://www.lengmenyuming.ir)的確不會在 dns(比如114.114.114.114) 緩存裡面,那麼只會告訴你13台(實際上並不是13台)根dns的ip地址(這13個ip地址一般不變,但是曾經換過哦,我猜測就是這個原因才會返回13 個ip的),然後你去問 其中某台,假設是 A, 當然,A是不會告訴你 這個域名的 具體 ip的(13台根伺服器不負責具體解析,只負責指路),而是再讓你去 找 .ir 對應的頂級dns伺服器,然後它會告訴你 http://www.lengmenyuming.ir 對應的ip(.ir對應的頂級域名是否負責 具體解析我忘了,如果它也不負責具體解析,那麼還會繼續返回能 具體解析的dns ip)。 對了,上述解析過程,一般是由114.114.114.114 代你完成的。 很久之前看過,有點忘了。。。但是 為什麼只有13台,應該能說得通。


大家都不能畫個圖么……純文字有點難以理解。


推薦閱讀:

Mac下如何清除DNS緩存?
2017年有哪些好用的 DNS?
dns放大攻擊者是如何提高放大倍數的?
如何評價DNSPod的Public DNS+服務?
如何徹底屏蔽長城寬頻HTTP劫持?

TAG:程序員 | 計算機網路 | DNS | IP地址 | TCPIP |