【问题标题】:Configuring Windows DNS resolver cache配置 Windows DNS 解析器缓存
【发布时间】:2010-10-12 11:03:57
【问题描述】:

请注意,我说的是客户端 DNS 解析器缓存。此消息与 Windows DNS 服务器无关。

我有一个执行大量 DNS 解析的 C# 程序。因为 HTTPWebRequest 组件不允许我更改 Host 标头,所以我无法创建自己的内部 DNS 缓存。所以我必须依赖 Windows DNS 缓存,它似乎无法更改。

关于 Windows Server 2003 中的 DNS 缓存注册表设置,TechNet article 相当不错,但我无法证明设置它们有什么作用。我通过 Google 搜索找到的所有其他页面要么引用了该页面,要么对其进行了释义,有时是错误的。

Windows 的 ipconfig 命令有一个 /displaydns 开关,可以输出缓存的内容。据我所知,这是确定 DNS 缓存大小的唯一方法。在我对具有 2 GB 内存的 32 位 Windows XP 机器进行的实验中,无论我将 DNS 缓存注册表值设置为什么,我最终都会在缓存中得到 30 到 40 个项目——即使在进行了数千次 DNS 解析之后.在具有 16 GB 内存的 64 位 Windows 2008 机器上,我的缓存中总是有 270 到 300 个项目。

我被难住了。我不知道答案是什么,但我认为是以下情况之一:

  1. 无法更改 DNS 解析器缓存的大小。
  2. 有可能,但文档有误。
  3. 文档就其内容而言是正确的,但不完整。
  4. 文档是正确且完整的,但我太笨了,无法理解它。
  5. 记录在案的注册表项实际上改变了缓存的大小,但 ipconfig 没有显示缓存中的所有项。

谁能告诉我是否可以在 Windows XP、Vista 或 Server 2008 中配置 DNS 解析器缓存的大小?

【问题讨论】:

  • 更改值后重新启动 DNS 客户端服务?
  • 试过了。不用找了。也试过重启机器。

标签: c# .net dns


【解决方案1】:

通过这些设置,在网络上仅仅几分钟后,我就看到了 1517 个缓存条目:

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters]
"QueryIpMatching"=dword:00000001
"NegativeCacheTime"=dword:00000000
"NegativeSOACacheTime"=dword:00000000
"CacheHashTableBucketSize"=dword:00000001
"CacheHashTableSize"=dword:00000180
"MaxCacheEntryTtlLimit"=dword:00000e10
"MaxSOACacheEntryTtlLimit"=dword:0000012c

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"QueryIpMatching"=dword:00000001

【讨论】:

  • 这里是注册表条目文档的链接:link
【解决方案2】:

有一个“便携式 DNS 缓存”程序,您可以使用它来查看 DNS 缓存,监控 DNS 解析器的活动,并查看通过缓存解析的查询以及转发到 DNS 服务器的查询。在其设置中,您可以配置缓存中的最大项目数。虽然,它似乎强制所有项目保留在缓存中,直到您单击“清除缓存”按钮或达到缓存限制。

【讨论】:

    【解决方案3】:

    默认情况下,缓存的最小 TTL 是 1 天,我玩过它,但默认情况下我相信注册表项默认情况下不存在。

    这是您正在寻找的密钥,至少在 XP 中:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DNSCache\Parameters

    您需要添加一个 DWORD MaxCacheTtl - 这将更改存储在解析器缓存中的最小 TTL。

    由于它默认为 86,400(值以秒为单位,默认 = 1 天),因此任何比这更短的内容都不会被缓存。如果你把它降低到 300,你会看到更多的缓存在客户端上。

    【讨论】:

    • 根据知识库文章support.microsoft.com/kb/318803,记录将被缓存的时间是“以下两者中的较小者:1) 解析器收到的响应中指定的秒数;2) MaxCacheTtl 设置的值。”您的回答与此冲突。
    • 我说的不是缓存条目的 TTL,而是决定它是否有资格被缓存的阈值。
    • 您能否扩展您的答案以解释减少 MaxCacheTtl 将如何导致更多记录被放置在缓存中?我在知识库和链接的 TechNet 文章中阅读的所有内容都表明我想增加 MaxTtl 以使缓存更有效。
    【解决方案4】:

    您可以使用的一个技巧是向 Windows 上的主机文件添加条目,这将使它不会对文件中的所有条目进行 DNS 查询。您可以定期然后再次查询以验证条目。

    【讨论】:

    • 这是一个有趣的想法,但我所做的 DNS 请求数量使其不切实际。我也不想让我的程序访问主机文件或它包含的目录。
    • -1 - 入侵主机显然不是解决问题的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多