Механизмы обеспечения надежности: Window Scaling, Retransmission и управление перегрузками
Материалы по теме сетевой безопасности и шифрования носят ознакомительный характер. Применение полученных знаний в реальных системах требует соблюдения законодательства РФ в области защиты информации и персональных данных.
В предыдущей теме мы разобрали, как время кругового обхода (RTT) ограничивает скорость. Теперь выясним, как TCP обходит эти ограничения и выжимает максимум из канала, сохраняя целостность данных. Мы переходим от сухих метрик к механизмам, которые управляют «пульсом» интернета.
Sliding Window: конвейер вместо ожидания
Если бы TCP отправлял один пакет и ждал подтверждения (ACK), прежде чем отправить следующий, сеть бы простаивала. Этот неэффективный метод называют «Stop-and-Wait». Чтобы ускорить процесс, TCP использует Sliding Window (Скользящее окно).
Sliding Window — это объем данных, который отправитель может передать в сеть, не дожидаясь подтверждения от получателя.
Представьте ленту конвейера. Пока первые коробки едут к клиенту, вы продолжаете ставить новые. Как только клиент подтвердил получение первой партии, «окно» на ленте сдвигается, позволяя добавить следующую порцию.
- Плюс: Мы максимально загружаем канал данными «в полете».
- Риск: Слишком большое окно переполнит буфер получателя или «забьет» промежуточные роутеры.
Window Scaling: гигабиты в секунду
В заголовке TCP под размер окна выделено всего 16 бит. Это ограничивает его размер 64 КБ — критически мало для современных дата-центров.
Чтобы понять масштаб проблемы, используют формулу Bandwidth-Delay Product (BDP): Она показывает, сколько данных должно находиться в канале, чтобы использовать его на 100%. Если ваш BDP равен 5 МБ, а окно ограничено 64 КБ, вы используете менее 2% пропускной способности.
Для решения создали опцию Window Scaling. Она согласуется при установке соединения (Handshake) и вводит множитель, увеличивающий предел окна до 1 ГБ. В современных дистрибутивах Linux опция включена по умолчанию.
Совет для интервью: Если на высоконагруженном сервере скорость упирается в «потолок» при свободном канале, первым делом проверьте наличие
wscaleв сетевых дампах.
Когда пакеты теряются: RTO vs Fast Retransmit
Сеть нестабильна. TCP замечает пропажу пакетов двумя способами:
- Retransmission Timeout (RTO): Это «план Б». Если подтверждений долго нет, срабатывает таймер и пакет отправляется повторно. Это дорого: ожидание таймера создает простой.
- Fast Retransmit: Это «план А». Если получатель видит «дырку» в данных (пришли пакеты 1, 2, 4, 5), он шлет дублирующие подтверждения (Duplicate ACKs) на последний целый пакет (№2).
Получив три дублирующих ACK, отправитель не ждет таймера RTO, а немедленно переотправляет потерянный пакет. Это резко снижает задержки.
Selective ACK (SACK): точечный ремонт
В классическом TCP потеря одного пакета из десяти заставляла отправителя пересылать всю десятку заново. Это лишняя нагрузка.
Selective ACK (SACK) позволяет получателю уточнить: «Я получил пакеты 1–2 и 4–10. Не хватает только третьего».
- Отправитель досылает только один нужный фрагмент.
- Экономятся трафик и ресурсы CPU.
Это критично для микросервисов, где важна минимальная задержка (latency) при передаче множества мелких сообщений.
Управление перегрузками
TCP — саморегулирующаяся система. Чтобы не «положить» сеть, используются алгоритмы:
- Slow Start: Начинаем с крошечного окна и удваиваем его с каждым RTT, пока не нащупаем предел.
- Congestion Avoidance: После достижения порога рост окна замедляется и становится линейным.
В ядрах Linux 6.x+ популярен алгоритм BBR. Он анализирует не потери, а реальную скорость и задержку, не создавая очередей в роутерах.
Практика: заглядываем в сокет
Посмотреть, как работают эти механизмы на живом сервере, можно утилитой ss (socket statistics):
# Просмотр параметров TCP для активных соединений
ss -ti
Ключевые параметры в выводе:
wscale: коэффициент масштабирования окна.rto: текущее значение тайм-аута.cwnd: текущее окно перегрузки (Congestion Window).
Если cwnd постоянно скачет или подозрительно низок — это сигнал о проблемах со связью или неверных настройках алгоритмов перегрузки.
Мы научились выжимать из TCP максимум. Но у этих механизмов есть «ахиллесова пята». Если в идеально настроенном окне потеряется хотя бы один пакет, все остальные данные будут ждать его в буфере, не попадая в приложение.
В следующей теме разберем этот эффект — Head-of-line blocking. Вы поймете, почему он заставил индустрию перейти на QUIC и HTTP/3.