diff --git a/doc/etcp_protocol.txt b/doc/etcp_protocol.txt index 69400f9c..7e9c4d4e 100644 --- a/doc/etcp_protocol.txt +++ b/doc/etcp_protocol.txt @@ -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)] diff --git a/src/transport_layer/etcp_tx.h b/src/transport_layer/etcp_tx.h index 729255cc..145a7ad1 100644 --- a/src/transport_layer/etcp_tx.h +++ b/src/transport_layer/etcp_tx.h @@ -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);