From d5114f36b4903ae3dbbcc37253cc47d4c829f0fd Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 24 Oct 2026 16:11:17 +0200 Subject: [PATCH] Clarify timestamp RTT role in transport contracts --- doc/etcp_protocol.txt | 5 +++-- src/transport_layer/etcp_connections.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/etcp_protocol.txt b/doc/etcp_protocol.txt index ebd20ff2..2afaf0c0 100644 --- a/doc/etcp_protocol.txt +++ b/doc/etcp_protocol.txt @@ -45,7 +45,7 @@ HELLO/CHALLENGE/CONFIRM и keepalive передаются своим незав seq отдельно подтверждает логическую доставку. till освобождает логические записи, без BBR/снятия чужого flight. - timestamp (0x06): обновляем RTT и EWMA |ΔRTT| пути; recv_dt_avg хранит поправки времени TX/RX в Q16. У conn rtt_last — среднее RTT линков, rtt_avg_10 — их максимум (имя историческое). - Для BBR/RTO используются отдельные DATA RTT/jitter, измеренные по ACK физических попыток. + BBR использует отдельные DATA RTT/jitter по ACK физических попыток; RTO также учитывает rtt_last своего линка. - [0x00] payload: сохраняем фрагмент в recv_q либо распознаём уже сохранённый/доставленный seq. Только после этого ставим ACK с seq+attempt_no в ack_q принявшего линка; OOM до сохранения не подтверждается. после сканирования проверяем появились ли в linked-list собранные данные которые можно переместить в выходную очередь. и перемещаем если есть. @@ -194,7 +194,8 @@ Reset линка снимает флаг и серию RTO. Новых очер - RECV_Rel_Timestamp: uint16_t = last_recv_local_time - last_recv_timestamp (относительное смещение между локальным и удалённым временем) Всего 5 байт. Добавляется только если last_recv_updated=1 (был принят пакет с момента последней отправки) - и если прошло менее 100с (dt < 1000000 таймбаз). Секция не является источником DATA RTT для BBR/RTO. + и если прошло менее 100с (dt < 1000000 таймбаз). Результат rtt_last задаёт нижнюю границу RTT для RTO; + DATA RTT и min_rtt BBR обновляются только ACK действующих физических попыток. 3. Полезная нагрузка - заголовок 0x00 (одна секция и всегда последняя): [0x00] [ID 4 байта LE] [attempt_no 2 байта LE] [данные...] - ID: uint32_t, номер фрагмента 1..UINT32_MAX в пределах одной эпохи потока. diff --git a/src/transport_layer/etcp_connections.h b/src/transport_layer/etcp_connections.h index 883b0ee0..679e372a 100644 --- a/src/transport_layer/etcp_connections.h +++ b/src/transport_layer/etcp_connections.h @@ -289,7 +289,7 @@ struct ETCP_LINK { uint64_t acked_bytes; // подтверждённых байт на этом линке uint64_t acked_packets; // подтверждённых пакетов на этом линке - uint16_t rtt_last; // round trip (время отправки + приёма) + uint16_t rtt_last; // Последний timestamp-RTT, 0.1мс (0 до измерения); нижняя граница RTT для RTO uint32_t jitter; // Current jitter [>>16] x0.1 ms // rtt_avg10 удалён — заменён BBR (bbr->min_rtt_us/100) uint32_t recv_dt_avg_tx; // EWMA поправки TX timestamp, Q16 в единицах 0.1 мс, арифметика по модулю 2^32