我有一些问题可以更好地理解DNS机制:
1)我知道客户端和权威DNS服务器之间有一些中间DNS服务器,例如ISP的。还有其他什么类型?在哪里?
2)在中间DNS服务器中,NS记录的TTL过期后,它们何时刷新名称的地址?客户要求?或到期后立即刷新记录?
谢谢。
您的问题不在这里,与编程无关。
但是:
我知道客户端和权威DNS服务器之间有一些中间DNS服务器,例如ISP的。还有其他什么类型?在哪里?
仅有两种类型的DNS服务器(我们暂时将它放在存根中):它是authoritative名称服务器(保存有关某些域的信息并作为其信任源)或递归一个附加到缓存的缓存,它基本上从没有数据开始,然后将根据获取的查询逐步进行各种查询以获取信息。
从技术上讲,一台服务器可以同时做到,但是至少出于缓存原因以及客户端数量的不同,这是一个坏主意:权威的名称服务器通常对任何客户端开放,因为它需要“广播”其客户端。递归名称服务器通常仅适用于选定的客户端列表(例如ISP客户端)的所有位置。
[当今,大型组织存在开放的公共递归名称服务器:CloudFlare,Google,Quad9等。但是,它们都有硬件,链接和人力来处理来自公共递归名称服务器(例如具有放大功能的DDOS)的所有问题。
从技术上讲,您可以拥有一个递归名称服务器场,就像大型ISP需要(或以上大型公共名称服务器一样),因为任何单个实例都无法承受所有客户端查询,并且它们可以共享一个缓存或在一个缓存中工作层次结构,最底层的将其数据发送到另一个上游递归名称服务器,等等。
NS记录的TTL在中间DNS服务器中过期后,它们何时刷新名称的地址?客户要求?或到期后立即刷新记录?
这种历史性的天真的方法可以概括为:请求到达,我是否将其保存在缓存中?如果否,则在外面查询并缓存它。如果是,它在我的缓存中过期了吗?如果不是,则将其发送给客户端,但是如果是,我们需要将其从缓存中删除,然后从一开始就认为它不在缓存中。
然后您会有各种变化:
我建议您将unbound
用作递归名称服务器,因为它在TTL处理方面具有多种设置,因此您可以学习一些内容,然后阅读代码本身(这使我们回到了主题上) 。
您还可以阅读此文档:https://www.ietf.org/archive/id/draft-wkumari-dnsop-hammer-03.txt有关以下内容的IETF互联网草案:
原理是获取缓存中流行的RRset,即可以说在TTL过期并刷新之前已解决。通过获取最终用户查询RRset之前,也就是说预取,HAMMER有望改善体验质量最终用户以及优化涉及的资源大型DNSSEC解决平台。
请务必阅读附录A并提供许多有用的示例,例如:
[Unbound已经这样做(它们使用TTL的百分比,而不是数字秒)。
他们[[也实现类似的OpenDNS。
BIND自9.10起,大约2月2014现在实现了这样的事情(https://deepthought.isc.org/article/AA-01122/0/Early-refresh-of-cache-records-cache-prefetch-in-BIND-9.10.html),并通过默认。
许多递归解析器实现的技术类似于本文档中介绍的技术。本节记录了一些这些以及他们在选择技术时所要进行的权衡。
并举一个绑定的例子,您可以阅读:
BIND 9.10预取的工作原理如下。有两个数字控制它。第一个数字是“资格”。只有到达TTL值大于配置的可识别性的记录才被考虑进行预取。第二个数字是“触发器”。如果查询到达要求缓存的数据过期之前还剩下少于“触发”秒的时间,则除了返回该数据作为对查询的答复外,BIND还将向权威服务器请求新副本。目的是使新副本在现有副本到期之前到达,以确保一致的响应时间。BIND 9.10预取值是全局选项。您不能在不同的域中要求不同的预取行为。默认情况下启用预取。要关闭它,请将触发值指定为0。以下命令将触发值指定为2秒,而合格值为9秒,这是默认值。