Describe receiver-clock bandwidth bounds and ACK wire format

This commit is contained in:
evgeny committed 2026-10-23 16:44:07 +02:00
1 parent 6fc964031c
commit ea5a0b7d5a
2 files changed
+19 -1

No files matched your search

+17 -1
View File
@@ -80,6 +80,18 @@ ACK ограничивается последним назначенным seq (
BBR каждого линка получает ACK/loss samples и возвращает cwnd и pacing rate.
Скорость — доставленные байты за max(интервал отправки, интервал доставки), по снимкам при отправке.
Интервал между соседними ACK не используется: ACK одной пачки могут обрабатываться в один tick.
ACK с подтверждениями также возвращает точку приёма своего пути: накопленные DATA-байты и монотонное время
последнего увеличения счётчика. В счётчик входят допустимые сохранённые/уже доставленные DATA, включая копии;
OOM до сохранения и отвергнутые DATA его не меняют. Считаются байты полезной нагрузки секции, без заголовков.
При отправке попытка запоминает известную точку. ACK действующей попытки продвигает точку пути;
повторный/чужой ID её не меняет, переставленные ACK не откатывают. Противоречивая пара логируется и игнорируется.
При положительных дельтах добавляется нижняя граница интервала ceil(delivered*delta_rx_us/delta_rx_bytes).
Итоговый interval — максимум трёх границ; BW может только уменьшиться относительно прежнего sample.
Счётчики и времена — uint64, часы двух сторон не сравниваются. Нулевые/неизвестные дельты не создают границы.
Если интервал не представим в uint32, sample не используется для BW вместо насыщения, завышающего скорость.
После пустого физического flight база начинается заново, чтобы простой не занижал скорость следующей передачи.
Reset потока обнуляет точки приёма; исчерпание локального 64-битного счётчика закрывает соединение с ERROR.
RTT/min_rtt, формула RTO, политика окна и дедлайн ACK не корректируются приёмной точкой.
Внутренняя полоса — байты/мкс Q16; pacing — байты/с, BDP — байты, без повторного множителя MSS.
Минимальное окно BBR — четыре DATA-фрагмента normalizer; максимальное — bbr_max_cwnd (по умолчанию 1048576).
8192 — нижняя допустимая граница настройки bbr_max_cwnd; транспорт не повышает до неё текущее окно.
@@ -121,7 +133,11 @@ pending/частичный буфер normalizer; ограничение окн
- seq: uint32_t — номер подтверждаемого пакета
- attempt_id: uint64_t — ID конкретной физической попытки DATA; возвращается только тем же путём
- delay_us: uint32_t — задержка между приёмом DATA и формированием ACK, мкс; UINT32_MAX исключает RTT sample
Каждая запись = 16 байт, база ACK = 8 байт; count=0 допустим для передачи till.
При count>0 после всех записей обязательно добавляется [rx_data_bytes(8 LE)][rx_data_time_us(8 LE)].
Это точка приёма всего пути на момент формирования ACK, а не отдельной подтверждаемой попытки.
Время — монотонные микросекунды получателя при последнем положительном приросте DATA-байтов; 0/0 — точки нет.
Каждая запись = 16 байт, база ACK = 8 байт; полный размер = 8+16*count+(count>0 ? 16 : 0).
count=0 допустим для передачи till, точки приёма не содержит. До обработки проверяется вся длина ACK.
ACK_REQUEST: [0x0a], одна секция длиной 1 байт, запрос повторной отправки актуального till.
в) channel timestamp (добавляется после выбора канала передачи, если есть свежие данные):
[0x06] [RET_Timestamp(2 байта LE)] [RECV_Rel_Timestamp(2 байта LE)]
+2
View File
@@ -49,6 +49,8 @@ void etcp_tx_complete(struct ETCP_DGRAM* dgram, int success);
* Неизвестный старый ID не создаёт измерение и не вычитает окно. UINT32_MAX delay — RTT недостоверен.
* peer_rx_bytes/time_us — согласованная точка приёма пути из ACK; 0/0 — неизвестна.
* Достоверная пара ограничивает BW темпом приёма, сохраняя границы send/ACK; RTT и доставка от неё не зависят.
* interval=max(send_us,ack_us,ceil(delivered*delta_rx_us/delta_rx_bytes)); дельты от снимка при отправке.
* Используется неубывающая точка пути; старый/чужой attempt не меняет её, перестановка ACK не откатывает.
* Непредставимый интервал не создаёт оценку BW. Пустой flight заново начинает приёмную базу, исключая простой. */
void etcp_tx_ack(struct ETCP_LINK* link, uint32_t seq, uint64_t attempt_id, uint32_t receiver_delay_us,
uint64_t peer_rx_bytes, uint64_t peer_rx_time_us);