通常,顶级域名服务器(例如“ com”名称服务器)需要具有一个映射,以针对不同的域名(例如“ google”,“ yahoo”,“ facebook”等)给出名称服务器的IP地址。< / p>
我想象这将有大量的键值对。 如何处理这张大地图?它是无序映射,有序映射还是任何其他“特殊”实现?
答案 0 :(得分:1)
大多数主要的名称服务器都是开放源代码,因此您可以研究其来源:
但是,它当然比仅仅一张“地图”复杂得多。 即使您从很老的文档开始,例如定义协议的RFC 1035,也很少有实现的详细信息。
虽然名称服务器实现可以自由使用任何内部数据 他们选择的结构,建议的结构包括三个主要部分 零件:
“目录”数据结构,列出了可用于 该服务器,以及指向区域数据结构的“指针”。的 这种结构的主要目的是找到最接近的祖先 区域(如果有),用于到达标准查询。
每个数据区所保持的区域的单独数据结构 名称服务器。
用于缓存数据的数据结构。 (或者可能是单独的缓存 针对不同的课程)
(并阅读以下有关各种优化的句子)
首先,对于权威或递归名称服务器而言,任务是不同的。
例如,一些权威的工具允许您在加载区域之前将其“编译”为某种格式。例如,请参见zonec
中的nsd
您还需要记住该数据是动态的:可以通过DNS UPDATE消息进行远程增量更新,并且在存在DNSSEC的情况下,RRSIG可能会得到动态计算,或者至少需要不时更改。 / p> 因此,一个简单的键值存储可能不足以满足所有这些需求。但是请注意,多个名称服务器允许使用不同的“后端”,以便可以从具有其他约束条件的其他源中提取数据,例如SQL数据库,甚至是在DNS查询到来时创建DNS响应的程序。
例如,在内存中,bind在内部使用“红背二进制树”。简而言之,请参见https://en.wikipedia.org/wiki/Red%E2%80%93black_tree上的Wikipedia说明:
红黑树是计算机科学中的一种自平衡二进制搜索树。二叉树的每个节点都有一个额外的位,该位通常被解释为该节点的颜色(红色或黑色)。这些颜色位用于确保树在插入和删除期间保持大致平衡。
附带说明,关于“需要具有一个可以提供名称服务器IP地址的映射”,但并非100%准确:注册机构权威的域名服务器将主要包含NS
条记录,将域名与其他权威相关联名称服务器(一个委托),并且在这种情况下将有一些称为“胶水”的A
和AAAA
记录。
对他们的某些请求可能根本无法为您提供任何IP地址,请参阅:
$ dig @a.gtld-servers.com NS afnic.com +noall +ans +auth
; <<>> DiG 9.12.0 <<>> @a.gtld-servers.com NS afnic.com +noall +ans +auth
; (1 server found)
;; global options: +cmd
afnic.com. 172800 IN NS ns1.nic.fr.
afnic.com. 172800 IN NS ns3.nic.fr.
afnic.com. 172800 IN NS ns2.nic.fr.
(没有IP地址,因为名称服务器全部不在区域之内,真正的技术术语为“超出百里克区”)