← Назад к вопросам

Для чего нужен DNS?

1.0 Junior🔥 131 комментариев
#Сети и протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Назначение DNS (Domain Name System)

DNS (Domain Name System) — это распределённая система имён, которая преобразует **доменные имена** (например, google.com) в **IP-адреса** (например, 142.251.41.14), которые компьютеры понимают и используют для маршрутизации пакетов в сети.

Основная проблема, которую решает DNS

Вспомните: люди не могут легко запомнить IP-адреса (192.168.1.1, 8.8.8.8), но легко запомнить доменные имена (google.com, github.com). DNS — это именно то, что преобразует человекочитаемые имена в машиночитаемые адреса.

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

1. Клиент вводит в браузер: https://google.com
2. Браузер отправляет запрос к локальному DNS resolver (обычно у провайдера)
3. DNS resolver опрашивает иерархию серверов:
   - Root nameserver (корневой сервер)
   - TLD nameserver (.com, .ru и т.д.)
   - Authoritative nameserver (сервер, хранящий запись домена)
4. Authoritative nameserver возвращает IP: 142.251.41.14
5. Браузер получает IP и подключается к серверу

Типы DNS записей

A запись — IP адрес (IPv4)

google.com    A    142.251.41.14

AAAA запись — IP адрес (IPv6)

google.com    AAAA    2607:f8b0:4004:80d::200e

CNAME запись — alias (другое имя)

www.google.com    CNAME    google.com

MX запись — mail server

google.com    MX    10    smtp.google.com

NS запись — nameserver

google.com    NS    ns1.google.com

TXT запись — текстовая информация (SPF, DKIM)

google.com    TXT    "v=spf1 ...."

Пример в C++: Резолв имени

#include <iostream>
#include <netdb.h>
#include <arpa/inet.h>
#include <cstring>

void resolve_hostname(const char* hostname) {
    struct hostent* he = gethostbyname(hostname);
    
    if (he == nullptr) {
        std::cerr << "Cannot resolve: " << hostname << std::endl;
        return;
    }
    
    std::cout << "Resolved: " << hostname << std::endl;
    
    // Перебираем все IP адреса
    for (int i = 0; he->h_addr_list[i] != nullptr; i++) {
        struct in_addr* addr = (struct in_addr*)he->h_addr_list[i];
        std::cout << "  IP: " << inet_ntoa(*addr) << std::endl;
    }
}

int main() {
    resolve_hostname("google.com");
    resolve_hostname("github.com");
    return 0;
}

Современный подход: getaddrinfo()

#include <iostream>
#include <sys/socket.h>
#include <netdb.h>
#include <cstring>

int resolve_modern(const char* hostname) {
    struct addrinfo hints, *result, *p;
    
    std::memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;      // IPv4 или IPv6
    hints.ai_socktype = SOCK_STREAM;  // TCP
    
    int status = getaddrinfo(hostname, "80", &hints, &result);
    if (status != 0) {
        std::cerr << "getaddrinfo error: " << gai_strerror(status) << std::endl;
        return 1;
    }
    
    for (p = result; p != nullptr; p = p->ai_next) {
        char ipstr[INET6_ADDRSTRLEN];
        void* addr;
        
        if (p->ai_family == AF_INET) {
            struct sockaddr_in* ipv4 = (struct sockaddr_in*)p->ai_addr;
            addr = &(ipv4->sin_addr);
        } else {
            struct sockaddr_in6* ipv6 = (struct sockaddr_in6*)p->ai_addr;
            addr = &(ipv6->sin6_addr);
        }
        
        inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr));
        std::cout << "IP: " << ipstr << std::endl;
    }
    
    freeaddrinfo(result);
    return 0;
}

Зачем DNS нужен бэкэнд разработчику

  1. Подключение к базам данных: mysql.example.com вместо 192.168.1.5
  2. API интеграции: Запросы к внешним сервисам по доменам
  3. Load balancing: Один домен может указывать на несколько IP адресов
  4. SSL/TLS сертификаты: Привязаны к доменам, не к IP
  5. Email: Через MX записи определяется mail сервер
  6. Service discovery: В микросервисных архитектурах (Kubernetes использует DNS для discovery)

Кэширование DNS

DNS результаты кэшируются:

  • На клиенте (браузер, ОС)
  • На локальном resolver провайдера
  • На авторитетном nameserver
TTL (Time To Live) — как долго кэшировать результат. Типичные значения: 300 сек (5 минут) до нескольких часов.

Итог

DNS — это критически важная служба интернета, которая преобразует имена в адреса. Без DNS интернет был бы неудобен. Как бэкэнд разработчик, вы должны понимать, как DNS влияет на надежность и производительность приложения.