歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~ 本文由9527發表 根功能變數名稱伺服器是功能變數名稱解析系統(DNS)中最為頂級的功能變數名稱伺服器,它們負責管理頂級域的權威功能變數名稱伺服器地址。作為互聯網基礎設施的重要部分,所有功能變數名稱的解析操作均離不開它們。下麵我們將從 DNS 協議實現的角度分析為什麼全球只有13 ...
歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~
本文由9527發表
根功能變數名稱伺服器是功能變數名稱解析系統(DNS)中最為頂級的功能變數名稱伺服器,它們負責管理頂級域的權威功能變數名稱伺服器地址。作為互聯網基礎設施的重要部分,所有功能變數名稱的解析操作均離不開它們。下麵我們將從 DNS 協議實現的角度分析為什麼全球只有13組根功能變數名稱伺服器。
13組根功能變數名稱伺服器的信息
其中,13組根功能變數名稱伺服器以英文字母 a 到 m 順序命名,功能變數名稱格式為“a~m.root-servers.net”,如“b.root-servers.net”。
DNS 數據包的大小限制
我們知道 DNS 協議是應用層協議,大多數情況下依賴傳輸層的 UDP 協議進行數據的傳輸(僅在重試的情況下可能使用 TCP 協議)。根據RFC 791規定,未保證 UDP 數據包傳輸成功率,儘量數據包控制在 571 位元組以使數據包不會被分片傳輸。
除去 UDP 數據包自身包頭占用的位元組數,DNS 數據包被設計為不超過512位元組。
DNS 協議格式
下麵我們從根功能變數名稱解析的返回數據包截圖:
我們假設根功能變數名稱由 N 組,計算數據包各部分位元組占用的情況如下:
- Header 部分占用12個位元組,包括 Transaction ID (2位元組),Flags (2位元組),Questions (2位元組),Answer RRs (2位元組),Authority RRs (2位元組),Additional RRs (2位元組);
- Question Section 部分占用5個位元組,包括根標簽(1位元組),Class (2位元組,基本取值都是IN),查詢類型(2位元組);
- Answer Section 部分占用的位元組數為所有記錄位元組數之和,每條記錄包括根標簽(1位元組),TTL (4位元組),Class (2位元組,基本取值都是IN),查詢類型(2位元組),功能變數名稱存儲占用的位元組數;因為功能變數名稱在 DNS 解析協議當中按照長度(2位元組)+數據的形式存儲,其中數據部分是分段存儲的,存儲格式如下所示,所以第一條記錄的功能變數名稱存儲占用22個位元組,繼而第一條記錄總共占用31個位元組;而從第二條記錄開始,因為記錄中出現的功能變數名稱存在部分內容與第一條記錄重覆,即“root-servers.net”部分,這部分可以利用 DNS 指針壓縮存儲,只需要存儲2個位元組的指針,指向第一條記錄出現的部分,而不需要存儲實際的內容,所以第二條記錄~N條記錄占用的位元組數分別為11+4=15個位元組;
- Additional Section 部分占用的位元組數為所有記錄位元組數之和,每條記錄包括功能變數名稱,TTL (4位元組),Class (2位元組,基本取值都是IN),查詢類型(2位元組),IP 地址(2位元組長度+4位元組內容);因為 Additional Section 記錄的功能變數名稱都在 Answer Section 中出現過,所以這部分都可以利用 DNS 指針壓縮存儲,只需要存儲2個位元組的指針即可表示對應的功能變數名稱,所以Additional Section 部分的記錄占用的位元組數為2+4+2+2+6=16個位元組;
綜上所述,數據包總長度為12+5+(31+(15(N-1))+16N,再根據前述 DNS 大小限制不超過512位元組的要求,可以得 N 不超過15組,再加上早期設計的時候考慮到預留一些 buffer 於是就有了現在全球13組根功能變數名稱伺服器的結果。
此文已由作者授權騰訊雲+社區發佈,更多原文請點擊
搜索關註公眾號「雲加社區」,第一時間獲取技術乾貨,關註後回覆1024 送你一份技術課程大禮包!