awesome-everything EN
↑ Обратно к восхождению

Сети и протоколы

DNS, TCP, TLS по очереди: куда уходят миллисекунды

Суть Семь конкретных фаз от холодного DNS до первого зашифрованного байта с числами и рычагами оптимизации (возобновление TLS, 0-RTT, объединение соединений), которые устраняют round-trip, а не просто сокращают их.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 14 min

Коллега сообщает, что сайт «ощущается медленным при первом посещении». Вы открываете трейс Lighthouse и видите 320 мс до первого байта. Понять, что именно съело это время — DNS, TCP или TLS — и какая оптимизация устраняет round-trip, а не просто сокращает их, — это разница между реальным исправлением и угадыванием.

Пофазный бюджет времени

Предположим тёплый сайт с CDN (пользователь в Лондоне, edge POP в Лондоне, ~25 мс RTT до edge):

ФазаХолодный (первое посещение)Тёплый (повторное)Рычаг устранения
DNS30–100 мс (обход резолвера)<1 мс (кеш ОС)dns-prefetch / длинный TTL
TCP handshake~25 мс (1 RTT региональный)0 мс (пул соединений)keep-alive / preconnect
TLS 1.3 новый~25 мс (1 RTT)0 мс (0-RTT возобновление)session ticket / PSK
HTTP-запрос~25 мс (1 RTT)~25 мспопадание в кеш CDN edge
Итого до TTFB105–175 мс25–30 мс

Ключевой инсайт: DNS и TCP устраняются кешированием и пулом соединений при повторных посещениях. TLS устраняется возобновлением сессии (PSK). При тёплом повторном посещении TTFB может упасть с 175 мс до менее 30 мс — не потому что сеть стала быстрее, а потому что round-trip были устранены полностью.

Фаза 1: DNS (~30 мс холодный, <1 мс тёплый)

Браузер спрашивает Rex: «Какой IP у example.com?» Rex проверяет кеш. Кеш тёплый → отвечает за микросекунды. Кеш холодный → Rex обходит иерархию: корневой nameserver → nameserver TLD .com → авторитативный nameserver example.com. Каждый переход — один сетевой round-trip. Холодный DNS-запрос в Северной Америке или Европе занимает 30–100 мс.

Ловушка TTL. Если оператор CDN установил TTL=60 с для быстрого failover, большинство пользователей платят цену холодного DNS намного чаще, чем необходимо. TTL=300 с — лучший вариант для большинства случаев: пять минут кеширования в резолвере, при этом failover происходит менее чем за пять минут.

Оптимизация: dns-prefetch. Добавление <link rel="dns-prefetch" href="//cdn.example.com"> в HTML просит браузер разрешить ожидаемые hostname во время разбора страницы, до того как основной парсер дойдёт до реальных URL ресурсов. Стоимость: несколько миллисекунд DNS, перемещённых с критического пути.

Фаза 2: TCP handshake (1 RTT, 10–100 мс по географии)

Bea отправляет SYN → Sven отвечает SYN-ACK → Bea отправляет ACK. Три пакета, один round-trip. Время определяется географией:

  • Лондон — Франкфурт: ~10–15 мс.
  • Лондон — Нью-Йорк: ~56 мс (по данным High Performance Browser Networking, скорость света в оптоволокне).
  • Лондон — Калифорния: ~100 мс.

После рукопожатия начальное congestion window TCP (IW=10, по RFC 6928) позволяет передать до 10 пакетов (~14,6 КБ) без ожидания ACK. Если первый ответ превышает IW, Bea должна ждать ACK, прежде чем получить больше — одна скрытая причина того, почему важно держать HTML в пределах 14 КБ.

Оптимизация: preconnect. <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> говорит браузеру открыть TCP + TLS к ожидаемым origin до того, как основной парсер до них доберётся. Правило: применять к двум-трём критически важным origin (CDN, шрифты, API), но не ко всем.

Фаза 3: TLS 1.3 handshake (1 RTT новый, 0 RTT возобновление)

Bea отправляет ClientHello (key share, cipher suites). Sven отвечает ServerHello (выбранный cipher, сертификат, server key share). Bea проверяет сертификат по подписи Cara. Обе стороны выводят общие ключи. Стоимость: один round-trip (~25 мс региональный). Если Bea уже видела Sven раньше, она отправляет pre-shared key (PSK) из session ticket, сохранённого при прошлом визите. Sven принимает без повторной отправки сертификата. Стоимость: ноль дополнительных round-trip — TLS handshake встраивается в существующее QUIC или TCP соединение.

Данные 0-RTT. При TLS 1.3 с 0-RTT возобновлением поверх QUIC (HTTP/3) Bea может отправить HTTP-запрос внутри того же начального QUIC-пакета, что и TLS ClientHello — до того как сервер ответил. Это экономит один RTT на тёплых соединениях. 0-RTT безопасен только для идемпотентных методов (GET, HEAD, OPTIONS). Для POST или PUT 0-RTT несёт риск replay-атаки. Серверы должны отклонять 0-RTT для изменяющих состояние методов с кодом 425 Too Early.

Граничные случаи

Объединение соединений (connection coalescing): если два origin имеют один IP и сертификат (например, api.example.com и cdn.example.com за одним Cloudflare edge), браузер может повторно использовать одно HTTP/2 или /3 соединение для обоих. Это полностью устраняет TCP + TLS handshake для второго origin. Coalescing происходит незаметно; вы получаете выгоду, если размещаете несколько поддоменов за одним CDN.

Проследи
1/5

Трассируйте первое посещение страницы с холодного кеша до TTFB.

1
Step 1 of 5
Пользователь вводит URL. Что делает браузер первым?
2
Locked
DNS возвращает IP. Что дальше?
3
Locked
TCP готов. Начинается TLS. Что первым отправляет Bea?
4
Locked
Sven отвечает ServerHello + Certificate. Что проверяет Bea?
5
Locked
TLS готов. Bea отправляет HTTP-запрос. Сервер обрабатывает и возвращает первый байт. Итоговый TTFB?
Проследи
1/5

Трассируйте тот же сайт через 30 минут — тёплый кеш.

1
Step 1 of 5
DNS кеширован в резолвере ОС. Сколько времени занимает DNS?
2
Locked
TCP — что изменилось при тёплом соединении?
3
Locked
TLS — что изменилось?
4
Locked
Статические ресурсы кешированы. Что делает браузер для закешированных ресурсов?
5
Locked
Итоговое время до LCP при тёплой загрузке?
Викторина

0-RTT возобновление экономит round-trip, но небезопасно для POST-запросов. Почему?

Расставь шаги по порядку

Упорядочите оптимизации по количеству устраняемых round-trip (от наибольшего к наименьшему):

  1. 1 Попадание в кеш CDN edge (устраняет DNS + TCP + TLS + round-trip к origin)
  2. 2 TLS 0-RTT возобновление (устраняет 1 TLS RTT)
  3. 3 Keep-alive соединение (устраняет TCP handshake для последующих запросов)
  4. 4 dns-prefetch (переносит DNS с критического пути, не устраняет round-trip)
Вспомните перед уходом
  1. 01
    Объясните, почему 0-RTT TLS 1.3 экономит round-trip, но опасен для неидемпотентных запросов.
  2. 02
    Что такое начальное congestion window TCP (IW=10) и почему оно важно для загрузки страниц?
  3. 03
    Почему `<link rel=preconnect>` к десяти origin скорее вредит, чем помогает?
Итог

Первые три фазы — DNS, TCP, TLS — строго последовательны и вместе занимают 100–175 мс при первом посещении. Каждую можно сократить географией (CDN edge) или устранить кешированием (TTL DNS, keep-alive соединений, возобновление TLS-сессии). При тёплом повторном посещении все три могут схлопнуться до менее 1 мс суммарно, повторно используя кеш DNS ОС, пул соединений и TLS PSK. HTTP/3 0-RTT идёт дальше, встраивая HTTP-запрос в TLS ClientHello — но только безопасно для идемпотентных методов. Начальное congestion window TCP в 10 пакетов (~14,6 КБ) — скрытый порог: ответы, превышающие его, платят лишний round-trip, прежде чем сервер сможет отправить больше данных.

Связанные уроки
встречается в258
Продолжить восхождение ↑Критический путь рендеринга и Core Web Vitals
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.