我正在阅读Cloudflare的手册,了解 DNS 名称解析的工作原理,并想到了 TLD 名称服务器这个术语。它应该由根名称服务器查询返回。我尝试手动重现递归解析器对随机域(例如pinpon.com
)执行的过程。以下是我最终得到的步骤:
从IANA 列表请求任何根服务器(例如a.root-servers.net
,198.41.0.4):
l.gtld-servers.net
根据附加记录中的地址请求任何 TLD 服务器(例如192.41.162.30) :
所以现在我有了所请求名称的权威 DNS 服务器,我可以使用它来解析实际名称。
问题:下一个要查询的 DNS 服务器是否总是包含Additional records
ip/ipv6 地址?或者通常需要解析根/tld 服务器从该Authority RR
部分返回的名称?
当应答服务器已经具有这些记录的副本时,将返回额外的 A/AAAA 记录,例如当域名的名称服务器本身位于该域名下时(在这种情况下,地址被手动复制为“粘合记录”)。
例如,由于 的名称服务器
net.
本身位于net.
域下,因此需要将相应的 A/AAAA 记录从子区域复制到.
(根)区域作为粘合记录,并且如果您查询并获得引用,则需要在附加部分中返回它们,从而避免“catch-22”循环。example.net.
net.
而且由于这些 A/AAAA 记录现在已成为根区域的一部分,因此根名称服务器也将能够针对引用这些 TLD 名称服务器的任何其他响应或引荐返回这些记录(就像您举的例子中那样),尽管它们不再严格有必要这样做,因为在您的例子中不存在循环。
最近发布的RFC 9471澄清了,在前一种情况下,名称服务器“必须”返回粘合记录,但在后一种情况下,仅“应该”返回粘合记录(如您的示例所示)。
但是,如果名称服务器没有数据,则它不会代表您进行任何进一步的查询,您将需要自己解析名称服务器地址。假设 TLD A 下的域名使用 TLD B 下的名称服务器(例如
google.fr
使用nsX.google.com
),则 TLD A 的权威名称服务器通常不会有任何粘合记录,因此附加部分将为空。简而言之,当需要打破依赖循环时(例如 example.com → ns.example.com),您可以依赖附加记录的存在,但在其他情况下您不能总是依赖它们的存在。
(并不是说需要依赖它们的存在——毕竟,如果您正在查询权威服务器,那么您正在执行解析器的工作,并且应该能够进行更多查询,而权威服务器本身不是解析器,不会为您完成这项工作。)