2010-09-18 167 views
2

我想知道Windows主机名称解析系统是如何工作的。
更确切地说,我想知道在这个过程中使用或缺少本地缓存
Microsoft TCP/IP Host Name Resolution Order,过程如下:Windows主机名称解析

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

我想知道的是,stage(2)是否以某种方式被缓存。
最近几天突然兴起,因为我安装了利用HOSTS文件的恶意软件防护(SpyBot)。事实上,它现在是14K条目大,并计数...
该文件目前按主机名排序,但这当然不一定是。对于每个解析请求,表示通过文件的14个步骤(步骤14K)。这些请求可能每秒钟以几秒的速度到达,并且通常到达几百个主机(顶端)。

我的这个应该工作是怎么样的这个观点:

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

虽然我不确定这些的重要性,但我真的很感谢答案。
我只想看看我的推理是否正确,如果没有,为什么这样呢?
我知道,在永远在线PC的这个时代,缓存必须定期(或增量)清除。我现在忽略这一点。

+2

那么让我们来看看Windows源代码和..哦,等待,废话:-( – halfdan 2010-09-18 21:42:28

+0

@halfdan :-) ::: – Trevor 2010-09-18 21:51:06

回答

2

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

file = HostsFile_Open(...); 

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

    HostsFile_Close(...); 
} 

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

+0

到Technet的链接[1]这么说,但是这似乎更确切。所以我为此投了票,虽然都很好。 [1] http://technet.microsoft.com/en-us/library/bb727005.aspx – Trevor 2010-09-19 11:29:32

0

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

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

国际海事组织这大多是不相关的:在本地文件(一旦它在磁盘缓存中)的查询仍然比问你的ISP的DNS服务器快几个数量级。

0

我不认为每个进程保持它自己的缓存。如果有缓存,它可能存在于TCP/IP协议栈或内核中,甚至只在很短的时间内存在。

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