Комментарии (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 нужен бэкэнд разработчику
- Подключение к базам данных:
mysql.example.comвместо192.168.1.5 - API интеграции: Запросы к внешним сервисам по доменам
- Load balancing: Один домен может указывать на несколько IP адресов
- SSL/TLS сертификаты: Привязаны к доменам, не к IP
- Email: Через MX записи определяется mail сервер
- Service discovery: В микросервисных архитектурах (Kubernetes использует DNS для discovery)
Кэширование DNS
DNS результаты кэшируются:
- На клиенте (браузер, ОС)
- На локальном resolver провайдера
- На авторитетном nameserver
TTL (Time To Live) — как долго кэшировать результат. Типичные значения: 300 сек (5 минут) до нескольких часов.
Итог
DNS — это критически важная служба интернета, которая преобразует имена в адреса. Без DNS интернет был бы неудобен. Как бэкэнд разработчик, вы должны понимать, как DNS влияет на надежность и производительность приложения.