DNS в Android
• Когда дергается DNS-сервер?
У каждого сетевого запроса есть домен (например ya.ru)
Но для отправки интернет-запроса нужен не домен, а IP
Поэтому существуют DNS-сервера, которые обменивает домен в IP
Но на практике вручную отправлять запрос на DNS сервер не нужно — сетевой клиент это делает самостоятельно
Когда приложение дергает любую ручку, то клиент ищет в своих кэшах IP для этого домена. Если не находит, то делает запрос к DNS-серверу.
• Откуда клиент знает, на какой DNS-сервер слать запрос?
Клиент берет IP адреса DNS-сервера у системы. В нее обычно зашиты наиболее популярные DNS-сервера (например, гугловские 8.8.8.8)
При этом можно для каждой Wi-Fi сети указать свой DNS-сервер в настройках сети
Более того — для каждого OkHttpClient-а внутри приложения можно указать свой DNS-сервер
Под капотом там такая цепочка:
OkHttpClient -> DNS (интерфейс-колбек) -> InetAddresses (класс, который разруливает кэши и возвращает IP, связанные с доменом) -> Inet4Address/Inet6Address (классы, хранящие IP и мета-информацию)
• В какой момент домен обменивается на IP?
Когда в первый раз улетает запрос на определенный домен, клиент сначала выполняет запрос к DNS, а потом только сам запрос на ваш бекенд
При этом полученный IP сохраняется в DNS-кэш клиента
Поэтому первый запрос к бекенду будет лететь дольше, чем следующие
• Как долго живет DNS-кэш?
Точных данных не нашел, но судя по исходникам java net кэш очищается раз в какое-то время и при смене сети (переключении Wi-Fi или переходе на моб сеть)
• Можно ли вручную очиcтить DNS-кэш?
Неа, нет API для этого. Но можно в OkHttpClient передать свой DNS-колбек и самостоятельно делать запрос к DNS-серверу/организовать свой кэш
Post #112
2.84K