龙空技术网

13个根域名服务器,原来竟是一个伪概念

车小胖 2287

前言:

今天我们对“有哪些域名服务器”大约比较珍视,看官们都需要分析一些“有哪些域名服务器”的相关内容。那么小编也在网络上网罗了一些有关“有哪些域名服务器””的相关文章,希望看官们能喜欢,各位老铁们一起来了解一下吧!

昨天写了一篇文章,这个问题无论在国内还是国外讨论的都很热烈,无论是专业人士,还是业余人士好像都乐于其中。刚开始没有积极参与,是因为“13个根域名服务器是一个伪概念”!名义上全球的根域名服务器只使用13个IP地址而已,其中有2个IP属于VeriSign管理,另外11个由另外11家机构管理,一共12家管理机构。

每一家机构管理的IP,可以用在任意多个物理服务器上,这个任意可以代表1台、100台、甚至100万台服务器,只要这家机构有钱可以烧!

所以,全球根域名服务器名义上只有13个,但是可以扩展到任意规模。退一步讲,即使全球根域名服务器只有1个IP,也可以扩展到人类想要的任意规模!

至于为何一个IP可以用在不同的服务器上,有兴趣的读者可以阅读这篇文章。

可是,很多读者依然对为何偏偏选取13这个数字很感兴趣,看到大家那么有兴趣,我的兴致突然也来了。限于时间总是没有用事实说话,网上的诸多讨论也没有看到用事实说话。今天决定什么都不干,专门写一篇用事实说话的文章,以满足读者们对的好奇心!

既然要用事实说话,那么一定少不了将DNS查询与应答报文的展示出来,手工构造这样的报文效率太低,决定用Python编写几行代码,借用现成的库函数完成DNS查询报文的构造!

import dns.resolver

name = '.'

qtype = 'NS'

answer = dns.resolver.query(name,qtype,raise_on_no_answer=False)

if answer.rrset is notNone:

print(answer.rrset)

这段代码很简单,查询域名=“.”的权威服务器的名称,如果查询结果不为空,将查询结果打印在屏幕上。“.”代表的就是根域名服务器的名字,一种象征性的名称。

以下是Python代码、DNS查询结果,如预期的一致,一共返回13位大神的完整列表,尽管顺序有点凌乱,他们的完整名称为“x. root-servers.net.”,其中“x”代表a、b、c 。。。m。

既然查询结果没有错,用抓包软件将查询请求、查询应答一共2个报文抓出来展示出来,如图所示,如预期的一样,报文一来一回。

打开查询报文看看报文的格式,这不是本文的重点,有兴趣的读者自行研究每一个字段的含义。

接下来再看查询应答报文,不知道大家发现一个亮点哇?

查询应答报文的总长度竟然只有270个字节!!!这270字节还包含以太帧头的14字节、IP头的20字节、UDP头的8个字节,意味着查询应答报文的长度 = 270 -14 -20 -8 = 228字节!!!

昨天的文章不是说的好好的,每一个大神占据31个字节,31字节的计算方法(昨天文章漏上的图):

一共13个大神,应该占据至少13*31 = 403字节,怎么抓包只有区区228个字节呢?到底哪里出问题了?

让我们来一一检查各位大神到底占据多少个字节?

第一位大神 “b.root-servers.net.”

大家数一数蓝色加亮部分,不多不少正好31个字节,这和上述计算方法一致。让我们再来看看剩余大神的部分。

第二位大神“c.root-servers.net.”

大家再数一数蓝色加亮部分,一共只有15个字节!再看其它大神,每个都是15个字节。换句话说,除了第一位大神占据31个字节,其它大神只有15个字节。

这个时候能够提供权威回答的只有RFC协议文档了,RFC 1035 第30页告诉我们:

可以使用压缩算法来压缩报文里重复的字段,后续的12位大神的名字都是以“.root-servers.net”为后缀的,和第一位大神后缀重复,可以使用压缩算法,将其从20个字节压缩为4个字节,恰好少了16字节。那么12位大神所占据的空间,就从31字节减少到15个字节。

写到这里,问各位一个问题,DNS查询应答是否还可以容纳更多的大神?

当然可以了,还有200多个字节没有使用呢!还可以邀请10多位大神加入。事实的真相是,并没有邀请更多的机构来充当大神,这不是一个单纯的技术问题,更多的是一个政治问题,而本公众号只聊技术,对政治话题没有丝毫兴趣!

标签: #有哪些域名服务器