本文由 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 送你一份技术课程大礼包!
来源: https://www.cnblogs.com/qcloud1001/p/10027849.html