From 8ff4a0bf46511c839fce7ed7cdc1313007a129fa Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 24 Oct 2026 15:24:05 +0200 Subject: [PATCH] Document ETCP receiver-clock bandwidth sampling --- doc/etcp_protocol.txt | 8 +++++--- src/transport_layer/etcp_bbr.h | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/etcp_protocol.txt b/doc/etcp_protocol.txt index b05302fd..2ade3882 100644 --- a/doc/etcp_protocol.txt +++ b/doc/etcp_protocol.txt @@ -116,9 +116,11 @@ ACK с подтверждениями также возвращает точку OOM до сохранения и отвергнутые DATA его не меняют. Считаются байты полезной нагрузки секции, без заголовков. При отправке попытка запоминает известную точку. ACK действующей попытки продвигает точку пути; повторный/чужой ID её не меняет, переставленные ACK не откатывают. Противоречивая пара логируется и игнорируется. -При положительных дельтах добавляется нижняя граница интервала ceil(delivered*delta_rx_us/delta_rx_bytes). -Итоговый interval — максимум трёх границ; BW может только уменьшиться относительно прежнего sample. -Счётчики и времена — uint64, часы двух сторон не сравниваются. Нулевые/неизвестные дельты не создают границы. +При положительных дельтах interval=max(send_us,ceil(delivered*delta_rx_us/delta_rx_bytes)). +Приёмный интервал заменяет ACK clock: обратная очередь больше не завышает BW сжатием ACK +и не занижает его растяжением. Send-интервал сохраняет защиту от сжатия приёмного времени. +Без достоверной приёмной базы/положительных дельт используется max(send_us,ack_us). +Счётчики и времена — uint64, часы двух сторон не сравниваются; нужны только дельты одних часов. Если интервал не представим в uint32, sample не используется для BW вместо насыщения, завышающего скорость. После пустого физического flight база начинается заново, чтобы простой не занижал скорость следующей передачи. Reset потока обнуляет точки приёма; исчерпание локального 64-битного счётчика закрывает соединение с ERROR. diff --git a/src/transport_layer/etcp_bbr.h b/src/transport_layer/etcp_bbr.h index 9fea04ad..f5bd2fd6 100644 --- a/src/transport_layer/etcp_bbr.h +++ b/src/transport_layer/etcp_bbr.h @@ -55,7 +55,7 @@ enum bbr_ack_phase { BBR_ACKS_INIT = 0, BBR_ACKS_REFILLING, BBR_ACKS_PROBE_ST struct bbr_rate_sample { uint32_t delivered; // байты, подтверждённые за измерительный интервал; не только текущим ACK - uint32_t interval_us; // измерительный интервал, мкс; ETCP берёт max(send,ACK,приёмная граница); 0 — нет оценки BW + uint32_t interval_us; // мкс; ETCP: max(send,приёмная граница), без RX-базы max(send,ACK); 0 — нет оценки BW uint32_t rtt_us; // RTT линка, мкс; 0 — пока неизвестен uint32_t acked_sacked; // новые подтверждённые байты текущего ACK; только они увеличивают общий delivered uint32_t prior_delivered; // счётчик delivered при отправке подтверждённого пакета, modulo 2^32