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

Как связан DNS и IP?

2.0 Middle🔥 151 комментариев
#Браузер и сетевые технологии

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

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

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

Связь DNS и IP адресов

DNS (Domain Name System) и IP адреса - это две связанные технологии. DNS преобразует понятные нам доменные имена в IP адреса, которые используются компьютерами для маршрутизации интернет-трафика.

Что такое IP адрес

// IP адрес (IPv4) - это 32-битное число, обычно записываемое как 4 октета
// Пример: 192.168.1.1
// Каждый октет может быть от 0 до 255

// IPv6 - это 128-битное число (для будущего интернета)
// Пример: 2001:0db8:85a3:0000:0000:8a2e:0370:7334

// Проверка IP в JavaScript
const ipv4Regex = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;

const isValidIP = (ip) => ipv4Regex.test(ip);
console.log(isValidIP('192.168.1.1'));  // true
console.log(isValidIP('256.1.1.1'));    // false

Что такое DNS

// DNS (Domain Name System) - это система именования, которая преобразует
// доменные имена (example.com) в IP адреса (93.184.216.34)

// Процесс разрешения DNS:
// 1. Пользователь вводит в браузер: https://example.com
// 2. Браузер отправляет DNS запрос
// 3. DNS сервер отвечает: example.com = 93.184.216.34
// 4. Браузер подключается к серверу по IP адресу

// Типы DNS записей:
// A - преобразует доменное имя в IPv4 адрес
// AAAA - преобразует доменное имя в IPv6 адрес
// CNAME - создает псевдоним для другого доменного имени
// MX - определяет почтовый сервер
// TXT - хранит текстовые данные
// NS - указывает на авторитетный DNS сервер

DNS преобразование в браузере

// Когда вы пишете fetch('https://api.example.com/data')
// браузер делает следующее:

// 1. Извлекает доменное имя
const url = new URL('https://api.example.com/data');
const hostname = url.hostname; // api.example.com

// 2. Проверяет кэш (браузер, ОС, маршрутизатор)
// 3. Если не в кэше, отправляет DNS запрос рекурсивному резолверу
// 4. Рекурсивный резолвер может спросить корневой DNS сервер
// 5. Затем TLD (Top Level Domain) сервер для .com
// 6. Затем авторитетный DNS сервер для example.com
// 7. Получает IP и возвращает браузеру
// 8. Браузер подключается к серверу по IP адресу

DNS запросы в коде

// В браузере нельзя напрямую делать DNS запросы,
// но можно использовать различные техники

// 1. Fetch API (автоматически делает DNS запрос)
fetch('https://example.com/api')
  .then(response => response.json())
  .then(data => console.log(data));

// 2. Image пинг (быстрая проверка DNS)
const checkDNS = (domain) => {
  const img = new Image();
  img.onload = () => console.log(`${domain} доступен`);
  img.onerror = () => console.log(`${domain} недоступен`);
  img.src = `https://${domain}/favicon.ico?t=${Date.now()}`;
};

checkDNS('example.com');

// 3. XMLHttpRequest (старый способ)
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/api', true);
xhr.send();

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

// Браузеры кэшируют DNS результаты для ускорения

// 1. Время жизни кэша (TTL) определяет как долго кэшируется запись
// Типичный TTL: 300 сек (5 минут), но может быть и часами

// 2. В HTML можно явно предзагрузить DNS:
// <link rel="dns-prefetch" href="//example.com" />

// 3. Или предпроверить соединение
// <link rel="preconnect" href="//api.example.com" />

// Пример оптимизации в Next.js
export default function Page() {
  return (
    <>
      <link rel="dns-prefetch" href="//cdn.example.com" />
      <link rel="preconnect" href="//api.example.com" />
      <div>Содержимое</div>
    </>
  );
}

Домены и подмены

// Полное доменное имя (FQDN):
// api.example.com
// ├── api (поддомен)
// ├── example (имя домена)
// └── com (TLD - Top Level Domain)

// Разные IP для разных поддоменов:
// example.com -> 93.184.216.34 (основной сервер)
// api.example.com -> 93.184.216.35 (API сервер)
// cdn.example.com -> 93.184.216.36 (CDN сервер)
// mail.example.com -> 93.184.216.37 (почтовый сервер)

// Получение поддомена
const getSubdomain = (hostname) => {
  const parts = hostname.split('.');
  if (parts.length > 2) {
    return parts[0];
  }
  return null;
};

console.log(getSubdomain('api.example.com')); // api
console.log(getSubdomain('example.com')); // null

Проблемы и решения

// 1. CORS и различные домены
// Если API на другом домене, нужен CORS
fetch('https://api.different-domain.com/data')
  .then(r => r.json())
  .catch(e => console.error('CORS ошибка'));

// 2. DNS кэширование может быть проблемой
// Решение: используй query параметры для кэш-бастинга
const timestamp = Date.now();
fetch(`https://api.example.com/data?t=${timestamp}`)
  .then(r => r.json());

// 3. Медленное разрешение DNS
// Решение: dns-prefetch в HTML head
// <link rel="dns-prefetch" href="//slow-cdn.example.com" />

// 4. DNS отказ в обслуживании (DNS amplification attack)
// Сервер должен иметь защиту, клиент не может помочь

DNS в контексте веб-приложений

// При разработке учитывай DNS:

// 1. Количество доменов влияет на производительность
// Слишком много доменов = много DNS запросов
const optimalDomains = 3; // основной + CDN + API

// 2. Используй разные домены для параллельных запросов
// (раньше браузеры ограничивали соединения на домен)
const fetchFromMultipleDomains = () => {
  return Promise.all([
    fetch('https://cdn1.example.com/resource1'),
    fetch('https://cdn2.example.com/resource2')
  ]);
};

// 3. Предзагрузка DNS для критичных сервисов
export function Head() {
  return (
    <>
      <link rel="dns-prefetch" href="//api.example.com" />
      <link rel="preconnect" href="//analytics.example.com" />
    </>
  );
}

Связь DNS и IP критична для понимания как работает интернет. DNS - это phonebook интернета, IP - это его адресная система.