Разрешение имени хоста Windows - PullRequest
3 голосов
/ 19 сентября 2010

Мне было интересно, как работает система разрешения имен хостов Windows.
Точнее, меня интересует использование или отсутствие локального кэширования в процессе.
В соответствии с Порядок разрешения имен хостов Microsoft TCP / IP , процесс выглядит следующим образом:

  1. Клиент проверяет, является ли запрашиваемое имя его собственным.
  2. Затем клиент ищет локальный файл Hosts , список IP-адресов и имен, хранящихся на локальном компьютере.
  3. Запрашиваются серверы системы доменных имен (DNS).
  4. Если имя все еще не разрешено, последовательность разрешения имен NetBIOS используется в качестве резервной копии. Этот порядок можно изменить, настроив тип узла NetBIOS клиента.

Мне было интересно, кэшируется ли этап (2) каким-либо образом.
Внезапный интерес возник в последние несколько дней, когда я установил защиту от вредоносных программ (SpyBot), которая использует файл HOSTS. На самом деле, теперь это 14K записей и считается ...
Файл в настоящее время сортируется по имени хоста, но это, конечно, не обязательно.
lg (14K) означает 14 шагов по файлу для каждого запроса разрешения. Эти запросы, вероятно, поступают с частотой несколько раз в секунду и, как правило, к тем же нескольким сотням хостов (вершин).

Мой взгляд на то, как это должно работать, выглядит так:

  1. При запуске системы механизм DNS-разрешения Windows загружает файл HOSTS один раз.
  2. Он фиксирует одну итерацию для сортировки файла. Рабочая копия загружена в память.
    Исходный файл HOSTS больше не будет читаться в течение всего срока действия резолюции.
  3. Все сетевые процессы (IE, Firefox, MSN ...) работают через этот процесс / механизм.
    Никакой другой процесс не взаимодействует напрямую / не читает файл HOSTS.
  4. Получив запрос на разрешение имени, процесс проверяет свою резидентную память cache .
    Если он находит правильный IP-адрес, то отвечает соответствующим образом.
  5. В противном случае (он не кэшируется) процесс разрешения продолжается для резидентного (отсортированного) файла HOSTS и выполняет быстрый двоичный поиск по нему. С этого момента процесс продолжается, как первоначально описано.
    Результат разрешения кэшируется для дальнейшего использования.

Хотя я не уверен в их значении, я был бы очень признателен за ответ.
Я просто хочу посмотреть, правильны ли мои рассуждения, а если нет, то почему?
Я знаю, что в наш век постоянно включенных компьютеров кэш должен периодически (или постепенно) очищаться. Я игнорирую это сейчас.

Ответы [ 3 ]

2 голосов
/ 19 сентября 2010

В службе DNS-клиента (dnsrslvr) вы можете увидеть функцию с именем LoadHostFileIntoCache. Это выглядит примерно так:

file = HostsFile_Open(...);

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

    HostsFile_Close(...);
}

Так как служба узнает, когда файл hosts был изменен? При запуске создается поток, который выполняет NotifyThread и вызывает CreateHostsFileChangeHandle, который вызывает FindFirstChangeNotificationW, чтобы начать мониторинг каталога drivers\etc. Когда есть изменение, поток очищает кеш, используя Cache_Flush.

0 голосов
/ 19 сентября 2010

Я не думаю, что каждый процесс поддерживает свой собственный кеш. Если есть кеш, он, вероятно, где-то существует в стеке TCP / IP или ядре, и даже тогда, только на очень короткое время.

У меня были ситуации, когда я возился со своим файлом hosts, а затем использовал адреса в веб-браузере, и он обновлял разрешенные имена без необходимости перезапуска браузера.

0 голосов
/ 19 сентября 2010

Ваш метод не работает, когда IP-адрес известного имени хоста изменяется в hosts без добавления или изменения имени.

Technet говорит, что файл будет загружен вкэш распознавателя клиента DNS.

IMO, это в основном не имеет значения: поиск в локальном файле (если он находится в кэше диска) все равно будет на несколько порядков быстрее, чем запрос DNS-серверов у вашего интернет-провайдера.

...