docs: correct topology API and router timeout descriptions
This commit is contained in:
1 parent
d644126cac
commit
9ba78c084b
3 files changed
+13
-6
No files matched your search
+5
-1
@@ -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 устанавливает только одно подключение между двумя узлами. Это подключение может добавлять-убирать каналы связи (динамически) без разрыва соединения.
|
||||
Также каналы связи мониторятся и трафик распределяется между доступными каналами. Если канал определяется как недоступен - он исключается из обмена.
|
||||
|
||||
@@ -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. Повреждённый пакет не подтверждается как доставленный.
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user