我读过的所有文章都解释了为什么有 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个字节?
答案1
“...由于每个 IPv4 地址需要 32 字节,因此拥有 13 台服务器需要 416 字节,剩下最多 96 字节用于剩余协议信息。”
DNS 协议从不只传输普通的 IP 地址,而是传输由 DNS 资源记录组成的格式正确的查询和答案。
A
“IPv4 地址需要 32 字节”可能不是指普通 IP 地址的大小,而是指在 DNS 协议中格式化为传输的资源记录的大小。
当所有根 DNS 服务器都具有唯一的非系统名称时,该值看起来应该是准确的,但由于根名称服务器现在已重新命名为 格式x.ROOT-SERVERS.NET
,因此当前状态有点复杂。
我刚刚tcpdump
在 BIND9 DNS 服务器启动上运行,看起来第一个 A 记录将占用略多于 32 个字节的空间,因为它包括:
- 全名
a.root-servers.net
(每个名称组成部分的长度有一个字节,末尾有一个零字节 = 总共 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 个字节表示(部分 2 个字节b
,后面 2 个字节) -参考后缀root-servers.net
)。因此,根服务器的任何其他 A 记录每条仅占用 17 个字节。
BIND9 的实际启动查询相当于dig . NS
并通过 TCP 而不是 UDP 进行。
结果,第一个应答记录是一个31字节的NS记录,列出了第一个根DNS服务器的全名。其他根服务器的后续 NS 记录每条仅占用 15 个字节。由于作为附加信息呈现的 A 记录将能够完整地反向引用每个根服务器主机名,因此根 DNS 服务器的每个 A 记录将仅占用 16 个字节。响应还包括根名称服务器的 IPv6 AAAA 记录。即便如此,DNS 响应的总长度也只有 1097 字节。