Глубокий разбор 25 мин чтения

Что происходит, когда вы вводите URL в браузер?

Это один из самых популярных вопросов на технических собеседованиях. И один из самых интересных в Computer Science. Давайте пройдём весь путь от нажатия Enter до появления страницы.

Почему это важно знать?

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

Понимание этого процесса — не просто академическое знание. Это фундамент, на котором строится:

  • Оптимизация производительности — зная, где теряется время, вы можете ускорить свои сайты
  • Отладка сетевых проблем — когда что-то не работает, вы понимаете, где искать
  • Безопасность — понимание TLS и сертификатов защитит от атак
  • Архитектурные решения — CDN, кэширование, DNS — всё становится понятнее

Интересный факт

Этот вопрос задают на собеседованиях в Google, Facebook, Amazon и других tech-гигантах. Не потому что хотят услышать заученный ответ, а потому что глубина вашего понимания показывает уровень экспертизы.

Давайте разберём каждый шаг детально. Представьте, что вы вводите в браузер адрес https://example.com/page и нажимаете Enter. Что происходит дальше?

0 Нажатие клавиши Enter

Да, даже нажатие клавиши — это целый процесс! Когда вы нажимаете Enter:

  1. Механический контакт — клавиша замыкает электрическую цепь
  2. Сканирование матрицы — контроллер клавиатуры определяет, какая клавиша нажата
  3. USB/Bluetooth передача — скан-код отправляется в операционную систему
  4. Обработка ОС — драйвер клавиатуры преобразует скан-код в символ
  5. Событие в браузере — браузер получает событие keydown

Всё это занимает несколько миллисекунд. Браузер понимает, что пользователь хочет перейти по адресу, и начинается настоящая магия.

1 Парсинг URL

Первое, что делает браузер — разбирает (парсит) введённый URL на компоненты. URL (Uniform Resource Locator) — это не просто адрес, это структурированные данные:

https://example.com:443/page?query=1#section
│       │           │   │    │         │
│       │           │   │    │         └── Fragment (якорь)
│       │           │   │    │              Не отправляется на сервер!
│       │           │   │    │              Используется только браузером
│       │           │   │    │
│       │           │   │    └── Query string (параметры запроса)
│       │           │   │        Передаются серверу
│       │           │   │
│       │           │   └── Path (путь к ресурсу)
│       │           │        Какую страницу/файл запрашиваем
│       │           │
│       │           └── Port (порт)
│       │                443 для HTTPS, 80 для HTTP
│       │                Обычно скрыт, т.к. используются стандартные порты
│       │
│       └── Host (домен/хост)
│            Человекочитаемое имя сервера
│
└── Protocol/Scheme (протокол)
     http, https, ftp, file и т.д.

Проверка HSTS

Но перед тем как продолжить, браузер проверяет HSTS (HTTP Strict Transport Security). Это механизм безопасности, который говорит: "Этот сайт ВСЕГДА должен открываться через HTTPS".

Если вы ввели http:// для сайта с HSTS, браузер автоматически заменит на https://. Это защищает от атак типа "downgrade" — когда злоумышленник пытается заставить вас использовать незащищённое соединение.

Preloaded HSTS: Chrome, Firefox и другие браузеры имеют встроенный список доменов, которые ВСЕГДА должны использовать HTTPS. Туда входят Google, Facebook, Twitter и тысячи других сайтов.

А что если ввести что-то непонятное?

Если вы введёте "котики" вместо URL, браузер поймёт, что это не адрес, и перенаправит запрос в поисковую систему. Браузер проверяет:

  • Есть ли точка в строке? (признак домена)
  • Есть ли протокол (http://, https://)?
  • Похоже ли это на IP-адрес?
  • Есть ли пробелы? (поисковый запрос)

2 DNS Lookup — поиск IP-адреса

Компьютеры не понимают доменные имена вроде "example.com". Им нужны IP-адреса — числовые идентификаторы вида 93.184.216.34. DNS (Domain Name System) — это как телефонная книга интернета, которая переводит имена в адреса.

Каскад поиска

Браузер ищет IP-адрес в нескольких местах, начиная с самых быстрых:

  1. 1
    Кэш браузера

    Chrome хранит DNS записи ~60 секунд. Посмотреть можно на chrome://net-internals/#dns

  2. 2
    Кэш операционной системы

    Windows: ipconfig /displaydns, Linux: systemd-resolve --statistics

  3. 3
    Файл hosts

    Локальные записи. Windows: C:\Windows\System32\drivers\etc\hosts, Linux/Mac: /etc/hosts

  4. 4
    DNS-сервер роутера

    Ваш домашний роутер тоже кэширует DNS-запросы

  5. 5
    DNS-сервер провайдера (ISP)

    Если нет в кэше — начинается рекурсивный запрос

Рекурсивный DNS-запрос

Если IP-адрес нигде не закэширован, DNS-сервер провайдера начинает "расследование":

Запрос: example.com → ?

1. Спросить Root Server (.)
   "Кто отвечает за .com?"
   → "Иди к TLD-серверу .com (192.5.6.30)"

2. Спросить TLD Server (.com)
   "Кто отвечает за example.com?"
   → "Иди к Authoritative серверу (ns1.example.com)"

3. Спросить Authoritative Server
   "Какой IP у example.com?"
   → "93.184.216.34"

Ответ: example.com = 93.184.216.34

Интересный факт о корневых серверах

В мире существует ровно 13 "логических" корневых DNS-серверов (от a.root-servers.net до m.root-servers.net). Почему 13? Исторически это максимум, который помещался в один UDP-пакет (512 байт). Но физически их более 1500 — благодаря технологии Anycast один логический сервер может иметь сотни копий по всему миру.

DNS over HTTPS (DoH)

Традиционные DNS-запросы отправляются открытым текстом. Это значит, что ваш провайдер (и кто угодно на пути) видит, какие сайты вы посещаете.

Современные браузеры поддерживают DNS over HTTPS (DoH) — DNS-запросы шифруются и отправляются через HTTPS. Включить можно в настройках браузера (Firefox → Настройки → Сетевые настройки → DNS через HTTPS).

3 TCP Handshake — установка соединения

Теперь у браузера есть IP-адрес сервера. Но прежде чем отправить HTTP-запрос, нужно установить надёжное соединение. Для этого используется протокол TCP (Transmission Control Protocol).

Почему TCP, а не UDP?

В интернете есть два основных транспортных протокола:

TCP (Transmission Control Protocol)

  • ✓ Гарантирует доставку пакетов
  • ✓ Гарантирует порядок пакетов
  • ✓ Обнаруживает и исправляет ошибки
  • ✗ Медленнее из-за накладных расходов

UDP (User Datagram Protocol)

  • ✓ Очень быстрый
  • ✓ Минимальные накладные расходы
  • ✗ Не гарантирует доставку
  • ✗ Пакеты могут прийти не по порядку

Для веб-страниц важно получить ВСЕ данные в правильном порядке, поэтому используется TCP. UDP используется там, где скорость важнее надёжности: видеозвонки, онлайн-игры, DNS.

Трёхстороннее рукопожатие (3-way handshake)

TCP устанавливает соединение через три сообщения:

Client (ваш браузер)              Server (сайт)
        │                                   │
        │                                   │
   1.   │──── SYN (seq=1000) ──────────────▶│
        │     "Привет! Хочу соединиться"    │
        │     "Мой начальный номер: 1000"   │
        │                                   │
   2.   │◀──── SYN-ACK (seq=5000, ack=1001) │
        │     "Привет! Давай соединимся"    │
        │     "Мой номер: 5000"             │
        │     "Жду твой пакет 1001"         │
        │                                   │
   3.   │──── ACK (ack=5001) ───────────────▶│
        │     "Отлично! Жду твой 5001"      │
        │                                   │
        │    ═══ СОЕДИНЕНИЕ ОТКРЫТО ═══     │
        │                                   │

Почему три сообщения? Чтобы обе стороны убедились, что связь работает в обоих направлениях. SYN (synchronize) и ACK (acknowledge) — это флаги в TCP-пакетах.

RTT (Round-Trip Time): Это время, которое пакет тратит на путь туда-обратно. Для сервера в Европе — ~50-100мс, для США — ~150-200мс, для Австралии — ~300мс. TCP handshake занимает 1 RTT.

4 TLS Handshake — шифрование

Если мы используем HTTPS (а сегодня это ~95% веба), после TCP handshake начинается ещё одно "рукопожатие" — TLS (Transport Layer Security). Это протокол, который шифрует все данные между браузером и сервером.

Зачем шифровать?

Без TLS любой, кто находится между вами и сервером (провайдер, публичный Wi-Fi, хакер) может:

  • Читать ваши пароли и сообщения
  • Подменять контент страницы
  • Внедрять вредоносный код
  • Следить за вашей активностью

Этапы TLS Handshake

1

ClientHello

Браузер отправляет: поддерживаемые версии TLS (1.2, 1.3), список шифров, случайное число

2

ServerHello + Certificate

Сервер выбирает версию TLS и шифр, отправляет свой сертификат (публичный ключ + подпись центра сертификации)

3

Проверка сертификата

Браузер проверяет: не истёк ли сертификат? Совпадает ли домен? Подписан ли доверенным CA (Certificate Authority)?

4

Key Exchange

Браузер и сервер генерируют общий секретный ключ (обычно через ECDHE — Elliptic Curve Diffie-Hellman)

5

Finished

Обе стороны подтверждают, что шифрование работает. Все дальнейшие данные зашифрованы.

TLS 1.3 — быстрее и безопаснее

TLS 1.3 (2018) сократил handshake с 2 RTT до 1 RTT. А при повторном соединении возможен режим 0-RTT — данные отправляются сразу, без ожидания!

Также TLS 1.3 удалил устаревшие и небезопасные алгоритмы (MD5, SHA-1, RC4, DES).

5 HTTP Request — запрос к серверу

Наконец-то! Соединение установлено, шифрование настроено. Браузер отправляет HTTP-запрос:

GET /page HTTP/2
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: session=abc123; theme=dark
Cache-Control: max-age=0

Что означают эти заголовки?

GET /page HTTP/2

Метод (GET = получить), путь (/page), версия протокола

Host: example.com

Какой домен запрашиваем (важно для серверов с несколькими сайтами)

User-Agent

Информация о браузере и ОС. Сервер может отдавать разный контент разным браузерам

Accept-Encoding: gzip, deflate, br

Какие алгоритмы сжатия поддерживаем. br = Brotli (самый эффективный)

Cookie

Данные сессии, авторизации, настроек

HTTP/2 и HTTP/3

Современные браузеры используют HTTP/2 (2015) или HTTP/3 (2022):

  • Мультиплексирование — несколько запросов по одному соединению параллельно
  • Сжатие заголовков — HPACK/QPACK экономит трафик
  • Server Push — сервер может отправить файлы до того, как браузер их запросит
  • HTTP/3 использует QUIC (на базе UDP) вместо TCP — ещё быстрее!

6 Обработка на сервере

Запрос достиг сервера. Что происходит там?

  1. Load Balancer — распределяет запросы между серверами (если их несколько)
  2. Reverse Proxy (Nginx/Apache) — принимает соединение, может отдать статику из кэша
  3. Application Server — Node.js, Python, PHP, Java выполняют код
  4. Database — если нужны данные, сервер обращается к БД
  5. Cache (Redis/Memcached) — часто запрашиваемые данные кэшируются
  6. Template Engine — генерируется HTML

7 HTTP Response — ответ сервера

HTTP/2 200 OK
Content-Type: text/html; charset=utf-8
Content-Encoding: br
Content-Length: 45123
Cache-Control: max-age=3600
ETag: "abc123"
Set-Cookie: session=xyz789; Secure; HttpOnly
Strict-Transport-Security: max-age=31536000

<!DOCTYPE html>
<html>
  <head>
    <title>Example</title>
    <link rel="stylesheet" href="/style.css">
  </head>
  <body>
    <h1>Hello, World!</h1>
    <script src="/app.js"></script>
  </body>
</html>

Важные заголовки ответа

  • 200 OK — успешно. Другие коды: 301 (редирект), 404 (не найдено), 500 (ошибка сервера)
  • Content-Encoding: br — контент сжат алгоритмом Brotli
  • Cache-Control — как долго браузер может хранить ответ в кэше
  • ETag — "отпечаток" контента для проверки актуальности кэша
  • Strict-Transport-Security — HSTS, о котором говорили выше

8 Рендеринг страницы

HTML получен. Теперь самый сложный этап — браузер должен превратить текстовый код в красивую интерактивную страницу. Это называется Critical Rendering Path.

Этапы рендеринга

1

Parsing HTML → DOM

Браузер читает HTML и строит DOM (Document Object Model) — дерево элементов. Каждый тег становится узлом дерева.

2

Parsing CSS → CSSOM

CSS парсится в CSSOM (CSS Object Model). Вычисляются финальные стили для каждого элемента (каскад, специфичность, наследование).

3

DOM + CSSOM → Render Tree

Объединение в дерево рендеринга. Невидимые элементы (display: none, <head>) не включаются.

4

Layout (Reflow)

Вычисление точных размеров и позиций каждого элемента. Учитывается размер окна, шрифты, отступы.

5

Paint

Отрисовка пикселей: текст, цвета, изображения, тени, границы. Создаются слои (layers).

6

Composite

Объединение слоёв в правильном порядке (z-index). Отправка на GPU для отображения.

Блокирующие ресурсы

Некоторые ресурсы блокируют рендеринг:

  • CSS — браузер ждёт загрузки CSS, чтобы не показывать "голый" HTML
  • JavaScript (без async/defer) — блокирует парсинг HTML

Поэтому CSS ставят в <head>, а JavaScript — перед </body> или с атрибутами async/defer.

Сколько всё это занимает?

Давайте посчитаем для типичного сайта при соединении с сервером в 100мс (Европа):

Этап Время Накопленное
DNS Lookup (из кэша) ~1 мс 1 мс
TCP Handshake ~100 мс 101 мс
TLS Handshake (TLS 1.3) ~100 мс 201 мс
HTTP Request + Response ~150 мс 351 мс
Загрузка CSS/JS ~200 мс 551 мс
Рендеринг ~150 мс 701 мс
Итого до First Contentful Paint ~700-1000 мс

Вот почему производительность важна. Каждый шаг можно оптимизировать: CDN для уменьшения RTT, HTTP/2 для параллельных запросов, кэширование, сжатие, lazy loading.

Заключение

За простым действием "открыть сайт" скрывается удивительная сложность. Десятки протоколов, сотни миллисекунд ожидания, миллионы строк кода в браузере — всё это работает каждый раз, когда вы нажимаете Enter.

И это мы ещё не затронули: Service Workers, HTTP Caching, Content Negotiation, WebSockets, Preload/Prefetch, Critical CSS, Code Splitting...

Понимание этого процесса отличает новичка от профессионала. Теперь вы знаете, что происходит "под капотом" — используйте это знание для создания быстрых и надёжных веб-приложений!