diff --git a/doc/etcp_protocol.txt b/doc/etcp_protocol.txt index 5ac83173..8b5825a1 100644 --- a/doc/etcp_protocol.txt +++ b/doc/etcp_protocol.txt @@ -67,6 +67,9 @@ BBR каждого линка получает ACK/loss samples и возвра 8192 — нижняя допустимая граница настройки bbr_max_cwnd; транспорт не повышает до неё текущее окно. PROBE_RTT осушает flight до max(4*MSS, 0.5*BDP), выдерживает >=200мс и раунд ACK, затем восстанавливает окно. MSS — размер DATA-фрагмента normalizer без заголовков; начальное окно UDP и STCP равно 4*MSS с верхним лимитом конфига. +В PROBE_BW действует дополнительный целевой бюджет очереди 20мс: всё окно, включая резервы ACK и PROBE_UP, +ограничивается max(4*MSS, BDP + BW*20мс) по min_rtt. STARTUP/DRAIN не ограничиваются этим бюджетом. +Это цель по оценкам BBR; минимум окна, изменение полосы и очереди обратного пути могут давать большую задержку. Отказ из-за нехватки окна сохраняет cwnd_limited до следующего ACK: вычитание ACK не должно скрывать этот факт от BBR. app_limited учитывает ожидающие очереди и pending/частичный буфер normalizer; ограничение окном не означает отсутствие данных. diff --git a/src/transport_layer/etcp_bbr_doc.md b/src/transport_layer/etcp_bbr_doc.md index e1ed3e2b..d343f81d 100644 --- a/src/transport_layer/etcp_bbr_doc.md +++ b/src/transport_layer/etcp_bbr_doc.md @@ -50,12 +50,21 @@ PROBE_RTT осушает flight до `max(4*MSS, 0.5*BDP)`, выдерживае DATA, отправленные в PROBE_RTT, помечаются app_limited, чтобы низкая скорость осушения не понижала оценку полосы. ACK-only не ограничивается этим pacing, но проходит общую физическую очередь канала. -Целевое окно PROBE_BW равно `2*BDP + ACK-резерв`, в PROBE_UP добавляются ещё `2*MSS`; -применяются также минимум окна и изученные ограничения inflight. Это резерв для утилизации канала, -а не фиксированный лимит времени очереди. Например, в диагностике канала 2Мбит/с с базовым RTT=20мс -модель получила min_rtt=24мс и окно `12060 + 1893 + 2194 = 16147` байт DATA. -Наблюдаемая очередь 44–48мс укладывается в такое окно, но нарушает отдельное требование теста <=40мс. -Для фиксированного бюджета задержки нужна отдельная политика ограничения; это изменение поведения контроллера. +Штатное целевое окно PROBE_BW равно `2*BDP + ACK-резерв`, в PROBE_UP добавляются ещё `2*MSS`; +применяются также минимум окна и изученные ограничения inflight. Без отдельного ограничения такие резервы +на канале 2Мбит/с с базовым RTT=20мс давали окно `12060 + 1893 + 2194 = 16147` байт и очередь 44–48мс. + +В адаптации ETCP итоговое окно всех фаз PROBE_BW дополнительно ограничено бюджетом очереди: +`max(4*MSS, BDP + BW*queue_budget_us/1000000)`. `BDP` использует min_rtt, а не текущий RTT с очередью. +Резервы ACK/PROBE_UP входят в этот предел. `bbr_init` задаёт `queue_budget_us=20000`; значение можно менять +в uasync-потоке, `0` отключает политику. `queue_cwnd_cap` показывает действующий предел в DATA-байтах; +`0` означает, что ограничение не активно. Callback окна получает уже ограниченный результат, включая fast path. + +Это целевая задержка по оценке полосы, а не гарантия физического времени очереди. STARTUP и DRAIN +сохраняют свои правила поиска полосы/осушения. Минимум 4*MSS может требовать больше 20мс сериализации; +при неизвестном min_rtt или нулевой оценке полосы дополнительный предел не применяется. +Изменение пропускной способности и другой путь возврата ACK могут делать оценку неточной. +После изучения полосы меньший предел может ограничивать скорость; реальную очередь отдельно измеряет multipath-тест. ### Тестирование Поле `now_tb` позволяет подменять реальное время (`get_time_tb()`) на заданное — при `now_tb == 0` используется `get_time_tb()`, иначе управляемое значение. `on_cwnd_update` — callback для отслеживания изменений cwnd в тестах.