【问题标题】:Windows host name resolutionWindows 主机名解析
【发布时间】:2011-04-14 04:51:11
【问题描述】:

我想知道 Windows 主机名解析系统是如何工作的。
更准确地说,我想知道在此过程中是否使用了本地缓存
根据Microsoft TCP/IP Host Name Resolution Order,流程如下:

  1. 客户端检查查询的名称是否是自己的。
  2. 客户端然后搜索本地 Hosts 文件,即存储在本地计算机上的 IP 地址和名称列表。
  3. 查询域名系统 (DNS) 服务器。
  4. 如果名称仍未解析,则使用 NetBIOS 名称解析序列作为备份。可以通过配置客户端的 NetBIOS 节点类型来更改此顺序。

我想知道的是,阶段 (2) 是否以某种方式缓存。
最近几天突然产生了兴趣,因为我安装了一个利用HOSTS 文件的恶意软件保护 (SpyBot)。事实上,它现在有 14K 条目,而且还在增加......
该文件当前是根据主机名排序的,但当然不是必须的。
lg(14K),表示每个解析请求在文件中执行 14 步。这些请求可能以每秒几个的速度到达,并且通常到达相同的几百个主机(顶部)。

我对这个应该如何工作的看法是这样的:

  1. 在系统启动时,Windows DNS 解析机制会一次性加载 HOSTS 文件。
  2. 它提交对文件进行排序的单次迭代。工作副本被加载到内存中。
    原始 HOSTS 文件在决议的整个生命周期内不会被进一步阅读。
  3. 所有网络进程(IE、Firefox、MSN...)都通过此进程/机制工作。
    没有其他进程直接连接/读取 HOSTS 文件。
  4. 收到名称解析请求后,进程会检查其驻留内存的缓存
    如果它找到了正确的 IP,那么就是正确的答案。
  5. 否则(未缓存),解析过程将继续到内存驻留(已排序)HOSTS 文件,并对其进行快速二进制搜索。从这里开始,该过程将按照最初的描述继续进行。
    解析结果将被缓存以供进一步使用。

虽然我不确定这些的重要性,但我非常感谢您的回答。
我只是想看看我的推理是否正确,如果不是,为什么会这样?
我知道在这个永远在线的 PC 时代,必须定期(或增量)清除缓存。我暂时忽略这个。

【问题讨论】:

  • 好吧,让我们看看 Windows 源代码......哦,等等,废话 :-(

标签: windows networking dns localhost


【解决方案1】:

在 DNS 客户端服务 (dnsrslvr) 中,您可以看到一个名为 LoadHostFileIntoCache 的函数。它是这样的:

file = HostsFile_Open(...);

if (file)
{
    while (HostsFile_ReadLine(...))
    {
        Cache_RecordList(...);
        ...
    }

    HostsFile_Close(...);
}

那么服务如何知道主机文件何时被更改?启动时会创建一个执行NotifyThread 的线程,并调用CreateHostsFileChangeHandle,后者调用FindFirstChangeNotificationW 开始监视drivers\etc 目录。当发生更改时,线程使用Cache_Flush 清除缓存。

【讨论】:

【解决方案2】:

当在hosts 中更改已知主机名的 IP 地址而不添加或更改名称时,您的方法不起作用。

Technet 表示该文件将被加载到 DNS 客户端解析器缓存中。

IMO 这几乎无关紧要:在本地文件中查找(一旦在磁盘缓存中)仍然比询问 ISP 的 DNS 服务器快几个数量级。

【讨论】:

    【解决方案3】:

    我不认为每个进程都维护自己的缓存。如果有缓存,它可能存在于 TCP/IP 堆栈或内核中的某个地方,即便如此,也只存在很短的一段时间。

    我遇到过一些情况,我会修改我的主机文件,然后在网络浏览器中使用地址,它会更新解析的名称,而无需我重新启动浏览器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2013-11-05
      • 2018-03-18
      相关资源
      最近更新 更多