← Браузер/DNS и HTTP протокол#174 из 383← ПредыдущийСледующий →+15 XP
Полезно по теме:Гайд: как учить JavaScriptПрактика: async и сетьТермин: Event LoopТермин: Core Web Vitals

DNS и HTTP протокол

Интернет держится на двух незаметных, но критически важных системах: DNS переводит имена в адреса, а HTTP задаёт язык общения между клиентом и сервером. Понимание этих механизмов помогает писать более быстрые и надёжные приложения.

DNS в деталях

DNS (Domain Name System) — это распределённая база данных имён. Когда ты вводишь vk.com, происходит рекурсивный поиск: браузер → локальный кэш → резолвер провайдера → корневые DNS-серверы → серверы доменной зоны (.com) → авторитетный сервер vk.com.

Основные типы DNS-записей:

  • A — имя → IPv4-адрес (например, vk.com → 87.240.129.133)
  • AAAA — имя → IPv6-адрес
  • CNAME — псевдоним для другого имени (www.example.com → example.com)
  • MX — сервер электронной почты
  • Каждая запись имеет TTL (Time To Live) — время жизни в кэше в секундах. Типичный TTL — от 300 до 3600 секунд. Когда ты меняешь DNS-записи, изменения распространяются по интернету именно столько времени.

    HTTP/1.1 vs HTTP/2 vs HTTP/3

    HTTP/1.1 (1997) — один запрос за раз на одном соединении. Браузеры обходили это ограничение, открывая 6 параллельных соединений на домен.

    HTTP/2 (2015) — мультиплексирование: много запросов через одно соединение одновременно. Бинарный протокол вместо текстового. Server Push — сервер сам отправляет ресурсы до запроса.

    HTTP/3 (2022) — работает поверх QUIC вместо TCP. QUIC использует UDP и встраивает шифрование прямо в транспортный слой. Лучше работает при потере пакетов и смене сети (например, когда переходишь с Wi-Fi на мобильный).

    Большинство крупных сайтов уже используют HTTP/2 или HTTP/3. Это заметно ускоряет загрузку при большом количестве ресурсов.

    HTTP-методы

  • GET — получить ресурс. Данные в URL. Идемпотентный (повторный запрос = тот же результат)
  • POST — создать ресурс. Данные в теле запроса
  • PUT — полностью заменить ресурс
  • PATCH — частично обновить ресурс
  • DELETE — удалить ресурс
  • HEAD — как GET, но только заголовки без тела (полезно для проверки существования ресурса)
  • Структура запроса и ответа

    Запрос состоит из: строки запроса (метод, путь, версия), заголовков, пустой строки и опционального тела.

    Заголовки содержат мета-информацию: Content-Type: application/json говорит серверу, что тело запроса — это JSON. Authorization: Bearer token — токен авторизации. Accept: application/json — какой формат ответа ты принимаешь.

    Коды статуса HTTP

  • 2xx — успех: 200 OK, 201 Created, 204 No Content
  • 3xx — перенаправление: 301 Moved Permanently, 302 Found, 304 Not Modified
  • 4xx — ошибка клиента: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 429 Too Many Requests
  • 5xx — ошибка сервера: 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable
  • Важно: fetch() не бросает исключение при 4xx/5xx-ошибках — нужно проверять response.ok или response.status вручную.

    Определение версии HTTP

    Resource Timing API позволяет определить, по какому протоколу загрузился ресурс: свойство nextHopProtocol вернёт "h2" для HTTP/2 или "h3" для HTTP/3. Это можно использовать для мониторинга и отладки.

    Примеры

    POST-запрос с JSON, обработка статусов, определение версии HTTP

    // POST-запрос: отправляем данные на сервер
    async function createPost(title, body) {
      const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',  // говорим серверу, что шлём JSON
          'Accept': 'application/json',        // хотим получить JSON в ответ
        },
        body: JSON.stringify({ title, body, userId: 1 }),
      })
    
      // fetch НЕ бросает ошибку при 4xx/5xx — проверяем вручную
      if (!response.ok) {
        throw new Error(`Ошибка сервера: ${response.status} ${response.statusText}`)
      }
    
      return response.json()
    }
    
    const post = await createPost('Тест', 'Тело поста')
    console.log('Создан пост с ID:', post.id)  // 101
    
    // Определяем версию HTTP через Resource Timing API
    // Ждём немного, чтобы запись появилась в буфере
    setTimeout(() => {
      const entries = performance.getEntriesByType('resource')
      entries.forEach(entry => {
        if (entry.name.includes('jsonplaceholder')) {
          console.log('Протокол:', entry.nextHopProtocol)  // h2 или http/1.1
          console.log('Размер ответа:', entry.transferSize, 'байт')
        }
      })
    }, 100)

    DNS и HTTP протокол

    Интернет держится на двух незаметных, но критически важных системах: DNS переводит имена в адреса, а HTTP задаёт язык общения между клиентом и сервером. Понимание этих механизмов помогает писать более быстрые и надёжные приложения.

    DNS в деталях

    DNS (Domain Name System) — это распределённая база данных имён. Когда ты вводишь vk.com, происходит рекурсивный поиск: браузер → локальный кэш → резолвер провайдера → корневые DNS-серверы → серверы доменной зоны (.com) → авторитетный сервер vk.com.

    Основные типы DNS-записей:

  • A — имя → IPv4-адрес (например, vk.com → 87.240.129.133)
  • AAAA — имя → IPv6-адрес
  • CNAME — псевдоним для другого имени (www.example.com → example.com)
  • MX — сервер электронной почты
  • Каждая запись имеет TTL (Time To Live) — время жизни в кэше в секундах. Типичный TTL — от 300 до 3600 секунд. Когда ты меняешь DNS-записи, изменения распространяются по интернету именно столько времени.

    HTTP/1.1 vs HTTP/2 vs HTTP/3

    HTTP/1.1 (1997) — один запрос за раз на одном соединении. Браузеры обходили это ограничение, открывая 6 параллельных соединений на домен.

    HTTP/2 (2015) — мультиплексирование: много запросов через одно соединение одновременно. Бинарный протокол вместо текстового. Server Push — сервер сам отправляет ресурсы до запроса.

    HTTP/3 (2022) — работает поверх QUIC вместо TCP. QUIC использует UDP и встраивает шифрование прямо в транспортный слой. Лучше работает при потере пакетов и смене сети (например, когда переходишь с Wi-Fi на мобильный).

    Большинство крупных сайтов уже используют HTTP/2 или HTTP/3. Это заметно ускоряет загрузку при большом количестве ресурсов.

    HTTP-методы

  • GET — получить ресурс. Данные в URL. Идемпотентный (повторный запрос = тот же результат)
  • POST — создать ресурс. Данные в теле запроса
  • PUT — полностью заменить ресурс
  • PATCH — частично обновить ресурс
  • DELETE — удалить ресурс
  • HEAD — как GET, но только заголовки без тела (полезно для проверки существования ресурса)
  • Структура запроса и ответа

    Запрос состоит из: строки запроса (метод, путь, версия), заголовков, пустой строки и опционального тела.

    Заголовки содержат мета-информацию: Content-Type: application/json говорит серверу, что тело запроса — это JSON. Authorization: Bearer token — токен авторизации. Accept: application/json — какой формат ответа ты принимаешь.

    Коды статуса HTTP

  • 2xx — успех: 200 OK, 201 Created, 204 No Content
  • 3xx — перенаправление: 301 Moved Permanently, 302 Found, 304 Not Modified
  • 4xx — ошибка клиента: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 429 Too Many Requests
  • 5xx — ошибка сервера: 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable
  • Важно: fetch() не бросает исключение при 4xx/5xx-ошибках — нужно проверять response.ok или response.status вручную.

    Определение версии HTTP

    Resource Timing API позволяет определить, по какому протоколу загрузился ресурс: свойство nextHopProtocol вернёт "h2" для HTTP/2 или "h3" для HTTP/3. Это можно использовать для мониторинга и отладки.

    Примеры

    POST-запрос с JSON, обработка статусов, определение версии HTTP

    // POST-запрос: отправляем данные на сервер
    async function createPost(title, body) {
      const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',  // говорим серверу, что шлём JSON
          'Accept': 'application/json',        // хотим получить JSON в ответ
        },
        body: JSON.stringify({ title, body, userId: 1 }),
      })
    
      // fetch НЕ бросает ошибку при 4xx/5xx — проверяем вручную
      if (!response.ok) {
        throw new Error(`Ошибка сервера: ${response.status} ${response.statusText}`)
      }
    
      return response.json()
    }
    
    const post = await createPost('Тест', 'Тело поста')
    console.log('Создан пост с ID:', post.id)  // 101
    
    // Определяем версию HTTP через Resource Timing API
    // Ждём немного, чтобы запись появилась в буфере
    setTimeout(() => {
      const entries = performance.getEntriesByType('resource')
      entries.forEach(entry => {
        if (entry.name.includes('jsonplaceholder')) {
          console.log('Протокол:', entry.nextHopProtocol)  // h2 или http/1.1
          console.log('Размер ответа:', entry.transferSize, 'байт')
        }
      })
    }, 100)

    Задание

    Напиши функцию sendRequest(method, url, data), которая делает запрос с указанным методом. Если method === "POST", отправь data как JSON в теле запроса с правильным Content-Type. Верни объект { status, ok, data } — где data это распарсенный JSON ответа.

    Подсказка

    Content-Type для JSON — это "application/json". Для тела запроса используй JSON.stringify(data). response.ok — это булево значение true при статусах 200-299.

    Загружаем среду выполнения...
    Загружаем AI-помощника...