Использование нескольких A-записей для моего домена - пробуют ли когда-нибудь веб-браузеры более одной?

94

Если я добавлю несколько A-записей для своего домена, они будут возвращены DNS-серверами в циклическом порядке.

Пример:

192.0.2.1 A example.com
192.0.2.2 A example.com
192.0.2.3 A example.com

Но как веб-браузеры реагируют, если первый хост ( 192.0.2.1) не работает (недоступен)? Они пробуют второй хост ( 192.0.2.2) или возвращают сообщение об ошибке пользователю? Есть ли разница между самыми популярными браузерами?

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

Jonas
источник

Ответы:

87

Да, большинство браузеров за последние 5-10 лет пробуют другие записи A, если один из них не отвечает. Это иногда называется «попытка браузера» или «попытка клиента». Вы в значительной степени только найти материал об этом в контексте различных браузеров подвигов , которые эта функция позволяет с сайтами , не используя его (см DNS переприсваивания и DNS пиннинг , анти-Dns пиннинг, анти-анти-Dns пиннинг, анти-анти -анти-днс пиннинг и тд). Вид плохой репутации, но это доказывает, что она существует.

Практически каждый браузер действительно получает полный список записей А и действительно проверяет другие, не работает ли одна из них. Можно ожидать, что у каждого клиента будет 30-секундное ожидание при первой попытке доступа к сайту, когда сервер не работает, пока он не подключится к рабочему адресу. Браузер затем кеширует, какой адрес работает, и продолжит использовать этот адрес для будущих запросов, если только он не завершится с ошибкой, затем ему придется снова выполнить поиск по списку. Так что 30 секунд ожидания по первому запросу, штраф в дальнейшем.

Но это не то, что вы обязательно хотите использовать, у него будет много предостережений по поводу совместимости браузера, совместимости с ОС, прокси-совместимости, заголовков контроля кэша, которые будут иметь странные последствия, независимо от того, запоминает ли он, какие IP-адреса отключены или начинает иметь в течение 30 секунд ожидания при каждом запросе люди, пишущие пользовательские клиенты для вашего сайта, в конечном итоге будут использовать gethostbyname вместо getaddrinfo и не смогут справиться с отработкой отказа, всевозможными потенциальными проблемами.

Вы также не можете полагаться на несколько записей A, чтобы разрешить «главный» и «подчиненный» серверы, потому что вы никогда не будете знать, какой адрес браузер выберет из списка. Все они должны быть так же способны обрабатывать посетителей, если они бегут, потому что любой может получить трафик, если он работает. Браузер может подумать, что ваш третий сервер из списка является наиболее привлекательным, может быть, он выглядит ближе всего, и он выберет тот, хотя все три еще работают.

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

О, вам также придется иметь дело со многими людьми, которые говорят вам, что этого не существует (поскольку это было правдой 15 лет назад). Но вы можете попробовать telnet-соединение с доменным именем с несколькими записями A, некоторые с мертвыми IP-адресами и некоторыми хорошими, если вам нужно это доказать (да, даже старый добрый telnet теперь использует getaddrinfo и обрабатывает несколько записей A в эти дни изящно) - он распечатает хороший список IP-адресов, которые он пробует, пока, наконец, не преуспеет.

Joff
источник
12
Вот отчет Национального бюро экономических исследований, который поддерживает ответ Джоффа.
Марко
3
Интересно, что хотя stackexchange.com указывает на один IP-адрес, Google возвращает несколько: $ dig google.com @ ns1.google.com ;; РАЗДЕЛ ОТВЕТА: google.com. 300 В 74.125.226.6 google.com. 300 В 74.125.226.7 google.com. 300 В 74.125.226.0 google.com. 300 В 74.125.226.4 google.com. 300 В 74.125.226.8 google.com. 300 В 74.125.226.2 google.com. 300 В 74.125.226.1 google.com. 300 В 74.125.226.3 google.com. 300 В 74.125.226.5 google.com. 300 В 74.125.226.14 google.com. 300 в 74.125.226.9
Луи Сент-Амур
1
Извините, но я не думаю, что это так. Браузеры не имеют ничего общего с разрешением IP-адресов - это происходит в системном программном обеспечении. Если вы предоставляете несколько записей A, вы должны предполагать, что любой данный клиент получит случайную запись из списка.
Ян Стейнман
19
Это является , как это работает в современных браузерах. Все они предпочитают использовать системные вызовы, такие как getaddrinfo (), для получения нескольких IP-адресов и внутренней обработки отказа, вместо получения одного IP-адреса из системы. Другие комментаторы и авторы здесь являются частью «множества людей, говорящих вам, что этого не существует» из последнего абзаца Джоффа - я полагаю, они имеют в виду хорошо, но распространяют дезинформацию.
Роберт Тупело-Шнек
1
Чтобы поддержать утверждение Джоффа о «браузерах 5-10 лет назад», вот тест, проведенный Национальным бюро экономических исследований, в котором говорится, что система такого типа работает до IE 8. Звучит справедливо для меня. :)
Jomar Sevillejo
5

Имейте в виду, что в Windows Vista реализованы глупые части RFC3484 (то есть обратная передача от IPV6 к IPV4), и они предпочитают IP-адрес, который разделяет большинство битов префикса с IP-адресом пользователя, а не выбирает один случайным образом. Поскольку у большинства пользователей IP-адреса начинаются с 192.168, это означает, что любой из ваших IP-адресов будет использовать большинство битов префикса, которые получат большую часть трафика Vista. Microsoft исправила этот специфический идиотизм в Windows 7 и более поздних версиях, так что это не такая большая проблема, как раньше.

Майк Скотт
источник
Vista, это хорошо!
the0ther
3

Это базовый метод распределения балансировки нагрузки DNS: DNS Round Robin. Это не имеет ничего общего с браузером, это зависит от реализации распознавателя и локального / удаленного кэша адреса DNS. Изменения заключаются в том, что в случае сбоя сервера из-за кэширования на уровне DNS ваш веб-сайт может оказаться недоступным.

Смотрите здесь основное объяснение о Round Robin DNS на WikiPedia.

keatch
источник
1
Ну, так как браузер является решателем - это зависит от реализации браузера, как я знаю.
Джонас
2
Нет, есть системная библиотека, которая разрешает DNS, используя, конечно, DNS-сервер, который вы настроили в системе. Эта функция является частью стандартной библиотеки операционной системы.
keatch
Но как nslookup cnn.comв Windows, так и host cnn.comв Linux возвращает список IP-адресов, поэтому тогда это определенно зависит от реализации браузера .
Джонас
5
@iivel: Нет, это не так. Если я пишу программу на Java и разрешаю имя с помощью InetAddress.getAllByName ("example.com"), я получаю список со всеми IP-адресами, поэтому я могу при желании установить TCP-соединение со всеми из них. И то же самое, если вы используете getaddrinfo () в C. Так что это определенно выбор, который делают разработчики, а не операционная система.
Джонас
1
@ J.Money Этот вопрос задает именно о реализации, а не о том, как мы можем это сделать.
Франклин Ю.
0

ОС определяет, какой IP использовать, а не браузер. Windows будет округлять список возврата (в списке, переданном из DNS), хотя будет продолжать использовать тот же адрес, пока DNS не будет сброшен или истечет время ожидания. * Реализации ix частично зависят от реализации связанного стека tcp, но обычно также следуют методу циклического перебора.

iivel
источник
2
Нет, это неправильно Если я пишу Java-программу и определяю имя с помощью, InetAddress.getAllByName("example.com")я получаю список со всеми IP-адресами, так что я могу выбрать TCP-соединение со всеми из них, если захочу. И то же самое, если вы используете getaddrinfo()в C. Таким образом, это определенно выбор, который делают разработчики, а не операционная система. DNS-сервер только решает, в каком порядке возвращается список IP-адресов.
Джонас
Итак, вы можете вручную делать со стеком все, что захотите - вы даже можете свернуть свои собственные и забыть о winsock все вместе. Однако, если вы пишете приложение и позволяете ОС делать свое дело (абстрагироваться), то поведение будет таким, как отмечено. Ваш вопрос был конкретно о традиционном поведении приложения, а не о том, что возможно. Большинство разработчиков работают с использованием неразрешенного имени и позволяют ОС делать то, что она делает, вместо того, чтобы тесно связывать поведение.
iivel
1
Не уверен, почему ответ был отклонен, но вопрос в том, что делают браузеры. В настоящее время все браузеры позволяют ОС делать разрешение (если не считать некоторых плагинов для Firefox и Chrome). Если вы хотите получить подробную информацию о том, как обеспечить доступность в случае отказа поставщика, посмотрите балансировщики нагрузки или кластеризацию.
iivel
Браузеры, вероятно, делают, как вы говорите, - пусть ОС выполняет поиск DNS, но возвращает браузеру список с IP-адресами. И вопрос: что делают самые популярные браузеры, если первый адрес недоступен? они пробуют второе?
Джонас
2
Известно, что статья, которую вы цитируете Питом Тенерейльо, устарела (в настоящее время в основном неверна). В Chrome chrome: // net-internals / # dns показывает текущий кэш DNS. Я не верю, что ОС всегда определяет, какой IP использовать. По крайней мере, с Chrome вы можете использовать AAAA, если доступно, или только A. ОП говорит о том, как браузеры выбирают из DNS полагается, а не о том, как компьютер находит свой DNS-сервер ....
sdaffa23fdsf