我不确定当它的缓存包含部分答案时递归解析的行为如何。具体来说,假设我首先运行了这个查找请求:
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) 的任何先前缓存吗?
递归缓存名称服务器将使用它在本地拥有的所有信息以执行尽可能少的查询,因此对于“递归解析器是否使用此缓存信息直接查询这些 NS 记录之一以获取 (sub.example.xml) 的 A 记录。 com)" 答案是肯定的,当然如果缓存中的内容没有过期。
整个过程记录在RFC 1034 的 §4.3.2 中。另见§5.3.3
根据上述算法,搜索从根开始查找所需的特定(名称、类型)。请注意,类型已被考虑在内。在任何步骤,如果给定的(名称,类型)信息已经在本地缓存中,并且没有过期,那么它将被使用。
dig
是解决 DNS 问题的有用工具,但如果您使用它,+trace
您可以看到典型的递归名称服务器(但没有缓存)是如何工作的,并查看每个步骤以及如何从根目录开始解析。否则,您可以安装任何递归名称服务器,例如bind
orunbound
,在其日志记录中增加详细程度,然后阅读日志文件以了解正在发生的事情......