为什么全球只有13组根域名服务器?

根域名服务器是域名解析系统(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))+16*N,再根据前述 DNS 大小限制不超过512字节的要求,可以得 N 不超过15组,再加上早期设计的时候考虑到预留一些 buffer 于是就有了现在全球13组根域名服务器的结果。

通过问题“全球为什么只有13台 DNS 服务器?”的讨论我们了解了 DNS 解析协议,下面我们将自己的动手搭建 DNS 服务器

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏有趣的Python

1-浙大攻略计划-专业课-Linux C语言编程基本原理与实践(慕课网)

将max.c变成max.o之后,我们需要把hello.c中的include注释掉并添上方法声明

1723
来自专栏蘑菇先生的技术笔记

探索c#之storm的TimeCacheMap

2167
来自专栏青玉伏案

iOS开发之再探多线程编程:Grand Central Dispatch详解

Swift3.0相关代码已在github上更新。之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread、操作队列以及GCD,介绍的不够深入。今...

1957
来自专栏芋道源码1024

Java 应用中的日志

作为日志产生的日期和时间,这个数据非常重要,一般精确到毫秒。由于一般按天滚动日志文件,日期不需要放在这个时间中,使用 HH:mm:ss.SSS 格式即可。

1603
来自专栏木木玲

Netty 源码解析 ——— Netty 优雅关闭流程

3943
来自专栏张善友的专栏

Contact Manager Web API 示例[2] Web API Routing

联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地...

1849
来自专栏农夫安全

代码审计入门总结

0x00 简介 ---- 之前看了seay写的PHP代码审计的书,全部浏览了一遍,作为一个代码审计小白,希望向一些和我一样的小白的人提供一下我的收获,以及一个整...

3427
来自专栏技术墨客

Guava CacheBuilder使用说明 原

CacheBuilder是Guava用于创建LoadingCache、Cache实例的构建类。可以使用下面的方法来创建一个Cache实例。

1235
来自专栏F-Stack的专栏

FreeBSD下的工具(sysctl、netstat等)如何移植到F-Stack

F-Stack基于DPDK,绕过内核的协议栈,移植了FreeBSD协议栈到用户态,在大幅提高性能的同时,常规网络设置分析工具(如sysctl、netstat、i...

3648
来自专栏运维

Unix & Linux 大学教程 学习总结

两年前我看这本书时,是一本812页的厚书,现在我总结成了40句话,什么时候成了1句话就好了。

1201

扫码关注云+社区

领取腾讯云代金券