Сегодня я часами пытался понять, почему моя собственная реализация DIG на уровне сокета в браузере не работает согласованно. Я успешно отправил бы пакет DNS по UDP, но получил бы ответ без секции ответа. Иногда это работает, но внезапно перестает работать без каких-либо изменений кода. Вытащив Wireshark, я увидел следующие два изображения (одно с помощью Dig, которое успешно, а другое, выполненное моим веб-приложением, нет).

1 ответ1

0

Ключ, который я заметил, заключается в том, нужна ли рекурсия. Согласно http://www.ietf.org/rfc/rfc1035.txt и RFC 1035 на странице 25:

Recursion Desired - this bit may be set in a query and is copied into the response.
If RD is set, it directs the name server to pursue the query recursively.
Recursive query support is optional."

Сначала я не думал, что этот бит был источником проблемы, так как я иногда получал правильный ответ без установленного бита (т. Е. С 0 для рекурсии). Объяснение состоит в том, что, если резолвер имеет кэшированный результат, он вернет его даже с 0 для рекурсии.

Поработав в командной строке, я смоделировал свое поведение с помощью Dig, передав флаг "+norecurse":

$ dig mx google.com @8.8.8.8 +norecurse

; <<>> DiG 9.8.3-P1 <<>> mx google.com @8.8.8.8 +norecurse
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62530
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;google.com.            IN  MX

;; Query time: 50 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Dec 24 19:52:23 2012
;; MSG SIZE  rcvd: 28

Затем я удалил +norecurse и все работало нормально!

Урок. Если вы не видите ни одного раздела ответов на ваши запросы DNS, проверьте, выполняете ли вы рекурсивный запрос. Скорее всего, это не так, и с вашим распознавателем нет запрошенных кэшированных результатов, поэтому вы ничего не получите назад.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .