Windows 主机名解析

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

好吧,让我们看看 Windows 源代码......哦,等等,废话 :-( 【参考方案1】:

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

file = HostsFile_Open(...);

if (file)

    while (HostsFile_ReadLine(...))
    
        Cache_RecordList(...);
        ...
    

    HostsFile_Close(...);

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

【讨论】:

Technet 的链接 [1] 也是如此,但这似乎更准确。所以我投票赞成这个,虽然两者都很好。 [1] technet.microsoft.com/en-us/library/bb727005.aspx【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于Windows 主机名解析的主要内容,如果未能解决你的问题,请参考以下文章

修改主机名

可达性解析主机名但无法ping通主机名

配置服务主机名和域名IP解析

配置服务主机名和域名IP解析

配置服务主机名和域名IP解析

配置服务主机名和域名IP解析