Dns

IP 地址是 32 位的,即 4 個字節。然而,對 13 個根 dns 伺服器上的問題的所有答案都不是這樣

  • December 18, 2019

我讀過的所有文章都解釋了為什麼有 13 個根 dns 伺服器說每個 ip 地址佔用 32 個字節,因此 (13 x 32) = 416 個字節,剩下最多 96 個字節用於其他協議資訊。例如,見下文

“在設計 DNS 時,使用的 IP 地址是 IPv4,它包含 32 位。為了高效的網路和更好的性能,這些 IP 地址應該適合單個數據包(使用 UDP,DNS 的預設協議)。使用 IPv4 ,可以放入單個數據包的 DNS 數據限制為 512 字節。由於每個 IPv4 地址需要 32 字節,所以有 13 台伺服器使用 416 字節,剩下的協議資訊最多為 96 字節。

不是每個ip地址都是32位的嗎?它在上面聲明“每個 IPv4 地址需要 32 個字節”的聲明中意味著什麼?為什麼 32 位地址佔用 32 個字節?

“……由於每個 IPv4 地址需要 32 個字節,因此擁有 13 台伺服器使用 416 個字節,剩下的協議資訊最多為 96 個字節。”

DNS 協議從不只傳輸普通 IP 地址,而是由 DNS 資源記錄組成的格式正確的查詢和答案。

“IPv4 地址需要 32 個字節”可能不是指普通 IP 地址的大小,而是指A在 DNS 協議中為傳輸而格式化的資源記錄的大小。

當所有根 DNS 伺服器都有唯一的、非系統的名稱時,這個值看起來應該是準確的,但由於根名稱伺服器現在已重命名為 format x.ROOT-SERVERS.NET,因此目前狀態有點複雜。

我剛剛tcpdump在 BIND9 DNS 伺服器啟動時執行,看起來第一個 A 記錄將佔用略多於 32 個字節的空間,因為它包括:

  • 全名a.root-servers.net(每個名稱組件的長度為 1 個字節,末尾有 1 個零字節 = 總共 20 個字節)
  • 16 位記錄類型程式碼(2 個字節)
  • 一個 16 位的記錄類程式碼(2 個字節)
  • 一個 32 位 TTL 值(4 個字節)
  • 一個 16 位數據長度值(2 個字節)
  • 32 位 IP 地址(4 個字節)

因此,如果您請求根 DNS 伺服器的 A 記錄,則第一個應答記錄實際上需要 34 個字節。

同一 DNS 消息中的任何後續答复記錄都可以引用前面提到的任何名稱或其中的一部分,因此如果a.root-servers.net完整提及,則b.root-servers.net可以僅用 4 個字節表示(b部分為 2 個字節,後面為 2 個字節-引用root-servers.net後綴)。因此,根伺服器的任何其他 A 記錄將僅佔用 17 個字節。

BIND9 的實際啟動查詢等價於dig . NS並發生在 TCP 而不是 UDP 上。

因此,第一個應答記錄是一個 31 字節的 NS 記錄,列出了第一個具有全名的根 DNS 伺服器。其他根伺服器的後續 NS 記錄將僅佔用 15 個字節。由於作為附加資訊呈現的 A 記錄將能夠完整地反向引用每個根伺服器主機名,因此根 DNS 伺服器的每個 A 記錄將只佔用 16 個字節。響應還包括根名稱伺服器的 IPv6 AAAA 記錄。即便如此,DNS 響應的總長度也只有 1097 字節。

引用自:https://unix.stackexchange.com/questions/557799