EnglishРусский Map

Загрузка... [13 кБ]

title
Загрузка... [13 кБ]
type
summary
summary
Почему загрузка замирает на 13 кБ: медленный старт TCP и начальное окно перегрузки
tags
networking, tcp, web-performance
created
2026-04-06
updated
2026-07-22
lang
ru
translation_of
13kb-tcp-slow-start
source_updated
2026-07-22
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

Пост maurycyz о загадке: любая загрузка в их gopher-клиенте замирала ровно на 13 килобайтах. Объяснение кроется в tcp-congestion-control, а именно в начальном окне перегрузки в алгоритме медленного старта TCP.

Проблема

Пакеты перемещаются по интернету независимо друг от друга и приходят не по порядку либо теряются вовсе. TCP решает это с помощью порядковых номеров (чтобы пакеты можно было собрать заново) и подтверждений доставки (чтобы потерянные пакеты отправлялись повторно). В статье оба механизма разбираются на примере "Hello, World!", где показано, как повторные ACK сигнализируют о пробеле и вызывают повторную отправку.

Управление перегрузкой

Надёжная доставка создаёт неприятную обратную связь: перегрузка сети приводит к потере пакетов, что вызывает повторные отправки, которые перегружают сеть ещё сильнее. В 1986 году это буквально обрушило интернет. Ответ TCP - окно перегрузки (congestion window), ограничивающее количество пакетов в полёте до получения ответа от получателя.

Медленный старт устанавливает это окно в 10 пакетов при открытии соединения. Каждый ACK увеличивает окно на единицу, поэтому оно удваивается за каждый круговой рейс (RTT) - экспоненциальный рост. При обнаружении потери поведение зависит от того, как именно её заметили:

  • Повторные ACK (пакеты всё ещё идут, потерялся только один): уменьшить окно вдвое, перейти к предотвращению перегрузки (линейный рост, +1 пакет за RTT).
  • Таймаут (тишина - возможно, пакеты всё ещё забивают сеть): сбросить окно до 1 и перезапустить медленный старт до половины прежнего окна.

Разница принципиальна: повторные ACK означают, что большая часть данных дошла, тогда как таймаут говорит о том, что сеть, вероятно, всё ещё переваривает отправленное.

Число 13 кБ

Десять пакетов примерно по 1368 байт каждый = 13,2 кБ. Это всё, что клиент получает за первый RTT. Через два RTT получается ~40 кБ, через три - ~92 кБ. На каналах с высокой задержкой пауза на 13 кБ становится заметной.

Влияние на веб-производительность

Первые 13 кБ загружаемой страницы должны содержать всё необходимое для отрисовки первого экрана - критический CSS и JavaScript, встроенные прямо в HTML. Часто упоминаемый "бюджет в 14,2 кБ" близок к правде, но неточен: размеры пакетов зависят от оборудования и маршрута (MTU, VLAN'ы), заголовки HTTP и накладные расходы TLS съедают часть бюджета, а сжатие HTTP играет вам на руку. Единственный способ измерить своё реальное начальное окно - Wireshark, да и то цифры будут отличаться для каждого посетителя.

Ссылки

  • RFC 9293 - стандарт TCP
  • RFC 5681 - управление перегрузкой
  • RFC 6928 - начальное окно в 10 пакетов
  • high-performance-browser-networking - книга Григорика, бесплатно доступная на hpbn.co, представляет собой развёрнутую версию этой статьи: та же арифметика медленного старта плюс рукопожатия TLS, мультиплексирование HTTP/2 и затраты на пробуждение мобильного радиомодуля, и всё это в терминах времени загрузки страницы