diff --git a/src/transport_layer/etcp.h b/src/transport_layer/etcp.h index 65cec78e..6eab68b6 100644 --- a/src/transport_layer/etcp.h +++ b/src/transport_layer/etcp.h @@ -322,8 +322,6 @@ void etcp_conn_fatal_reinit(struct ETCP_CONN* etcp, const char* reason); * Нулевая и прежняя эпохи игнорируются. Сброс при смене выполняется после CONFIRM, своя эпоха сохраняется. Возврата нет. */ void etcp_conn_apply_peer_reset_id(struct ETCP_CONN* conn, uint64_t peer_reset_id); -void etcp_connection_ready(struct ETCP_CONN* etcp);// вызывается когда подключение инициализировано - // Отправка: используем api ll_queue для очереди ETCP_CONN.input_queue // Прием: используем api ll_queue для очереди ETCP_CONN.output_queue // для очередей используется формат diff --git a/src/transport_layer/etcp_connections.h b/src/transport_layer/etcp_connections.h index da230a75..b0484630 100644 --- a/src/transport_layer/etcp_connections.h +++ b/src/transport_layer/etcp_connections.h @@ -69,7 +69,7 @@ extern "C" { #pragma pack(push, 1) struct ETCP_DGRAM {// пакет (незашифрованный) struct ETCP_LINK* link;// откуда получена или куда отправялем - uint16_t data_len;// общий размер пакета не включая timestamp + uint16_t data_len;// длина data, включая открытый хвост; без timestamp/flag_up uint16_t noencrypt_len;// число байт (с конца) которые не надо шифровать. для передачи pubkey uint16_t payload_len; // локальные метаданные request_pkt: DATA-байты; 0 — только ACK/control/FILLER, вне DATA-pacing struct ETCP_TX_ATTEMPT* attempt; // локальный резерв окна; complete снимает/фиксирует его после send @@ -81,7 +81,7 @@ struct ETCP_DGRAM {// пакет (незашифрованный) }; #pragma pack(pop) -// Размер зашифрованного заголовка ETCP_DGRAM (timestamp + flag_up + padding) +// Размер зашифрованного заголовка ETCP_DGRAM: timestamp(2) + flag_up(1). #define ETCP_ENCRYPTED_HDR_SIZE (offsetof(struct ETCP_DGRAM, data) - offsetof(struct ETCP_DGRAM, timestamp)) // Размер базового ACK: type(1) + count(1) + last_delivered_id(4) + rx_dup_count(2) @@ -95,6 +95,7 @@ static inline unsigned etcp_ack_section_size(uint8_t count) { // INIT внутри шифрованного тела, до padding: запрос — 67 байт, ответ — 64 байта. // Каждая сторона передаёт свою эпоху reset_id; смена известной эпохи подтверждается через etcp_session. +// В обоих направлениях до изменения состояния отклоняются link_id=0 и mtu1500 ограничивается. // INIT REQUEST: client → server. До изменения транспорта проверить 67-байтовое тело и node_id по X25519-ключу; padding допустим. struct ETCP_INIT_REQUEST_PKT { @@ -206,7 +207,7 @@ struct ETCP_SOCKET { #define LINK_STATE_CONNECTED 3 // Тип функции-перехватчика отправки UDP. -// Если link->send_hook != NULL, etcp_udp_send вызывает её вместо socket_sendto. +// etcp_udp_send вызывает hook вместо socket_sendto; SOCKS5-релей сокета имеет приоритет над hook. struct ETCP_LINK; typedef ssize_t (*etcp_udp_send_fn_t)(socket_t fd, const void* buf, size_t len, const struct sockaddr* addr, socklen_t addr_len, @@ -227,7 +228,7 @@ struct ETCP_LINK { // Параметры соединения uint16_t mtu; // MTU общий - uint16_t mtu_local; // MTU моего зла + uint16_t mtu_local; // MTU локального узла uint16_t mtu_remote; // MTU удаленного узла uint16_t keepalive_interval; // Keepalive интервал (x1ms) uint32_t recovery_interval; // recovery интервал (x0.1ms) @@ -247,7 +248,7 @@ struct ETCP_LINK { // Состояние установки соединения (только для клиентов) void* init_timer; // Таймер для повторов INIT (NULL=не подключается) - uint16_t init_timeout; // Текущий таймаут в мс + uint16_t init_timeout; // Интервал повторов INIT, x0.1 мс: от 500 (50 мс) до 50000 (5 с) uint16_t init_retry_count; // Счетчик попыток // uint64_t last_activity; // Время последней активности @@ -288,8 +289,8 @@ struct ETCP_LINK { uint16_t rtt_last; // round trip (время отправки + приёма) uint32_t jitter; // Current jitter [>>16] x0.1 ms // rtt_avg10 удалён — заменён BBR (bbr->min_rtt_us/100) - uint32_t recv_dt_avg_tx; // дельта времени для отправленных пакетов (относительное время отправки) x256 - uint32_t recv_dt_avg_rx; // дельта времени для принятых пакетов (относительное время отправки) x256 + uint32_t recv_dt_avg_tx; // EWMA поправки TX timestamp, Q16 в единицах 0.1 мс, арифметика по модулю 2^32 + uint32_t recv_dt_avg_rx; // EWMA поправки RX timestamp, тот же формат; используется для оценки rt_last uint16_t tt_last; // transmit time (время доставки отправленных пакетов) uint16_t rt_last; // recv time (время доставки принятых пакетов) @@ -358,7 +359,7 @@ struct ETCP_LINK { uint32_t bbr_pacing_rate; // Точный pacing B/s; менять через set_pacing_rate для пересчёта долга/таймера uint32_t bbr_loss_since_ack; // счётчик потерь на линке с последнего ACK (для rs->lost) - etcp_udp_send_fn_t send_hook; // NULL = socket_sendto напрямую + etcp_udp_send_fn_t send_hook; // Перехват прямого UDP; NULL = socket_sendto, SOCKS5 имеет приоритет void* send_hook_ctx; struct sockaddr_storage local_bound_addr; // локальный адрес к которому привязан линк (interface_addr на момент создания) @@ -372,7 +373,7 @@ struct ETCP_LINK { // ── Внутренняя отправка пакетов ── -// Единая точка отправки всех ETCP-пакетов. +// Отправить UDP: SOCKS5 сокета, иначе send_hook, иначе socket_sendto. Возвращает число байт или -1. ssize_t etcp_udp_send(struct ETCP_LINK* link, socket_t fd, const void* buf, size_t len, const struct sockaddr* addr, socklen_t addr_len); @@ -445,9 +446,8 @@ struct ETCP_LINK* etcp_link_find_by_addr(struct ETCP_SOCKET* e_sock, const struc struct ETCP_LINK* etcp_select_collision_link(struct ETCP_CONN* conn, struct ETCP_SOCKET* e_sock, const struct sockaddr_storage* addr); -// find free local_link_id for connection -// scans all links in connection, marks used ids in bit array -// returns first free id (0-255) or -1 if all occupied +// Выбрать свободный local_link_id в 1..255 циклически после last_assigned_link_id; 0 зарезервирован. +// Помечает ID имеющихся линков в битовой карте; возвращает ID или -1, если свободных нет. int etcp_find_free_local_link_id(struct ETCP_CONN* etcp); // ── Внутренние измерения пропускной способности ──