首页 文章

Windows主机名解析

提问于
浏览
3

我想知道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 回答

  • 0

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

    file = HostsFile_Open(...);
    
    if (file)
    {
        while (HostsFile_ReadLine(...))
        {
            Cache_RecordList(...);
            ...
        }
    
        HostsFile_Close(...);
    }
    

    那么服务如何知道主机文件何时被更改?在启动一个线程被创建,其执行 NotifyThread ,并呼吁 CreateHostsFileChangeHandle ,这就要求 FindFirstChangeNotificationW 开始监视 drivers\etc 目录 . 当有更改时,线程使用 Cache_Flush 清除缓存 .

  • 0

    如果在 hosts 中更改了已知主机名的IP地址而未添加或更改名称,则此方法不起作用 .

    Technet表示该文件将加载到DNS客户端解析程序缓存中 .

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

  • 2

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

    我曾经有过这样的情况:我将修改我的主机文件,然后在网络浏览器中使用这些地址,它将更新已解析的名称而无需重新启动浏览器 .

相关问题