Я имею автономное, изолировал сеть, запускающую смешанные системы Windows и Linux с сервером Windows 2008 R2, выполняющим AD обязанности и DNS.
Я вижу 5-секундные задержки с использованием getaddrinfo
в системах Linux.
В Wireshark я вижу (C-> S значит клиент для сервера DNS):
t=0.000 C->S Query A foo.example.com ID=0x1111
t=0.000 C->S Query AAAA foo.example.com ID=0x2222
t=0.004 S->C Response to 0x2222, No error
(Query is echoed)
Authoritative nameservers:
example.com: type SOA, class IN, mname svr01.example.com
Name: example.com
Type: SOA
Class: IN
TTL: 1 hour
Primary name server: svr01.example.com
Refresh interval: 15 minutes
Retry interval: 10 minutes
Expiration limit: 1 day
Minimum TTL: 1 hour
[5 second delay]
t=5.004 C->S Query A foo.example.com ID=0x1111
t=5.005 S->C Query response A 192.168.1.17'
Если я выполню тот же запрос снова, вскоре после этого, то я не буду видеть задержки, как ожидалось:
t=0.000 C->S Query A foo.example.com ID=0x3333
t=0.000 C->S Query AAAA foo.example.com ID=0x4444
t=0.001 S->C Query response A 192.168.1.17'
Я могу продолжить получать непосредственные ответы в течение некоторого промежутка времени. Через некоторое время (все еще экспериментирующий) задержка возвратится.
Что продолжается здесь? Если я использую gethostbyname()
(который только делает IPv4), или nslookup foo.example.com
, нет никакой задержки.
Дополнительная информация:
Обновление:
Этот ответ на Просит, чтобы Ubuntu предложила добавить
options single-request
кому: /etc/resolv.conf
. Это, казалось, исправляло проблему для меня.
Однако мне все еще любопытно:
Ваш DNS-сервер работает с ошибками. На DNS-сервер отправляются два запроса, но он отправляет только один ответ. Клиент делает то, что должны делать клиенты в этом случае, он ждет некоторое время, а затем повторно передает запрос.
Начальная задержка в 5 секунд может быть разумной для неинтерактивного использования. Но для интерактивного использования я бы посчитал, что это слишком много.
Правильным исправлением было бы обновить DNS-сервер до версии без ошибки или связаться с поставщиком, если исправление еще не выпущено. Все остальное - обходной путь.
Использование man resolv.conf
в системе Ubuntu объяснит, какие параметры с одним запросом
и с одним запросом и повторно открыть
делать. Это два разных варианта обходного пути для известной ошибки в определенных DNS-серверах. Недостатком этих опций является то, что они замедляют разрешение имен примерно в два раза. Однако, учитывая, что ошибка, по-видимому, замедляет разрешение имен примерно в 1000 раз, вам все же может быть лучше использовать обходной путь.
При запросе несуществующей записи вы можете вместо этого получить ответ с записью SOA. Причина отправки не только кода ошибки, но и записи SOA заключается в том, что запись SOA содержит информацию, которая позволит кэшировать отрицательный результат.
Правильный способ интерпретации захвата вашего пакета состоит в том, что вы видите отброшенные ответные пакеты для и , A
и AAAA
] записывают ответы.
Запись SOA
, кажется, сбивает вас с толку и заслуживает подробного рассмотрения:
SOA
на самом деле находится в разделе полномочий, а не в разделе ответов. NXDOMAIN
означает «нет записей с таким именем». Если есть другие записи с тем же именем, но разных типов, вы увидите ответ NOERROR
с нулевыми записями в разделе ответов. NOERROR
с нулевыми ответами и разделом прав доступа, сообщающим, из какой зоны пришел этот ответ. Вы можете полностью игнорировать компонент SOA
. Этот ответ сообщает вам, что не существует записи AAAA
. Теперь, когда мы установили, что ответ AAAA
является правильно отформатированным пакетом, и то, что вы должны в этом сценарии, он полностью меняет контекст того, на что мы смотрим. Вы видите случаи, когда A
ответов на записи теряются, в дополнение к AAAA
ответам теряются. Ваше исследование предполагает, что ответы AAAA
теряются чаще, но не исключительно.
Основываясь на предоставленной информации, мы не сможем объяснить, что здесь происходит. Вам необходимо настроить захват пакетов на самих DNS-серверах и определить следующие факторы:
Как видите, здесь может происходить много вещей. Вам нужно будет сузить круг вопросов, чтобы исключить возможные варианты. Прошу прощения за то, что этот ответ не был окончательным, но это было намного больше, чем можно было бы описать в нескольких комментариях. Не стесняйтесь обновить свой вопрос.