我想知道Windows主机名解析系统是如何工作的 .
更确切地说,我想知道 local caching 在此过程中的使用或缺乏 .
根据Microsoft TCP/IP Host Name Resolution Order,过程如下:
-
客户端检查查询的名称是否为自己的名称 .
-
The client then searches a local Hosts file ,存储在本地计算机上的IP地址和名称列表 .
-
查询域名系统(DNS)服务器 .
-
如果仍未解析名称,则使用NetBIOS名称解析序列作为备份 . 可以通过配置客户端的NetBIOS节点类型来更改此顺序 .
我想知道的是,阶段(2)是否以某种方式缓存 .
最近几天出现了突然的兴趣,因为我安装了一个利用 HOSTS
文件的恶意软件保护(SpyBot) . 事实上,它现在是14K条目大,并计数......
该文件当前根据主机名进行排序,但这当然不是必须的 .
lg(14K),表示每个分辨率请求通过文件的14个步骤 . 这些请求可能以每秒几个的速率到达,并且通常达到相同的几百个主机(顶部) .
我对这应该如何工作的看法是这样的:
-
在系统启动时,Windows DNS解析机制一次加载HOSTS文件 .
-
它对它进行一次迭代,对文件进行排序 . 工作副本将加载到内存中 .
原始的HOSTS文件,在整个生命周期内不会被进一步阅读 . -
所有网络进程(IE,Firefox,MSN ......)都通过此进程/机制工作 .
没有其他进程直接接口/读取HOSTS文件 . -
收到名称解析请求后,进程检查其内存驻留 cache .
如果找到合适的IP则适当地回答 . -
否则(它没有被缓存),解析过程继续到内存驻留(已排序)HOSTS文件,并对其进行快速二进制搜索 . 从此开始,该过程如最初描述的那样继续 .
该解决方案的结果被缓存以供进一步使用 .
虽然我不确定这些的重要性,但我真的很感激答案 .
我只是想看看我的推理是否正确,如果不是,为什么呢?
我知道在这个永远在线的PC时代,必须定期(或逐步)清除缓存 . 我现在忽略这个 .
3 回答
在DNS客户端服务(dnsrslvr)中,您可以看到名为
LoadHostFileIntoCache
的函数 . 它是这样的:那么服务如何知道主机文件何时被更改?在启动一个线程被创建,其执行
NotifyThread
,并呼吁CreateHostsFileChangeHandle
,这就要求FindFirstChangeNotificationW
开始监视drivers\etc
目录 . 当有更改时,线程使用Cache_Flush
清除缓存 .如果在
hosts
中更改了已知主机名的IP地址而未添加或更改名称,则此方法不起作用 .Technet表示该文件将加载到DNS客户端解析程序缓存中 .
IMO这几乎是无关紧要的:在本地文件中查找(一旦在磁盘缓存中),仍然比询问ISP的DNS服务器快几个数量级 .
我不认为每个进程都维护它自己的缓存 . 如果有一个缓存,它可能存在于某个地方的TCP / IP堆栈或内核中,即便如此,也只是很短的时间 .
我曾经有过这样的情况:我将修改我的主机文件,然后在网络浏览器中使用这些地址,它将更新已解析的名称而无需重新启动浏览器 .