From 9ba78c084b64f854acd6486a1a636d0116428d60 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 21 Oct 2026 15:40:56 +0200 Subject: [PATCH] docs: correct topology API and router timeout descriptions --- doc/etcp_arch.md | 6 +++++- src/routing_layer/etcp_router_doc.md | 2 +- src/routing_layer/topo_node.h | 11 +++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/doc/etcp_arch.md b/doc/etcp_arch.md index 37b4e2a7..a52182cb 100644 --- a/doc/etcp_arch.md +++ b/doc/etcp_arch.md @@ -1,4 +1,8 @@ -Архитектура etcp: +> Исторический документ: описания NAT, модулей и ограничения обмена маршрутами ниже не отражают текущую реализацию. +> Актуальные правила группового обмена маршрутами — в [topo_group.h](../src/routing_layer/topo_group.h), +> модель узла — в [node_snapshot.md](node_snapshot.md), протокол роутера — в [etcp_router_doc.md](../src/routing_layer/etcp_router_doc.md). + +Архитектура etcp: ETCP устанавливает только одно подключение между двумя узлами. Это подключение может добавлять-убирать каналы связи (динамически) без разрыва соединения. Также каналы связи мониторятся и трафик распределяется между доступными каналами. Если канал определяется как недоступен - он исключается из обмена. diff --git a/src/routing_layer/etcp_router_doc.md b/src/routing_layer/etcp_router_doc.md index 1a956a54..385f114a 100644 --- a/src/routing_layer/etcp_router_doc.md +++ b/src/routing_layer/etcp_router_doc.md @@ -47,7 +47,7 @@ Challenge защищает от случайных старых/перестав - `inflight_q`: неизменяемое тело с подписью, без списка посещённых узлов, обычно до 256 пакетов. Каждый ретрансмит начинает новый список; ошибка не теряет pending-пакет. - ACK принимается только в модульном интервале `(tx_acked, tx_sent]`. Дубликаты, старые и выходящие за границу ACK не продлевают ожидание прогресса. Удаляются существующие inflight-записи, а не перебираются все номера до произвольного ACK. - Новые DATA и ретрансмиты идут по одному через waiter физической `send_input_q`. При смене пути отменяется waiter на очереди, где он действительно был зарегистрирован, включая уже запланированный callback. -- Каждые 300 ms без прогресса планируется проход повторной отправки. После 17 попыток без ACK соединение закрывается. Отсутствующий маршрут проверяется каждые 20 ms; очередь сохраняется. Пока первичный handshake не завершён, HELLO повторяется без отдельного таймаута. +- Каждые 300 ms без прогресса ACK планируется проход повторной отправки. Логический канал закрывается после 67 циклов без прогресса для `ETCP_RT_ID_CALL` (около 20 s), для остальных сервисов — после 17 циклов (около 5 s). Отсутствующий маршрут проверяется каждые 20 ms; очередь сохраняется. Пока первичный handshake не завершён, HELLO повторяется без отдельного таймаута. - Watchdog 500 ms восстанавливает отправку и переносит waiter при смене заблокированного пути. - Сброс физического ETCP сохраняет router inflight и seq. Восстановление самого ETCP-handshake остаётся обязанностью транспортного слоя. - Crypto decode/проверка подписи выполняются до помещения в reorder и изменения rx_seq. Повреждённый пакет не подтверждается как доставленный. diff --git a/src/routing_layer/topo_node.h b/src/routing_layer/topo_node.h index 3c0bd2e7..64cdb9a2 100644 --- a/src/routing_layer/topo_node.h +++ b/src/routing_layer/topo_node.h @@ -258,8 +258,9 @@ int topo_node_serialize(struct TOPO_NODE* ni, struct TOPO_GROUP_NODE* nq, int topo_node_deserialize(struct TOPO_GROUP* group, const uint8_t* data, size_t len, struct TOPO_NODE** out_ni, struct TOPO_NODESUBNETS** out_subnets, uint64_t** out_hop_list, uint8_t* out_hop_count, uint16_t* out_cumulative_rtt); -/* Заимствованный список hops: кратчайший живой путь, иначе первый сохранённый. - * out_count обязателен; NULL означает отсутствие пути. */ +/* Заимствованный список hops выбранного живого пути nq: минимум переходов, затем ID соседа. + * out_count обязателен; out_rtt необязателен и получает RTT цепочки без локального линка (0.1 ms). + * Если живого пути нет, возвращает NULL и обнуляет выходные значения. Память списка не освобождать. */ uint64_t* topo_node_best_hop_list(struct TOPO_GROUP_NODE* nq, uint8_t* out_count, uint16_t* out_rtt); /* Лучший живой путь: минимум переходов, затем ID соседа. Указатель заимствованный. */ struct TOPO_NODEPATH* topo_node_best_path(const struct TOPO_GROUP_NODE* nq); @@ -278,7 +279,8 @@ int topo_node_format_all(struct TOPO_GROUP* group, char* buf, size_t buf_size); int topo_node_ping_request_cbk(struct TOPO_GROUPS* groups, uint64_t node_id); /* Обновить время ping и минимальные RTT во всех группах и БД; rtt в единицах 0.1 ms. */ void topo_node_ping_update_rtt(struct TOPO_GROUPS* groups, uint64_t node_id, uint16_t rtt); -/* Минимальный суммарный RTT живого пути в единицах 0.1 ms; UINT16_MAX, если неизвестен. */ +/* Суммарный RTT выбранного живого пути nq: RTT локального соединения + RTT оставшейся цепочки (0.1 ms). + * Путь выбирается по числу переходов и ID соседа. UINT16_MAX — нет пути, неизвестен локальный RTT или сумма насыщена. */ uint16_t topo_get_chain_rtt(struct TOPO_GROUP_NODE* nq); /* Лимиты буфера подписываемых данных и полного сетевого NODEINFO. */ @@ -303,8 +305,9 @@ static inline const struct TOPO_SUBNET6* topo_v6_subnets(const struct TOPO_NOD /* Найти reality-инфо сокета по socket_id (NULL, если сокет без reality). */ const struct TOPO_REALITY_SOCK* topo_node_find_reality_sock(const struct TOPO_NODE* ni, uint8_t socket_id); -/* Заполнить link->reality из reality-инфо пира (rs из BGP). link->reality_set = 1. */ +/* Скопировать REALITY-параметры пира rs в cfg и задать fingerprint OPENSSL; оба указателя обязательны. Возврата нет. */ void topo_node_reality_config(struct reality_client_config *cfg, const struct TOPO_REALITY_SOCK *rs); +/* Заполнить link->reality из rs и установить link->reality_set=1; при NULL аргументе ничего не делает. Возврата нет. */ void topo_node_apply_reality(struct ETCP_LINK* link, const struct TOPO_REALITY_SOCK* rs); #ifdef __cplusplus