how/network
Откуда TCP «знает» с какой скоростью слать данные? Не знает - пробует всё быстрее, пока не упрётся. Потом снижает в 2 раза и пробует снова.
Когда ты качаешь файл - твой TCP не знает какая пропускная способность канала. Он не получил никакой бумажки «у тебя 100 Мбит/с». Чтобы это узнать - ему надо попробовать.
TCP начинает с маленького окна (cwnd = congestion window - сколько
сегментов «в полёте» одновременно), постепенно увеличивает, и
когда упирается в потерю пакетов - понимает «вот мой потолок»,
снижает скорость и продолжает осторожнее.
Этот алгоритм называется AIMD (Additive Increase, Multiplicative Decrease) - линейный рост и деление пополам при потере. На графике он рисует характерную «пилу» - это и есть «голос TCP».
Нажми ▶ - посмотрим как cwnd растёт от 1 сегмента до своего максимума, ловит loss и продолжает.
После three-way handshake TCP-стек начинает работу.
Стартовое cwnd (congestion window) = 1 сегмент (или 10
в современных Linux'ах с initcwnd=10).
Это значит: «отправитель может иметь не более 1 пакета в полёте без ACK». Дальше будем увеличивать.
Главный вопрос: на сколько и как быстро увеличивать?
итого
Что важно запомнить:
sysctl net.ipv4.tcp_congestion_control.
Доступные: cat /proc/sys/net/ipv4/tcp_available_congestion_controlСильно связано с [[tcp-retransmission|retransmission]] - fast-retransmit запускает halving cwnd (на графике это «зубцы пилы»).