diff --git a/doc/tasks.md b/doc/tasks.md index 0b7b11a6..eec7faee 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -41,6 +41,12 @@ но очередь 47.9мс >40мс. RTT 20/200мс: 10.08 из 16 Мбит/с, быстрый путь недогружен; rtt FAIL. Пороги очереди и утилизации не ослаблены. Логи: /tmp/etcp-probe-{equal,bandwidth,rtt}.log/.csv. Диагностика bandwidth с состояниями модели: /tmp/etcp-probe-bandwidth-diagnostic.log. + Дополнительная проверка 23.10: /tmp/etcp-queue-budget.log/.csv; лог включает bw Q16, DATA MSS, ACK-резерв и пик очереди. + Пик штатного PROBE_UP: bw=16465/65536 байт/мкс, min_rtt=24000мкс, MSS=1097; + 2*BDP=12060, ACK-резерв=1893, 2*MSS=2194, cwnd=16147 байт. Сложение и единицы на этом пике корректны. + Профиль bandwidth даёт полезные 9.045 из 10Мбит/с, очередь 47.1мс >40мс; порог теста не изменён. + Для следующей правки требуется выбрать политику: добавить бюджет задержки к BBR либо сохранить штатные резервы + и обосновать допустимый предел очереди с учётом сериализации. Вопрос передан пользователю; алгоритм пока не изменён. [+] **ETCP/BBR: единое окно DATA и корректное осушение PROBE_RTT** — исправлено 23.10.2026: BBR использует MSS=normalizer->frag_size, а не wire-MTU/размер STCP-кадра. Начальное окно UDP/STCP равно 4*MSS; diff --git a/src/transport_layer/etcp_bbr.h b/src/transport_layer/etcp_bbr.h index f1dca0a7..a4687d13 100644 --- a/src/transport_layer/etcp_bbr.h +++ b/src/transport_layer/etcp_bbr.h @@ -4,7 +4,9 @@ * cwnd/inflight/delivered — байты DATA, interval/rtt — микросекунды, pacing_rate — байты в секунду. * MSS — максимальный DATA-фрагмент normalizer, без заголовков; не wire-MTU и не размер кадра STCP. * Минимальное окно — 4*MSS; PROBE_RTT осушает до max(4*MSS, 0.5*BDP), затем ждёт >=200мс и раунд ACK. - * Транспорт применяет окно с верхним ограничением конфига и не повышает его до собственного минимума. */ + * Транспорт применяет окно с верхним ограничением конфига и не повышает его до собственного минимума. + * Целевое окно PROBE_BW включает 2*BDP и ACK-резерв, в PROBE_UP дополнительно 2*MSS; + * фиксированный предел времени физической очереди модель не задаёт. */ #pragma once #include diff --git a/src/transport_layer/etcp_bbr_doc.md b/src/transport_layer/etcp_bbr_doc.md index 515b75be..e1ed3e2b 100644 --- a/src/transport_layer/etcp_bbr_doc.md +++ b/src/transport_layer/etcp_bbr_doc.md @@ -50,6 +50,13 @@ 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мс. +Для фиксированного бюджета задержки нужна отдельная политика ограничения; это изменение поведения контроллера. + ### Тестирование Поле `now_tb` позволяет подменять реальное время (`get_time_tb()`) на заданное — при `now_tb == 0` используется `get_time_tb()`, иначе управляемое значение. `on_cwnd_update` — callback для отслеживания изменений cwnd в тестах.