你的问题与编程无关。
但是:
我知道在客户端和权威dns服务器之间有一些中间dns服务器,比如isp的服务器。其他类型的在哪里?
只有两种类型的dns服务器(我们暂时不讨论存根情况):它要么是
权威的
nameserver(保存有关某些域的信息并作为其信任源)或
递归的
一个附加到缓存,基本上是从没有数据开始,然后根据它得到的查询逐步执行各种查询以获取信息。
从技术上讲,一台服务器可以同时执行这两种操作,但至少对于缓存的原因和不同的客户端群来说,这是一个坏主意:权威名称服务器通常对任何客户端开放,因为它需要在任何地方“扩散”其数据,而递归名称服务器通常只对选定的客户端列表(如isp客户端)开放。
目前有开放的公共递归名称服务器的大型组织:CyrdFLARE,谷歌,Que9等。然而,他们有硬件,链接,和人力来处理所有的困难来自公共递归名称服务器,如DDoS与放大。
Technicall你可以拥有一个递归名称服务器场,就像大型ISP需要做的(或以上大型公共服务器),因为任何单个实例都不能支持所有客户端查询,它们可以共享一个缓存或在一个层次结构中工作,底层实例将数据发送到另一个上游递归名称服务器,等等。
在中间dns服务器中,ns记录的ttl过期后,它们何时刷新名称的地址?客户要求?或者到期后,他们会刷新记录?
这种历史性的中庸方式可以概括为:一个请求到达,我的缓存中有它吗?如果没有,请在外部查询并缓存它。如果是,它在我的缓存中过期了吗?如果不是,则将其发送到客户端,但如果是,则需要将其从缓存中移除,然后从一开始就将其视为不在缓存中。
然后,您可以使用各种变体:
有些缓存并不完全遵守ttls:有些缓存根据自己的本地策略限制太低或太高的值。关于规范的最一致的阅读是TTL是保持高速缓存中记录的最大时间量的指示,这意味着客户端可以在之前放弃它。但是,如果认为它太低,则不应将其重写为更高的值。
缓存可以在重新启动/重新启动时保存,并且可以预取,特别是对于“流行”记录;在某种程度上,根ns的列表在启动时预取,并与内部硬编码列表进行比较,以便更新它
缓存,特别是在ram中,可能需要修剪,通常是在“最旧的已删除”情况下,以便为即将到来的新记录找到位置。
因此,根据缓存的管理方式和请求它具有的功能,可能会有一个后台任务来监视过期时间和刷新记录。
我建议你看看
unbound
作为一个递归的名称服务器,因为它有关于ttl处理的各种设置,所以您可以学习一些东西,然后阅读代码本身(这让我们回到主题)。
其原理是在缓存中获取流行的rrset,即
在他们的TTL过期并被刷新之前解决。通过提取
在最终用户查询它们之前,也就是说
预取,锤子有望提高体验质量
以及优化所涉及的资源
大型DNSSEC解决平台。
请务必阅读附录A中的许多有用示例,例如:
unbound已经这样做了(它们使用ttl的一个百分比,而不是一个数字
秒)。
打开它们
也
实现类似的功能。
许多递归解析器实现类似于
本文档中描述的技术。本节记录了一些
他们在选择技术时所做的权衡。
举一个例子,bind one,你可以读到:
绑定9.10预取的工作原理如下。有两个数字控制着它。第一个数字是“资格”。只有TTL值大于配置的可伸缩性的记录才会被考虑用于预取。第二个数字是“触发器”。如果查询到达时请求的数据在其过期前的“触发器”秒数内缓存,那么除了返回该数据作为对查询的答复外,bind还将请求权威服务器提供新的副本。这样做的目的是,在现有副本过期之前,新副本将到达,这将确保统一的响应时间。
绑定9.10预取值是全局选项。不能在不同的域中要求不同的预取行为。默认情况下启用预取。若要将其关闭,请指定触发器值0。以下命令指定触发值2秒和合格值9秒,这是默认值。