HTTP и DNS — как устроен интернет

Разбираемся, что происходит в ту самую секунду, когда вы нажимаете Enter в адресной строке: от IP-адресов и работы DNS до HTTP-запроса, ответа сервера, cookies и HTTPS. Это фундамент для любого веб-разработчика.

Уровень: начальный 19 разделов 2–3 часа

1. Как работает интернет

Интернет — это не одна сеть, а миллионы компьютеров, соединённых друг с другом. Когда вы открываете сайт, браузер отправляет запрос, который прыгает по цепочке маршрутизаторов, пока не доберётся до сервера с нужным сайтом. Ответ возвращается по той же схеме.

# упрощённый путь запроса
Ваш браузер → ваш роутер → провайдер →
городской узел → сервер сайта
→ ответ возвращается обратно тем же маршрутом
УчастникРоль в сетиПример
Клиентотправляет запросыбраузер Chrome, мобильное приложение
Серверхранит данные и отвечаетхостинг с вашим сайтом
Маршрутизаторпередаёт пакеты между сетямиоборудование провайдера
DNSпереводит имя в IP-адрессерверы, обслуживающие домен site.ru
Для веб-разработки не нужно знать устройство каждого маршрутизатора. Достаточно модели «клиент — сервер»: браузер (клиент) просит, сервер отвечает.

2. IP-адреса и порты

Каждое устройство в сети получает IP-адрес — уникальный номер, по которому к нему можно обратиться. Сейчас сосуществуют два стандарта:

На одной машине может жить сотня сайтов, и различает их порт — служебное число. Стандартный порт для HTTP — 80, для HTTPS — 443.

# адрес глазами сети
http://    192.168.0.10   :8080   /index.html
   ↑          ↑           ↑         ↑
 протокол   IP-адрес     порт     путь
Запись 127.0.0.1 (localhost) — это сам ваш компьютер. Запустили сервер локально? Почти наверняка он доступен по адресу localhost:3000 или localhost:8000.
Не путайте локальный IP (внутри вашей сети) с публичным. Публичный адрес выдаёт провайдер, и только через него к вам дотянутся из интернета — например, если вы хотите показать другу свой сервер.

3. DNS — «телефонная книга» интернета

Запоминать IP-адреса неудобно, поэтому придумали доменные имена. За превращение имени site.ru в адрес 77.88.55.77 отвечает DNS (Domain Name System) — распределённая база данных записей.

# что происходит при вводе site.ru
1. Браузер спрашивает DNS: «какой IP у site.ru?»
2. DNS отвечает: 77.88.55.77
3. Браузер идёт по адресу и отправляет HTTP-запрос
4. Ответ кешируется на несколько секунд или минут

# проверить вручную (Linux/macOS)
dig site.ru
nslookup site.ru
Тип записиЧто обозначаетПример значения
Aимя → IPv4site.ru → 77.88.55.77
AAAAимя → IPv6site.ru → 2001:db8::1
CNAMEимя → другое имяwww.site.ru → site.ru
MXкуда доставлять почтуsite.ru → mail.hosting.ru
DNS-изменения распространяются не мгновенно: пока часть сети кеширует старые данные, некоторые пользователи ещё видят старый сервер. Обычно это занимает от минут до 48 часов.

4. URL — анатомия адреса

URL (Uniform Resource Locator) — полный адрес ресурса. Он состоит из нескольких частей, и каждая влияет на то, куда и с чем уйдёт запрос:

https://example.com:443/products?page=2&sort=price#top
   ↑        ↑          ↑     ↑        ↑            ↑
 протокол  домен     порт   путь  query-строка   якорь
Символ & в HTML-коде страницы записывают как &, чтобы браузер не принял его за начало сущности.
Регистр имеет значение: /Products и /products могут оказаться разными ресурсами. Договаривайтесь на нижний регистр и дефисы.

5. HTTP-запрос и ответ

Всё общение браузера с сервером — это обмен текстовыми сообщениями по протоколу HTTP. Запрос состоит из стартовой строки, заголовков и (иногда) тела. Ответ — из статус-кода, заголовков и тела.

// запрос
GET /products HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html

// ответ
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 523

<!DOCTYPE html>
<html>...</html>
Учить синтаксис наизусть не обязательно. Важна логика: стартовая строка задаёт действие, заголовки — детали, тело — сама страница или данные.

6. Методы HTTP

Один и тот же ресурс может означать разные операции в зависимости от метода запроса. Самые частые методы:

МетодДействиеПример
GETполучить данныеGET /products
POSTсоздать ресурсPOST /products
PUTполностью заменитьPUT /products/7
PATCHчастично обновитьPATCH /products/7
DELETEудалитьDELETE /products/7
# самодостаточные примеры через curl
curl -X GET  https://example.com/products
curl -X POST -d '{"title":"Телефон"}' https://example.com/products
curl -X PUT  -d '{}' https://example.com/products/7
GET не должен менять состояние сервера. Если по GET что-то удаляется или записывается — это почти всегда ошибка в архитектуре приложения.

7. Коды статусов

Первая строка ответа содержит трёхзначный код. По нему клиент понимает, что произошло, ещё до чтения тела:

2xx — успех
  200 OK                 # всё хорошо
  201 Created            # создано (после POST)
  204 No Content         # успех без тела

3xx — перенаправления
  301 Moved Permanently  # переехало навсегда
  302 Found              # временный редирект

4xx — ошибка клиента
  400 Bad Request        # запрос некорректен
  401 Unauthorized       # нужна авторизация
  403 Forbidden          # нет прав
  404 Not Found          # нет такого адреса

5xx — ошибка сервера
  500 Internal Server Error  # упал сервер
  503 Service Unavailable    # временно недоступен
ДиапазонЧто значит для разработчика
2xxуспех, обрабатываем тело ответа
3xxредирект, браузер обычно переходит сам
4xxошибка запроса — показываем «не найдено» или форму
5xxсломался сервер — сообщаем и просим попробовать позже
Признак аккуратного фронтенда — разная реакция на диапазоны: 4xx не «ломают» интерфейс, а 5xx показываются как временная проблема.

8. Заголовки

Заголовки — это служебные пары «имя: значение», которые передают метаданные: тип данных, правила кеширования, сведения об авторизации.

// заголовки запроса
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/json
Authorization: Bearer eyJhbGciOi…

// заголовки ответа
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=3600
Set-Cookie: session=abc123; Path=/; HttpOnly
ЗаголовокНазначение
Content-Typeкакие данные в теле (HTML, JSON, картинка)
Cache-Controlсколько времени кешировать ответ
Authorizationкто вы: токен для доступа к закрытым ресурсам
Set-Cookieсервер просит браузер сохранить cookie
В ответ сервер может прислать свои заголовки для диагностики. Параметры отладки легко посмотреть в DevTools — подробнее в разделе 11.

9. Cookies и сессии

HTTP сам по себе не помнит пользователя. Чтобы «запомнить», что вы вошли, сервер отправляет cookie — маленькую запись, которую браузер сохраняет и возвращает при каждом следующем запросе.

// сервер выдаёт cookie при входе
HTTP/1.1 200 OK
Set-Cookie: session=eyJ1c2VyIjoxfQ; HttpOnly; SameSite=Lax

// браузер возвращает её в следующих запросах
GET /account HTTP/1.1
Cookie: session=eyJ1c2VyIjoxfQ
Не храните в cookie пароли и секреты. Токены тоже лучше держать в httpOnly-cookie, а не в localStorage, иначе внедрённый скрипт сможет их украсть.
Флаг SameSite=Lax снижает риск CSRF-атак — запросов с чужих сайтов, несущих вашу cookie.

10. HTTPS и TLS — почему «замочек» важен

HTTP передаёт данные в открытом виде: любой узел в цепочке может их прочитать. HTTPS — это тот же HTTP, но поверх зашифрованного канала TLS. Даже пароли становятся нечитаемыми для перехватчика.

# как клиент и сервер договариваются
1. Клиент: «я хочу защищённое соединение»
2. Сервер: «вот мой сертификат (открытый ключ + подпись)»
3. Клиент проверяет сертификат у центра сертификации
4. Стороны обмениваются ключами и дальше всё шифруется
HTTPHTTPS
Шифрованиенетесть (TLS)
Порт по умолчанию80443
Опасность перехватавысокаяданные нечитаемы
Для SEOплохопозитив; браузеры ругаются на http
Бесплатные сертификаты Let's Encrypt — стандарт де-факто. «Покупать сертификат» нужно только в редких корпоративных случаях.

11. HTTP/2, HTTP/3 и DevTools Network

Протокол эволюционирует: HTTP/2 грузит много ресурсов параллельно по одному соединению, HTTP/3 работает поверх быстрого транспорта QUIC. Для разработчика это в основном прозрачно, но страницы становятся быстрее, а в DevTools хорошо видно, где тратилось время.

// открыть: F12 → вкладка Network → Ctrl+R
// что смотреть
Name       — какой файл загружался
Status     — код ответа (200/304/404…)
Size       — объём переданного
Time       — сколько ждали
Водопад    — фазы: ожидание, DNS, соединение, ответ
Что ищемТипичная причина
Красный 404 на ресурсбитая ссылка на файл
Огромное Timeмедленный сервер или тяжёлая картинка
Слишком много запросовнеоптимизированный JS/шрифты
Запросы не приходятблокировка CORS или отключённый ресурс
Включите «Preserve log», чтобы запросы сохранялись между перезагрузками — незаменимо при разборе редиректов, когда промежуточные запросы «теряются».

12. Кеширование и ETag

Кеширование избавляет сервер от повторной работы: браузер хранит копию ответа и не ходит за ней, пока кэш свеж. Управляется это заголовками Cache-Control, ETag и Last-Modified.

// сервер разрешает кэшировать ответ на час
Cache-Control: max-age=3600

// браузер спрашивает: ресурс изменился?
GET /app.js HTTP/1.1
If-None-Match: "abc123"

// сервер: не изменился — 304 без тела
HTTP/1.1 304 Not Modified
ЗаголовокРоль
Cache-Controlразрешено ли и как долго кэшировать
ETagверсия ресурса для проверки изменений
Last-Modifiedдата последнего изменения
Статику кэшируют агрессивно, HTML и API — осторожно. Неверно поставленный «no-cache» быстрее всего ломает обновления сайта.
Проверяйте кэш в DevTools Network: пометка «(from disk cache)» в колонке Size означает, что сеть не использовалась.

13. CORS: кросс-доменные запросы

Браузер запрещает странице напрямую обращаться к API другого домена. Этот механизм называется Same-Origin Policy, а исключения для конкретных доменов настраиваются заголовками CORS (Cross-Origin Resource Sharing).

// сервер API разрешает фронтенд-домену читать ответ
Access-Control-Allow-Origin: https://front.example.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
CORS — браузерная защита, а не серверная. curl и боты CORS не подчиняются: реальную защиту API дают авторизация и лимиты запросов.
Ошибка CORS в консоли выглядит пугающе, но обычно лечится за минуту: добавьте домен в список разрешённых origin на сервере.

14. Схемы авторизации в HTTP

Разные API по-разному узнают «кто вы». Простейшая схема — Basic (логин и пароль в заголовке), распространённая среди API — Bearer-токен (JWT), а классический веб чаще опирается на session-cookie из раздела 9.

// Basic: base64(логин:пароль)
Authorization: Basic dXNlcjpwYXNz

// Bearer: токен, полученный на POST /login
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...

// cookie-сессия: браузер отправляет сам
Cookie: session=abc123
СхемаГде используетсяОсобенность
Basicпростое API, логированиетолько поверх HTTPS
BearerSPA, мобильные приложенияхранение токена — отдельная забота
Cookieклассический вебзащита флагом HttpOnly
Basic без HTTPS равносилен открытой отправке пароля. Токены и cookie передавайте только по зашифрованному каналу.

15. WebSockets: постоянные соединения

HTTP подходит для сценария «спросил — получил», но чатам и биржевым котировкам нужен постоянный канал. Протокол WebSocket открывает его: сервер сам отправляет данные, не дожидаясь запроса.

const ws = new WebSocket("wss://chat.example.com");
ws.onmessage = (e) => console.log("новое:", e.data);
ws.send("привет");
Различайте три сценария: REST — запрос-ответ, SSE — сервер шлёт поток, WebSocket — двусторонний обмен.
Практика REST API — в курсе REST API, а WebSocket проще всего увидеть «вживую» в простом чат-приложении.

16. Диагностика трафика: DevTools и curl

Когда запрос «не работает», первый инструмент — вкладка Network в DevTools: статус, тайминги, куки, заголовки запроса и ответа каждого ресурса.

# быстрый взгляд на статус из терминала
curl -I https://example.com
curl -v https://example.com   # весь диалог
ВкладкаЧто показывает
Headersзаголовки запроса и ответа
Previewразобранный JSON/HTML
Timingкакая фаза заняла время
Initiatorкто «вызвал» запрос

Тайминги делятся на Waiting (TTFB) — время до первого байта, и Download — передача тела. Медленный TTFB — проблема сервера, медленный Download — сети/контента.

Сохраняйте запрос как HAR-файл (экспорт в DevTools) — он воспроизводит всю сессию для коллеги или для теста.
Вкладка Network показывает только браузерные запросы. Слушайте трафик и с фоновых приложений через профайлер (или curl) — браузер многое прячет.

17. Изменяемые клиентом данные и методы в реальности

Методы редко используются «в чистом виде». Ключевые нюансы, которые ловят на практике:

# повторный PUT безопасен: файл тот же
PUT /users/42  {"name":"Иван"}
Проектируйте API так, чтобы DELETE и PUT можно было вызывать повторно без побочных эффектов — это упрощает клиенты и ретраи.
Некоторые прокси и фреймворки преобразуют POST в GET при редиректах. Возвращайте 201/200 с нужным статусом явно.
Проектирование нормального REST API разобрано в курсе REST API.

18. Заголовки безопасности: HSTS, CSP, X-Frame-Options

Сервер может принудительно укрепить браузер заголовками — это почти бесплатная защита. Ключевые:

Strict-Transport-Security: max-age=31536000
Content-Security-Policy: default-src 'self'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
ЗаголовокЗащищает от
HSTSсниффинга HTTPS → HTTP
CSPXSS и инъекций ресурсов
X-Frame-Optionsкликджекинга
Включайте CSP постепенно: сначала режим report-only, потом enforce. Резкая политика «ломает» виджеты.
CSP со «звёздочками» даёт ложное чувство безопасности. Перечисляйте точные домены и только те директивы, что реально нужны.
Полный лист угроз и практик — в курсе OWASP.

19. HTTP/2 и HTTP/3: мультиплексирование и QUIC

Современные протоколы убирают главные задержки HTTP/1.1: параллельные запросы и повторные подключения.

# проверка версии протокола
curl -sI https://example.com | grep -i http2
# h2  → HTTP/2, h3 → HTTP/3

HTTP/2 мультиплексирует потоки по одному соединению и сжимает заголовки (HPACK). HTTP/3 работает поверх UDP (QUIC), что обходит блокировки TCP и ускоряет переключение сетей.

Проверяйте протокол через curl и сервисы «HTTP/2 Test». Если сайт на HTTP/1.1 — включите шифрование, HTTP/2 требует HTTPS.
Продвижение на HTTP/3 требует поддержки на CDN и браузерах: настраивайте как опцию, а не как обязательную зависимость.

20. Загрузка файлов: multipart/form-data

Передать файл по HTTP нельзя одним текстовым телом: нужен составной формат, в котором бинарные части идут отдельными блоками со своими заголовками — это multipart/form-data.

curl -F "photo=@cat.png" -F "caption=Мой кот" \
  https://api.example.com/upload

--boundary123
Content-Disposition: form-data; name="photo"; filename="cat.png"
Content-Type: image/png
...бинарные байты файла...
--boundary123--
Многие API требуют именно multipart даже для одиночного файла — сверяйтесь с документацией: имя поля (part name) критично.
Ограничивайте размер загрузки на сервере (client_max_body_size в Nginx): иначе злоумышленник завалит диск гигабайтами через пару запросов.

21. Server-Sent Events и long-polling: сервер вещает

Не всё общение требует полного дуплекса. Для лент новостей, курсов валют и статусов задач подходят односторонние потоки — сервер толкает данные, клиент просто слушает.

// сервер отправляет поток
Content-Type: text/event-stream
data: {"price": 92.4}
id: 3
retry: 5000

// клиент
const es = new EventSource('/prices');
es.onmessage = (e) => render(JSON.parse(e.data));
SSE поверх HTTP/2 почти бесплатен по ресурсам и проще в балансировке, чем WebSocket — выбирайте его, когда достаточно «вещания».
Long-polling при многих клиентах плодит тысячи зависших соединений: следите за лимитами connection_timeout и keepalive на сервере.

22. Прокси и балансировка: X-Forwarded-заголовки

Между клиентом и приложением почти всегда стоят прокси: CDN, балансировщик, Nginx-фронт. Приложение видит их IP, а не клиента — если не передать нужные заголовки.

# Nginx: проброс реальных данных клиента
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
Схема «2×2»: Nginx-фронт → два экземпляра приложения — стандартный старт для отказоустойчивости без сложных балансировщиков.
Forwarded-заголовки нельзя брать на веру: без настройки «доверенных прокси» злоумышленник подменой этого заголовка обойдёт лимиты и гео-фильтры.

23. Сжатие и range-запросы: доставка больших файлов

Тяжёлые видео и архивы требуют двух техник: сжатия текста на лету (gzip/brotli) и частичной отдачи через range-запросы, чтобы докачка не качала файл заново.

Accept-Encoding: gzip, br          # клиент
Content-Encoding: gzip             # ответ сервера

Range: bytes=0-1023                # часть файла
Content-Range: bytes 0-1023/1048576
Включайте brotli для текстовых типов — выигрыш в несколько раз для JS, а range проверяйте запросом curl -H "Range: bytes=0-1023".
Отдавая заранее сжатые копии статики (precompressed), вы снижаете нагрузку CPU на каждой сжатие на лету — на высоких нагрузках это критично.

Что дальше

Теперь, когда ясна схема «запрос → ответ», открой DevTools и разбери загрузку любого сайта. Дальше изучи REST API — как современные бэкенды договариваются о данных, узнай, как вывести сайт в интернет, в уроке Хостинг и деплой, а почему сайт должен быть ещё и быстрым — в SEO и Chrome DevTools.

← Вернуться к курсам