linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
home/linux/how/tcp-congestion

how/network

TCP congestion control

Откуда TCP «знает» с какой скоростью слать данные? Не знает - пробует всё быстрее, пока не упрётся. Потом снижает в 2 раза и пробует снова.

Когда ты качаешь файл - твой TCP не знает какая пропускная способность канала. Он не получил никакой бумажки «у тебя 100 Мбит/с». Чтобы это узнать - ему надо попробовать.

TCP начинает с маленького окна (cwnd = congestion window - сколько сегментов «в полёте» одновременно), постепенно увеличивает, и когда упирается в потерю пакетов - понимает «вот мой потолок», снижает скорость и продолжает осторожнее.

Этот алгоритм называется AIMD (Additive Increase, Multiplicative Decrease) - линейный рост и деление пополам при потере. На графике он рисует характерную «пилу» - это и есть «голос TCP».

Нажми ▶ - посмотрим как cwnd растёт от 1 сегмента до своего максимума, ловит loss и продолжает.

step 1/6·00 · соединение установлено, cwnd = 1
Congestion window (cwnd) над временем148162432время (RTT)cwnd (segments)idle: cwnd ещё не растёт. tcp-стек только что установил соединение

§ шаги

  1. После three-way handshake TCP-стек начинает работу. Стартовое cwnd (congestion window) = 1 сегмент (или 10 в современных Linux'ах с initcwnd=10).

    Это значит: «отправитель может иметь не более 1 пакета в полёте без ACK». Дальше будем увеличивать.

    Главный вопрос: на сколько и как быстро увеличивать?

итого

Что важно запомнить:

  • Slow start - начальная фаза с экспоненциальным ростом (cwnd удваивается каждый RTT). Звучит парадоксально - «быстрый старт» против «медленного» - но в индустрии прижилось именно «slow start» (по сравнению с «сразу слать на максимум»)
  • ssthresh (slow start threshold) - пороговое значение cwnd, после которого slow start заканчивается и начинается congestion avoidance (линейный рост)
  • AIMD = Additive Increase Multiplicative Decrease. Линейный рост (+1 сегмент за RTT) и деление пополам при потере. Математически доказано что это даёт fair sharing канала между конкурирующими потоками
  • Потеря пакета = сигнал congestion. TCP не может отличить «канал забит» от «Wi-Fi моргнул» - реагирует одинаково. На лоссы Wi-Fi это плохо (теряем пропускную способность зря) - отсюда BBR-алгоритм Google'а как альтернатива
  • Современный Linux по умолчанию использует CUBIC - модификация AIMD которая лучше работает на high-speed links. BBR ещё агрессивнее, активно используется в YouTube/Netflix
  • Посмотреть текущий algorithm: sysctl net.ipv4.tcp_congestion_control. Доступные: cat /proc/sys/net/ipv4/tcp_available_congestion_control

Сильно связано с [[tcp-retransmission|retransmission]] - fast-retransmit запускает halving cwnd (на графике это «зубцы пилы»).

§ копнуть в базу знаний

  • tcp-handshakeTCP handshake - что предшествует
  • tcp-statesTCP states - состояния соединения
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки