我不确定当缓存包含部分答案时递归解析会如何表现。具体来说,我们假设我首先运行此查找请求:
dig example.com @8.8.8.8
根据我的理解,解析过程完成后,以下记录将被缓存在此公共解析器(8.8.8.8)上
example.com. 17834 IN NS a.iana-servers.net.
example.com. 17834 IN NS b.iana-servers.net.
example.com. 18662 IN A 93.184.216.34
其次,假设我运行了另一个查找请求,如下所示(在上述记录的 TTL 到期之前):
dig sub.example.com @8.8.8.8
现在,由于解析顶级域所需的 NS 记录已在缓存中,递归解析器是否会使用此缓存信息直接查询这些 NS 记录之一以获取 (sub.example.com) 的 A 记录?如果是,它如何知道如何分解请求?
我了解到,如果缓存中没有答案,解析器会从层次结构的顶部(即根 (.))开始启动。但是,让我感到困惑的是,如果缓存中有部分答案(在本例中是顶级域的 NS 记录),解析器将如何使用这些缓存的答案?
- 它会分解查询(sub.example.com)并识别顶级域(example.com),然后在缓存中找到(example.com)的 NS 记录吗?
- 或者,它会从根开始递归解析 (sub.example.com) 并完全忽略 (example.com) 的任何先前的缓存吗?
答案1
递归缓存名称服务器将使用它本地拥有的所有信息来执行尽可能少的查询,因此对于“递归解析器是否使用此缓存信息直接查询这些 NS 记录之一以获取 (sub.example.com) 的 A 记录” ,答案是肯定的,当然前提是缓存中的内容没有过期。
如果是,那么它如何知道如何分解请求?
整个过程记录在RFC 1034 §4.3.2. 另请参阅§5.3.3
它会分解查询 (sub.example.com) 并识别顶级域 (example.com),然后在缓存中找到 (example.com) 的 NS 记录吗?或者,它会从根开始递归解析 (sub.example.com) 并完全忽略 (example.com) 的任何先前缓存吗?
根据上述算法,搜索从根开始,查找所需的特定(名称、类型)。请注意,类型会被考虑在内。在任何步骤中,如果给定的(名称、类型)信息已在本地缓存中,且未过期,则将使用该信息。
dig
是解决 DNS 问题的有用工具,但如果您使用 with,+trace
您可以看到典型的递归名称服务器(但没有缓存)的工作原理,并查看每个步骤以及解析如何从根开始。否则,您可以安装任何递归名称服务器,例如bind
或unbound
,在其日志记录中增加详细程度,然后阅读日志文件以了解正在发生的事情...