Найти в Дзене

Что такое DNS и зачем нам про это знать?

Представим, что мы набираем в браузере kotiki.com. Визуально мы просто ожидаем увидеть открытие сайта, но под капотом система должна сначала разобраться, на какой реальный сервер отправить запрос и где эти котики живут. Проблема в том, что сервера находят по IP-адресам, а не по имени kotiki.com. DNS — это и есть тот волшебник, который даёт ответ на вопрос: “По какому IP-адресу мне найти kotiki.com?”. DNS расшифровывается как Domain Name System. И это такая глобальная система, которая помогает нам переводить “человеческие” адреса (например, kotiki.com) в IP-адреса (например, 192.168.0.1 или 2606:2800:220:1:248:1893:25c8:1946 для IPv6). Без DNS нам пришлось бы запоминать IP-адреса, а нам и без них хватает цифр, которые нужно помнить. Чтобы в следующий раз почтальон не бегал по всем котам-серверам и не тратил время (а время — деньги и скорость работы приложения), существует кеширование. Резолвер и промежуточные серверы запоминают (кешируют) IP-адрес, который соответствует домену, на какой
Оглавление

Представим, что мы набираем в браузере kotiki.com. Визуально мы просто ожидаем увидеть открытие сайта, но под капотом система должна сначала разобраться, на какой реальный сервер отправить запрос и где эти котики живут. Проблема в том, что сервера находят по IP-адресам, а не по имени kotiki.com. DNS — это и есть тот волшебник, который даёт ответ на вопрос: “По какому IP-адресу мне найти kotiki.com?”.

DNS расшифровывается как Domain Name System. И это такая глобальная система, которая помогает нам переводить “человеческие” адреса (например, kotiki.com) в IP-адреса (например, 192.168.0.1 или 2606:2800:220:1:248:1893:25c8:1946 для IPv6). Без DNS нам пришлось бы запоминать IP-адреса, а нам и без них хватает цифр, которые нужно помнить.

Как работает DNS?

  1. DNS-клиент (резолвер): это котёнок-почтальон, которого мы отправляем с запиской, когда набираем в адресной строке kotiki.com. Этот резолвер находится либо на нашем устройстве, либо провайдер даёт нам свой резолвер.
  2. Корневые DNS-серверы (root servers): когда котёнок-почтальон не знает ответ, он сначала идёт к “главному коту” — одному из корневых серверов. Тот не хранит подробные записи, но знает, где искать дальше.
  3. TLD-серверы (Top-Level Domain): “Главный кот” направляет почтальона к коту, который ведает зоной .com (или другой: .ru, .org и т.д.). Там котёнку тоже не скажут прямо IP, но подскажут, к какому коту обратиться.
  4. Авторитетный DNS-сервер (authoritative server): Это кот, который отвечает за сам домен kotiki.com. Он уже знает точный IP-адрес. Почтальон получает долгожданный IP и возвращается к нашему устройству.

Кеширование

Чтобы в следующий раз почтальон не бегал по всем котам-серверам и не тратил время (а время — деньги и скорость работы приложения), существует кеширование. Резолвер и промежуточные серверы запоминают (кешируют) IP-адрес, который соответствует домену, на какой-то срок.

Благодаря кешу, когда пользователь второй раз заходит на kotiki.com, DNS-поиск происходит мгновенно, ведь нужная запись уже лежит в памяти и котёнок-почтальон его знает.

DNS в контексте Android

  1. Любое обращение к серверу, любое скачивание json или изображения котика проходит стадию DNS-резолвинга (определения IP-адреса по домену).
  2. Иногда кажется, что первый запрос подвисает на доли секунды, хотя сам запрос максимально простой. Зачастую это именно DNS-задержка, когда нужно найти IP-адрес впервые.
  3. Android сам по себе кеширует DNS-записи, но можно управлять этим процессом: использовать библиотеки, которые умеют делать ручной DNS-резолв и кеширование (в okhttp можно сделать кастомный, по умолчанию там из OS: InetAddress.getAllByName(hostname)).
  4. DNS изначально не шифруется. Если речь идёт о секретных данных (пароли, ключи и т.п.), стоит обратить внимание на DNS-over-HTTPS (DoH) или DNS-over-TLS (DoT).

Оптимизация работы с DNS

Как разработчику, нам хочется, чтобы пользователь не заметил никаких задержек и сразу получил классные фотографии пушистиков (тогда пользователи будут счастливы и не станут писать негативные отзывы). Несколько советов:

  1. Часто провайдерский DNS не самый быстрый. Можно попробовать использовать публичные DNS (например, Google Public DNS 8.8.8.8 / 8.8.4.4).
  2. Если мы знаем, что пользователь точно будет обращаться к определённым доменам (например, к api.kotiki.com, images.kotiki.com), можно заранее обратиться на эти домены.
  3. В Android (начиная с некоторых версий) есть системная поддержка DNS-over-TLS. Также есть сторонние решения для DoH. Эти протоколы шифруют DNS-запросы, что улучшает конфиденциальность. Иногда DoH и DoT могут быть чуть медленнее (из-за шифрования), но прирост в безопасности того стоит (подробнее тут: https://developers.google.com/speed/public-dns/docs/secure-transports?hl=ru)
  4. Чем больше уникальных доменов наше приложение запрашивает, тем больше времени будет потрачено на DNS-резолв
  5. При тестировании стоит использовать сетевой дебаг (Android Profiler в Android Studio или другие инструменты) и смотреть, сколько времени занимает DNS. Надо проверять в разных сетевых условиях: 3G, 4G, Wi-Fi. В реальном мире пользователи часто будут находиться в местах с плохим сигналом и нестабильным интернетом.

Заключение

  • DNS — это система для преобразования доменных имён в IP-адреса
  • Для Android-приложений важна скорость DNS-разрешения, поскольку каждый запрос начинается с него
  • Оптимизируем DNS, используя кеширование, префетч (заранее пробиваем адреса и кешируем их), быстрые публичные DNS-сервера, минимизацию количества доменов и шифрованные протоколы вроде DNS-over-HTTP
  • Всегда тестируем, чтобы наши пользователи получали контент (особенно с котиками!) максимально быстро

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes