Почему «копать localhost» намного быстрее, чем «nslookup localhost»?

551
Roger Lipscombe

При поиске адреса для localhost, nslookup localhostзанимает ~ 15 секунд:

$ /usr/bin/time nslookup localhost ;; connection timed out; no servers could be reached  Command exited with non-zero status 1 0.00user 0.00system 0:15.00elapsed 0%CPU (0avgtext+0avgdata 4072maxresident)k 0inputs+0outputs (0major+1121minor)pagefaults 0swaps 

dig localhost немедленно

$ /usr/bin/time dig localhost  ; <<>> DiG 9.9.5-3ubuntu0.17-Ubuntu <<>> localhost ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20936 ;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0  ;; QUESTION SECTION: ;localhost. IN A  ;; ANSWER SECTION: localhost. 0 IN A 127.0.0.1  ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed May 09 08:53:37 UTC 2018 ;; MSG SIZE rcvd: 43  0.00user 0.00system 0:00.07elapsed 6%CPU (0avgtext+0avgdata 4244maxresident)k 320inputs+0outputs (1major+1164minor)pagefaults 0swaps 

Почему digтак быстрее чем nslookup? Что nslookupделает / digне делает это так долго?

Кстати:

$ grep localhost /etc/hosts 127.0.0.1 localhost 

Факт, который nslookupтерпит неудачу, связан с проблемой конфигурации: /etc/resolv.confсодержит дополнительныйsearch суффикс, который пересылается несуществующему распознавателю.

Мой вопрос: почему разница?

0
В вашем собственном выводе nslookup терпит неудачу, так что это не имеет смысла сравнение. Для меня обе команды почти мгновенные. jdwolf 5 лет назад 0
`dig` и` nslookup` занимают у меня около 10 мс. как указал @jdwolf, ваш вывод показывает, что nslookup истекает, намекая на проблему конфигурации. Attie 5 лет назад 0
Я знаю, что это проблема конфигурации. Мой вопрос, почему разница? Я обновил вопрос. Roger Lipscombe 5 лет назад 0

1 ответ на вопрос

0
Austin Hemmelgarn

В вашем конкретном случае это происходит из-за nslookupистечения времени ожидания, которое обычно занимает очень много времени по сравнению с получением действительного ответа.

Как немного дальнейшего фона:

  • digэто в основном низкоуровневый инструмент отладки. Он не выполняет рекурсию сам по себе, требует, чтобы вы указали сервер для запроса, и позволяет запрашивать произвольные типы RR (или просто ANYполучить все записи). Обычно это будет немного быстрее, чем фактический поиск, просто потому что nslookup просто потому, что он имеет все данные, необходимые для командной строки.
  • nslookupразработан для того, чтобы быть интерактивным инструментом для запросов к инфраструктуре DNS, а не выполнять поиск по месту, как это digделается. Это случается, чтобы обеспечить неинтерактивный режим (который вы используете выше), но это в основном просто сокращение. Хотя вы можете указать ему использовать определенный сервер, он по умолчанию будет использовать те, которые настроены в /etc/resolv.conf, и, таким образом, запуск без указанного сервера будет немного медленнее, чем dig(потому что он должен искать в файле).
  • host, которую вы не упомянули, но для полноты изложения стоит упомянуть, это команда, предоставляемая библиотекой C для поиска имени хоста. Он использует подпрограммы разрешения имен в библиотеке C, что означает, что он учитывает /etc/resolv.conf, но он также учитывает настройки /etc/nsswitch.conf, что означает, что он может искать имена хостов /etc/hosts, через NIS или NIS +, через LDAP, через mDNS (если вы используете право TLD для этого), через LLMNR или любым другим способом. В результате он медленнее по сравнению с digи nslookup, но он также показывает, какую именно программу использует настройки разрешения имен системы вместо того, чтобы делать собственный DNS, увидит ,