2010-09-18 216 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協議棧或內核中,甚至只在很短的時間內存在。

我已經有了一些情況,我會用我的主機文件修補,然後在網絡瀏覽器中使用地址,它會更新已解析的名稱,而無需重新啓動瀏覽器。