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 主机名解析的主要内容,如果未能解决你的问题,请参考以下文章