Браузерная архитектура: процессы, потоки, сеть
Современный браузер — это не один процесс, а сложная многопроцессная система, где каждый сайт изолирован в собственном renderer-процессе. Понимание этой архитектуры объясняет, почему одни операции дороги, а другие выполняются без участия основного потока, а также как страница попадает с сервера в браузер.
Детали превращения HTML в пиксели — DOM, CSSOM, Render Tree, Layout, Paint, Composite,
async/defer— разобраны в разделе HTML и CSS. Здесь фокус на процессах, потоках и сети.
Содержание
- Процессы, потоки и Site Isolation
- Что происходит при вводе URL в браузер
- TTFB (Time To First Byte)
- От HTML к пикселям: связь с рендерингом
- Ключевые тезисы для интервью
- Заключение
1. Процессы, потоки и Site Isolation
Архитектура процессов браузера
Современный браузер — это не один процесс, а сложная многопроцессная система, построенная по принципу минимизации привилегий и песочницы (sandbox). Каждый компонент работает изолированно, чтобы ошибка или уязвимость в одном модуле не привела к компрометации всего браузера или системы пользователя.
Основные процессы:
- Browser Process (Главный/Браузерный процесс) — управляет UI браузера, навигацией, закладками, сетевыми запросами, хранилищами (cookies, localStorage, IndexedDB) и взаимодействием с ОС. В Chromium-based браузерах этот процесс имеет повышенные привилегии по сравнению с renderer-процессами.
- Renderer Process — отвечает за парсинг HTML/CSS, выполнение JavaScript, построение DOM/CSSOM, layout, paint и композитинг конкретной вкладки или фрейма.
- GPU Process — обрабатывает графические операции, композитинг слоёв, растеризацию и взаимодействует с драйвером видеокарты через OpenGL/Vulkan/Direct3D.
- Extension Process — изолирует расширения браузера, чтобы уязвимость в одном расширении не затрагивала остальные части браузера.
- Utility Process — выполняет вспомогательные задачи: audio service, network service, storage service, notifications и др.
- Plugin Process / Network Service Process — в современных браузерах некоторые подсистемы (например, сетевой стек) могут работать в отдельных процессах.
┌───────────────────────────────┐
│ Browser Process │
│ UI · Network · Storage │
└───────────────┬───────────────┘
│ IPC
┌───────┴───────┐
▼ ▼
┌───────────────┐ ┌───────────────┐
│Renderer Proc 1│ │Renderer Proc 2│
│ site-a.com │ │ site-b.com │
│ Main Thread │ │ Main Thread │
│ Compositor │ │ Compositor │
│ Workers │ │ │
└───────┬───────┘ └───────┬───────┘
│ IPC │ IPC
└────────┬────────┘
▼
┌─────────────────┐
│ GPU Process │
│ Graphics Thread │
└─────────────────┘
IPC и Sandbox
IPC (Inter-Process Communication) — механизм обмена сообщениями между процессами браузера. В Chromium используется Mojo — собственный IPC-фреймворк, основанный на message pipes. IPC медленнее, чем вызовы функций внутри одного процесса, но он является фундаментом безопасности и стабильности.
Sandbox (песочница) — ограничение прав renderer-процессов на уровне ОС. Renderer не может напрямую обращаться к файловой системе, сети, устройствам или другим процессам. Все критичные операции выполняются через Browser Process, который проверяет разрешения.
Потоки внутри Renderer Process
Каждый renderer-процесс содержит несколько потоков, работающих параллельно:
- Main Thread — выполняет JavaScript, парсит HTML/CSS, вычисляет стили, layout и paint. Это самый загруженный поток.
- Worker Thread — обрабатывает Web Workers, Service Workers, Shared Workers.
- Compositor Thread — управляет скроллингом, анимациями и композитингом слоёв независимо от main thread. Благодаря ему анимации
transformиopacityмогут быть плавными даже при загруженности основного потока. - Raster Thread(s) — растеризует графические слои в пиксели, часто работает параллельно с compositor thread.
- IO Thread — обрабатывает асинхронные операции ввода-вывода внутри процесса.
┌────────────────────────────────────────────────┐
│ Renderer Process │
│ │
│ Main Thread │
│ (JS, DOM, CSSOM, Layout, Paint) │
│ │ display list + layers │
│ ▼ │
│ Compositor Thread │
│ (Scroll, Animations, Layers) │
│ │ raster tasks │
│ ▼ │
│ Raster Threads │
│ (Rasterization) │
│ │ bitmap textures │
│ ▼ │
│ Compositor Thread │
│ (Compose) │
│ │
│ Worker Threads │
│ (Web Workers, Service Workers) │
└────────────────────────────────────────────────┘
Site Isolation
Site Isolation — механизм разделения renderer-процессов по сайтам (origin). Впервые широко внедрён в Chrome в 2018 году как защита от аппаратных уязвимостей класса Spectre.
Origin — это комбинация протокола + домена + порта (https://example.com:443). Страницы с разных origin по спецификации Same-Origin Policy не должны иметь доступа друг к другу.
Как работает:
- Каждый сайт (origin) получает свой renderer-процесс
- Даже если на одной вкладке открыты iframe с разных доменов, они работают в разных процессах
- Процессы изолированы друг от друга на уровне ОС (разные адресные пространства)
Преимущества:
- Защита от Spectre и других side-channel атак
- Если один процесс падает, другие вкладки продолжают работать
- JavaScript из одного origin не может получить доступ к памяти другого
- Утечка данных через уязвимости в рендерере ограничена одним сайтом
Недостатки:
- Увеличивается потребление памяти (каждый процесс = накладные расходы на V8 heap, Blink heap, стеки потоков)
- Межпроцессное взаимодействие (IPC) медленнее, чем внутривпроцессное
- Большее количество процессов увеличивает нагрузку на планировщик ОС
GPU Acceleration
GPU-акселерация переносит графические вычисления с CPU на видеокарту. В современных браузерах почти все визуальные операции проходят через GPU Process.
Что ускоряется:
- Композитинг слоёв (layer compositing)
- CSS-анимации и transitions
- WebGL и Canvas 2D
- Видеодекодирование (через hardware acceleration)
- Растеризация сложной графики
Как работает:
- Main Thread строит DOM, CSSOM и создаёт список отображения (display list)
- Компоновка выделяет слои (layers), которые можно рисовать независимо
- Compositor Thread разбивает страницу на слои и отправляет их на растеризацию
- GPU Process растеризует каждый слой параллельно в текстуры
- Слои компонуются в финальное изображение на экране
2. Что происходит при вводе URL в браузер
Полный цикл от нажатия Enter до получения HTML
Когда пользователь вводит URL и нажимает Enter, браузер проходит через несколько сетевых этапов, прежде чем HTML попадёт в renderer-процесс. Этот путь — основа понимания производительности загрузки.
Пользователь Browser Process DNS Resolver Web Server
│ │ │ │
1. Ввод URL
│───────────────────────► │ │
│ 2. Парсинг URL
│──┐
│◄─┘
3. DNS Query
│ │────────────────────────► │
4. IP address
│ ◄────────────────────────│ │
5. TCP SYN
│ │────────────────────────────────────────────►
6. SYN-ACK
│ ◄────────────────────────────────────────────│
7. ACK
│ │────────────────────────────────────────────►
8. TLS ClientHello
│ │────────────────────────────────────────────►
9. ServerHello + Certificate
│ ◄────────────────────────────────────────────│
10. HTTP GET
│ │────────────────────────────────────────────►
11. HTTP 200 OK + HTML
│ ◄────────────────────────────────────────────│
│ 12. Создание Renderer + передача HTML
│──┐
│◄─┘
Этап 1: Парсинг URL
Браузер разбирает URL по компонентам согласно стандарту WHATWG URL Standard:
https:// user:pass@ example.com :443 /path ?query=1 #fragment
| | | | | | |
scheme auth host port path query fragment
- Проверяется синтаксис URL
- Определяется протокол (
http,https,ftp,fileи др.) - Извлекаются домен, порт (для https по умолчанию 443), путь, query-параметры, фрагмент
- Для некоторых URL выполняется HSTS check (HTTP Strict Transport Security) — принудительное использование HTTPS
- Проверяется кэш DNS, HSTS preload list и кэш предыдущих соединений
Этап 2: DNS Resolution
DNS (Domain Name System) — распределённая иерархическая система преобразования доменных имён в IP-адреса. Работает по протоколу UDP (или TCP для больших ответов) на порту 53.
Иерархия DNS:
┌─────────────────────────────────────┐
│ Корневые серверы (.) │
└──────────────────┬──────────────────┘
▼
┌─────────────────────────────────────┐
│ TLD серверы (.com .org .ru) │
└──────────────────┬──────────────────┘
▼
┌─────────────────────────────────────┐
│ Авторитативные серверы │
│ (example.com) │
└──────────────────┬──────────────────┘
▼
┌─────────────────────────────────────┐
│ Запись A/AAAA → IP-адрес │
└─────────────────────────────────────┘
Процесс DNS lookup:
- Browser DNS Cache — проверка внутреннего кэша браузера
- OS DNS Cache — проверка кэша операционной системы
- Router Cache — проверка кэша роутера/маршрутизатора
- ISP Recursive DNS Server — рекурсивный запрос к DNS-серверу провайдера
- Root DNS Server — запрос к корневому серверу
- TLD DNS Server — сервер домена верхнего уровня
- Authoritative DNS Server — сервер, авторитативный для конкретного домена
Результат: IP-адрес сервера (например, IPv4 142.250.185.78 или IPv6).
Оптимизации:
- DNS prefetch:
<link rel="dns-prefetch" href="//api.example.com"> - Preconnect:
<link rel="preconnect" href="https://api.example.com">— выполняет DNS + TCP + TLS заранее - DNS over HTTPS (DoH) — шифрует DNS-запросы, повышая приватность
Этап 3: TCP Connection
После получения IP браузер устанавливает TCP-соединение с сервером. TCP — протокол с установлением соединения, гарантирующий доставку пакетов в правильном порядке.
TCP three-way handshake (трёхстороннее рукопожатие):
Client Server
│ │
1. SYN (seq=x)
│───────────────────►
2. SYN-ACK (seq=y, ack=x+1)
◄───────────────────│
3. ACK (ack=y+1)
│───────────────────►
│ Соединение установлено
│──┐
│◄─┘
- SYN — клиент отправляет начальный sequence number
- SYN-ACK — сервер подтверждает и отправляет свой sequence number
- ACK — клиент подтверждает получение
RTT (Round Trip Time) — время, за которое пакет доходит до сервера и обратно. TCP handshake занимает 1 RTT.
Этап 4: TLS Handshake (для HTTPS)
TLS (Transport Layer Security) обеспечивает шифрование, аутентификацию и целостность данных. Современная версия — TLS 1.3.
Что происходит:
- ClientHello — клиент предлагает поддерживаемые версии TLS, cipher suites, расширения (SNI, ALPN)
- ServerHello — сервер выбирает параметры
- Certificate — сервер отправляет сертификат (цепочку доверия)
- Key Exchange — согласование общего секретного ключа (в TLS 1.3 — 1-RTT, в TLS 1.2 — 2-RTT)
- Finished — обе стороны начинают зашифрованную передачу
TLS 1.3 vs TLS 1.2:
- TLS 1.3: handshake занимает 1-RTT (или 0-RTT при повторном подключении)
- TLS 1.2: handshake занимает 2-RTT
- TLS 1.3 исключил устаревшие и небезопасные cipher suites
ALPN (Application-Layer Protocol Negotiation) — позволяет согласовать протокол приложения (HTTP/1.1, HTTP/2, HTTP/3) внутри TLS handshake.
Этап 5-7: HTTP Request → Server Processing → HTTP Response
Браузер формирует HTTP-запрос и отправляет его по установленному соединению.
HTTP Request состоит из:
- Request line:
GET /index.html HTTP/2 - Headers:
Host,User-Agent,Accept,Accept-Encoding,Cookie,Cache-Control - Body (для POST/PUT)
HTTP Response состоит из:
- Status line:
HTTP/2 200 OK - Headers:
Content-Type,Content-Length,Cache-Control,Set-Cookie,ETag - Body: HTML, JSON, изображения и т.д.
Протоколы транспорта:
- HTTP/1.1: последовательная обработка запросов в одном соединении или множественные TCP-соединения
- HTTP/2: мультиплексирование запросов в одном TCP-соединении, server push, сжатие заголовков (HPACK)
- HTTP/3: работает поверх QUIC (UDP), устраняет head-of-line blocking на транспортном уровне
Этап 8: Передача HTML в Renderer Process
Получив HTML, Browser Process создаёт или выбирает renderer-процесс (с учётом Site Isolation) и передаёт ему поток байтов. Дальше начинается Critical Rendering Path:
HTML → DOM → CSSOM → Render Tree → Layout → Paint → Composite → Screen
Подробное описание каждого шага — в статье Парсинг HTML и критический путь рендеринга.
3. TTFB (Time To First Byte)
Что такое TTFB
TTFB — время от начала HTTP-запроса до получения первого байта ответа от сервера. Это важная метрика, отражающая серверную производительность и сетевые задержки.
Компоненты TTFB:
- DNS Lookup — разрешение доменного имени
- TCP Connection — установка TCP-соединения
- TLS Handshake — шифрование (для HTTPS)
- Server Processing — обработка запроса на сервере
- Network Latency — задержка сети (RTT)
┌────────────────────────────────────────────────┐
│ TTFB │
│ │
│DNS Lookup │
│ │ │
│ ▼ │
│TCP Handshake │
│ │ │
│ ▼ │
│TLS Handshake │
│ │ │
│ ▼ │
│Server Processing │
│ │ │
│ ▼ │
│Network Latency │
│ │ │
│ ▼ │
│First Byte │
└────────────────────────────────────────────────┘
Как измерить
В Chrome DevTools:
- Network tab → выбрать запрос → вкладка Timing
- Смотрим “Waiting for server response”
Формула:
TTFB = DNS + TCP + TLS + Server Processing + Network Latency
Navigation Timing API:
const ttfb = performance.timing.responseStart - performance.timing.requestStart;
console.log(`TTFB: ${ttfb}ms`);
Как улучшить TTFB
1. Оптимизация серверной логики
- Используйте кэширование (Redis, Memcached)
- Оптимизируйте SQL-запросы
- Используйте индексы в базах данных
- Избегайте N+1 запросов
2. CDN (Content Delivery Network)
- Размещает контент ближе к пользователю
- Уменьшает network latency
- Кэширует статические ресурсы
3. HTTP/2 или HTTP/3
- Мультиплексирование запросов
- Сжатие заголовков
- Server Push (HTTP/2)
- QUIC protocol (HTTP/3)
4. Оптимизация DNS
- Используйте быстрые DNS-серверы (Cloudflare, Google DNS)
- DNS prefetch для критических доменов
<link rel="dns-prefetch" href="https://api.example.com">
5. Keep-Alive соединения
Connection: keep-alive
Повторное использование TCP-соединения для нескольких запросов.
6. Server-side caching
# Nginx пример
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m;
proxy_cache my_cache;
proxy_cache_valid 200 60m;
7. Database optimization
- Используйте connection pooling
- Оптимизируйте медленные запросы
- Используйте read replicas для read-heavy workload
8. Load balancing
- Распределяйте нагрузку между серверами
- Используйте health checks
- Горизонтальное масштабирование
Целевые значения TTFB:
- Отлично: < 200ms
- Хорошо: 200-500ms
- Приемлемо: 500-800ms
- Плохо: > 800ms
4. От HTML к пикселям: связь с рендерингом
Получив HTML, renderer-процесс начинает его парсить. Эта работа происходит преимущественно на Main Thread, а финальная сборка кадра — на Compositor Thread с участием GPU Process. Основные фазы:
- Парсинг HTML → DOM Tree
- Парсинг CSS → CSSOM Tree
- Объединение DOM + CSSOM → Render Tree
- Layout (Reflow) — вычисление геометрии
- Paint — растеризация пикселей
- Composite — сборка слоёв в финальное изображение
Ключевые идеи, которые стоит помнить на уровне архитектуры:
- Main Thread выполняет JS, layout и paint; если он занят, страница не отвечает на ввод.
- Compositor Thread может анимировать
transformиopacityна GPU независимо от Main Thread. - Reflow дороже Repaint, потому что затрагивает геометрию дерева.
- Layout thrashing — чередование чтения и записи layout-свойств — вызывает принудительные reflow на каждом чтении.
will-change: transformсоздаёт отдельный GPU-слой, но каждый слой потребляет память.deferсохраняет порядок выполнения и запускает скрипт после парсинга HTML;asyncвыполняется немедленно после загрузки без гарантии порядка.
Всё это разобрано детально в статье Парсинг HTML и критический путь рендеринга.
Ключевые тезисы для интервью
- Браузер — многопроцессная система: Browser Process (UI, навигация), Renderer Process (парсинг, рендеринг), GPU Process (графика). Site Isolation помещает каждый сайт в отдельный renderer, защищая от Spectre, но увеличивая память.
- Main Thread выполняет JS, layout и paint; Compositor Thread анимирует
transformиopacityна GPU независимо от Main Thread. - Сетевой путь от URL до HTML: парсинг URL → DNS → TCP → TLS → HTTP-запрос → HTTP-ответ → передача в Renderer Process.
- TTFB складывается из DNS, TCP, TLS, Server Processing и Network Latency. Уменьшать его помогают CDN, кэширование, HTTP/2|3, keep-alive и оптимизация бэкенда.
- Critical Rendering Path продолжается уже внутри renderer-процесса: DOM → CSSOM → Render Tree → Layout → Paint → Composite. Подробности — в разделе HTML/CSS.
Заключение
Понимание браузерной архитектуры критически важно для создания быстрых и отзывчивых веб-приложений. Ключевые выводы:
- Site Isolation обеспечивает безопасность, но увеличивает потребление памяти.
- DNS resolution — первый шаг в загрузке страницы, используйте DNS prefetch и preconnect.
- TTFB — метрика серверной производительности и сети, оптимизируйте backend и инфраструктуру.
- Рендеринг происходит в Renderer Process на Main Thread и Compositor Thread; детали пайплайна — в статье Парсинг HTML и критический путь рендеринга.
Эти знания помогут вам лучше понимать, что происходит “под капотом” браузера, и принимать решения по оптимизации загрузки и рендеринга.