Windows主机名解析

3
我想知道Windows主机名解析系统是如何工作的。
更准确地说,我想了解在该过程中本地缓存的使用情况(或缺乏使用)。
根据Microsoft TCP/IP Host Name Resolution Order,该过程如下:
  1. 客户端检查查询的名称是否为其自身。
  2. 然后客户端搜索本地Hosts文件,这是存储在本地计算机上的IP地址和名称列表。
  3. 查询域名系统(DNS)服务器。
  4. 如果名称仍未解析,则使用NetBIOS名称解析序列作为备份。可以通过配置客户端的NetBIOS节点类型来更改此顺序。
我想知道的是,第二阶段是否以某种方式被缓存。
最近几天,我的兴趣突然增加,因为我安装了一个利用HOSTS文件的恶意软件防护程序(SpyBot)。实际上,它现在有14K个条目,并且还在增加...
该文件当前按主机名排序,但这当然不一定是这样的。
lg(14K)表示每个分辨率请求需要浏览文件14步。这些请求可能每秒钟到达几个,通常是同几百个主机(排名前几位)。

我认为它应该是这样工作的:

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

虽然我不确定这些的重要性,但我真的很希望得到一个答案。
我只想看看我的推理是否正确,如果不是,为什么?
我知道在这个始终开着的PC时代,缓存必须定期(或增量)清除。暂且不管。


2
好吧,让我们来看看Windows源代码,等等,糟糕 :-( - halfdan
3个回答

2
在 DNS 客户端服务 (dnsrslvr) 中,您可以看到一个名为 LoadHostFileIntoCache 的函数。它大概是这样的:
file = HostsFile_Open(...);

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

    HostsFile_Close(...);
}

那么这个服务是如何知道 hosts 文件已被更改呢?在启动时,会创建一个执行 NotifyThread 的线程,它调用 CreateHostsFileChangeHandle,该方法又调用 FindFirstChangeNotificationW 来开始监视 drivers\etc 目录。当有更改发生时,该线程将使用 Cache_Flush 清除缓存。

Technet的链接[1]也是这样说的,但这个更加精确。所以我投票支持这个,虽然两者都可以。 [1] http://technet.microsoft.com/en-us/library/bb727005.aspx - Trevor

0

当已知主机名的IP地址在hosts中更改或添加名称时,您的方法将无法正常工作。

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

我认为这基本上是不相关的:在本地文件中查找(一旦它在磁盘缓存中)仍然比询问您的ISP的DNS服务器快几个数量级。


0

我认为每个进程都没有自己的缓存。如果有缓存,它可能存在于TCP/IP堆栈或内核中的某个地方,即使是这样,也只存在很短的时间。

我曾经遇到过这样的情况,我会在我的主机文件中进行调整,然后在Web浏览器中使用地址,它会更新已解析的名称,而无需重新启动浏览器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接