Что происходит после отправления запроса в браузере
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что происходит после отправки запроса в браузере: полный цикл от клика до рендеринга
Этот процесс, известный как "путь критического рендеринга" (Critical Rendering Path), представляет собой сложную цепочку событий, включающую сетевые протоколы, обработку браузером и рендеринг. Вот детальное пошаговое объяснение.
1. Парсинг URL и проверка кеша
Когда пользователь нажимает Enter или кликает по ссылке, браузер сначала анализирует URL (протокол, домен, путь, параметры). Перед любым сетевым запросом проверяются кеши:
- Кеш браузера (Memory/Disk Cache): Ищется кешированная версия ресурса (HTML, CSS, JS, изображения) с учетом заголовков
Cache-Control,ETag,Last-Modified. Если найден свежий кеш, ресурс загружается мгновенно, минуя сеть. - Кеш DNS: Проверяется, разрешён ли домен недавно, чтобы избежать повторного DNS-запроса.
2. DNS-запрос (разрешение доменного имени)
Если домен не закэширован, происходит DNS-резолвинг:
# Упрощённый пример цепочки запросов:
Браузер → Кеш ОС → Резолвер провайдера → Корневые серверы (.)
→ Серверы домена верхнего уровня (.com) → Авторитативные серверы домена
Браузер получает IP-адрес сервера (например, 142.250.185.78 для google.com).
3. Установка TCP-соединения и TLS-рукопожатие
Браузер устанавливает надежное соединение с сервером:
- TCP handshake (трёхстороннее рукопожатие):
SYN → SYN-ACK → ACK. Для HTTPS добавляется этап TLS handshake (обмен сертификатами, согласование шифрования), что увеличивает задержку.
# Псевдокод установки соединения
def establish_connection(ip, port=443):
send_syn() # Шаг 1: SYN
receive_syn_ack() # Шаг 2: SYN-ACK
send_ack() # Шаг 3: ACK
if https:
perform_tls_handshake() # Обмен ключами
return connection
4. Отправка HTTP-запроса и получение ответа
После установки соединения браузер отправляет HTTP-запрос:
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml
Cookie: session_id=abc123
Сервер обрабатывает запрос (обращается к бэкенду, БД) и возвращает HTTP-ответ:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Cache-Control: max-age=3600
Content-Length: 1256
<!DOCTYPE html><html>...</html>
При кодах перенаправления (3xx) браузер повторяет запрос по новому URL.
5. Парсинг HTML и построение DOM
Браузер начинает обрабатывать ответ:
- Токенизация HTML: Поток байтов декодируется в символы, разбивается на токены (теги, атрибуты, текст).
- Построение DOM (Document Object Model): Токены преобразуются в узлы дерева, связанные иерархически (родитель-потомок).
// Пример DOM-структуры для <html><body><h1>Hello</h1></body></html>
document
└── html
└── body
└── h1
└── textNode("Hello")
- Загрузка внешних ресурсов: При встрече
<link>,<script>,<img>браузер параллельно запрашивает CSS, JS, изображения.
6. Обработка CSS и построение CSSOM
CSS-файлы парсятся в CSSOM (CSS Object Model) — дерево стилей с учётом каскада, специфичности и наследования. CSSOM блокирует рендеринг (Render-Blocking), поэтому оптимизация CSS критична.
7. Выполнение JavaScript
Обычные (не async/defer) скрипты блокируют парсинг HTML, так как могут изменять DOM/CSSOM. Браузер приостанавливает построение DOM до загрузки и выполнения скрипта. Механизм V8/SpiderMonkey компилирует и выполняет JS.
8. Формирование Render Tree и Layout
Браузер комбинирует DOM и CSSOM в Render Tree — содержит только видимые элементы (без display: none, <head>). Затем происходит Layout (Reflow) — расчёт точных позиций и размеров каждого элемента в окне браузера с учётом вьюпорта, медиа-запросов.
9. Рисование (Painting) и Композиция (Composition)
- Paint: Render Tree разбивается на слои, каждый слой рисуется отдельно (растеризация) в пиксели (заполнение цветом, текст, тени).
- Composite: Слои объединяются в окончательное изображение с учётом трансформаций (CSS
transform,opacity). GPU ускоряет композицию.
10. Отображение и последующие события
Готовый кадр передаётся на отображение (Display). После загрузки страницы запускаются события:
DOMContentLoaded— DOM готов, но ресурсы (изображения) могут ещё грузиться.load— полностью загружены все ресурсы.
Факторы, влияющие на производительность
- Сетевая задержка: RTT, количество доменов (CDN), HTTP/2 vs HTTP/1.1.
- Оптимизации рендеринга: Минификация, сжатие (gzip/Brotli), ленивая загрузка (Lazy Loading),
async/deferдля скриптов. - Блокирующие ресурсы: CSS в
<head>, скрипты без атрибутовasync/defer.
Для QA-инженера понимание этого цикла критично для:
- Планирования тестов производительности и скорости загрузки.
- Анализа проблем кроссбраузерности (разные движки рендеринга).
- Отладки сетевых проблем и таймаутов.
- Тестирования кеширования и поведения при слабом интернете.