From e0f28bf851a0de1985a95bb9aae21e0f246669f5 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 23 Oct 2026 12:52:59 +0200 Subject: [PATCH] Document reduced RTT multiplier and jitter margin for RTO --- doc/etcp_multipath_plan.txt | 7 +++++-- doc/etcp_protocol.txt | 3 ++- doc/tasks.md | 5 +++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/doc/etcp_multipath_plan.txt b/doc/etcp_multipath_plan.txt index 0794fd4e..d09f0bc4 100644 --- a/doc/etcp_multipath_plan.txt +++ b/doc/etcp_multipath_plan.txt @@ -12,7 +12,8 @@ STARTUP в DRAIN после целого раунда RTT выше min_rtt+бю Логический seq/payload отделён от физических ETCP_TX_ATTEMPT. Новый DATA содержит seq+attempt_id; ACK своего пути содержит seq+attempt_id+receiver_delay_us. Till подтверждает только логическую доставку. Собственные очереди попыток, -ACK, RTT/jitter и RTO принадлежат линку. RTO=clamp(2*(RTT+jitter),10мс,1с); +ACK, RTT/jitter и RTO принадлежат линку. RTO=clamp(1.2*RTT+1.5*jitter+3мс,10мс,1с), +с округлением вверх до целой микросекунды; до DATA ACK используется KA RTT того же пути, без него начальное значение 1с. Retry обходит каналы относительно last_link фрагмента; курсор фиксируется только после принятия send транспортом. Поздние/чужие ACK не меняют чужой flight/BBR. @@ -30,7 +31,7 @@ check.sh завершён успешно за166с: дополнительные load — 8/8 соединений,134217728 байт с проверкой содержимого за13.66с. Лог: /tmp/etcp-attempts-final-check.log. Он не включает долгую multipath-матрицу. -Вся штатная multipath-матрица пока FAIL: 20 нарушений порогов. +До изменения формулы RTO штатная multipath-матрица FAIL: 20 нарушений порогов. RTT20/200мс: 13.552/16Мбит/с, длинный канал wire7.173/8Мбит/с; после исправления STARTUP пики очереди около 23мс вместо 220мс. Есть недобор bidirectional (обратное направление 7.116/10Мбит/с). @@ -291,6 +292,8 @@ uint8: хранить факт состоявшейся отправки отд До первого DATA ACK использовать RTT того же KA-пути как начальную оценку либо консервативный начальный RTO. Расчёт по собственным RTT/jitter с запасом ограничить диапазоном 10мс..1с; 10мс — нижняя граница, не верхняя. + Текущая формула по выбору пользователя: 1.2*RTT+1.5*jitter+3мс, округление вверх; + начальный jitter после первого DATA ACK равен RTT/2, установившийся — EWMA отклонения. Добавить ротацию retry сразу, пока старый канал ещё UP; не откладывать до DOWN. Не оставлять промежуточный формат, в котором новый ACK продолжает обращаться только к last_link. diff --git a/doc/etcp_protocol.txt b/doc/etcp_protocol.txt index 907f16fd..7bfa10a2 100644 --- a/doc/etcp_protocol.txt +++ b/doc/etcp_protocol.txt @@ -36,7 +36,8 @@ HELLO/CHALLENGE/CONFIRM и keepalive передаются своим незав после сканирования проверяем появились ли в linked-list собранные данные которые можно переместить в выходную очередь. и перемещаем если есть. Таймер попыток каждого линка (etcp_tx.c): - - RTO = clamp(2*(data_rtt_us+data_jitter_us), 10000, 1000000) мкс. + - RTO = clamp(ceil(1.2*data_rtt_us + 1.5*data_jitter_us + 3000), 10000, 1000000) мкс. + Целочисленный расчёт использует uint64 и округляет вверх до целой микросекунды. RTT использует собственный DATA ACK минус receiver_delay; EWMA RTT=1/8, jitter=1/4 |RTT-EWMA|. Первый RTT задаёт jitter=RTT/2. До DATA ACK используется RTT keepalive этого же пути, без него RTO=1с. - FIFO содержит физические попытки в порядке принятия транспортом. Таймер назначается по старейшей; diff --git a/doc/tasks.md b/doc/tasks.md index 5af55d34..a27ef10e 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -8,11 +8,12 @@ Реализованы начальный pacing от 4*MSS/RTT, точные DATA B/s и ограниченный кредит shaper, разделение логического seq/payload и физических attempt_id, ACK/RTT/RTO каждого пути, ротация повторов A→B→C→A при UP-каналах, rollback отказавшего send и запрос потерянного till. - RTO=clamp(2*(RTT+jitter),10мс,1с). Пределы памяти: попытки 16384/линк, 32768/соединение, ACK 16384/линк. + RTO=clamp(ceil(1.2*RTT+1.5*jitter+3мс),10мс,1с), округление до мкс. Пределы: попытки 16384/линк, + 32768/соединение, ACK 16384/линк. Без RTT начальный RTO=1с. STARTUP завершается после целого раунда устойчивой очереди выше бюджета, без искусственного изменения BW. BBR20/20, windows26 сценариев PASS; восемь тестов ASAN/UBSan с detect_leaks=1 PASS; основной набор183/183 PASS. check.sh завершён успешно; дополнительные tcp_proxy_full/burst/load PASS (8 соединений,134217728 проверенных байт). - Полная штатная multipath-матрица: FAIL, 20 нарушений. Есть недобор RTT20/200мс и bidirectional; + Полная штатная multipath-матрица до смены формулы RTO: FAIL, 20 нарушений. Есть недобор RTT20/200мс и bidirectional; slow-drop даёт паузу401мс, два зависших пути676мс, DROP/HOLD под нагрузкой229–243мс. Ранние копии до RTO, здоровье/пробы каналов и STCP backpressure пока не реализованы; пороги тестов сохранены. OOM после принятия данных исправлен аварийной сменой эпохи с сохранением физических линков.