diff --git a/doc/node_snapshot.md b/doc/node_snapshot.md index 5d9a8f62..611e329a 100644 --- a/doc/node_snapshot.md +++ b/doc/node_snapshot.md @@ -88,10 +88,21 @@ READY сессии. Принятая подписанная запись и пу доставка не создаёт дубликаты UDP/TCP. Работающие линки не закрываются только из-за смены списка адресов. NCD удерживает ссылку на общую запись, пока обслуживает соединение, и использует её при восстановлении. +Для обхода адресов NCD делает отдельную копию: callbacks транспорта могут заменить +списки в общем реестре до завершения обхода. Удержание ссылки на запись сохраняет +сам объект, но не старые списки. Обновление, открытие и добавление нового сокета +используют общий подбор разрешённых пар: family, UDP/TCP, локальная политика, +NAT-профиль и обязательные метаданные REALITY. IPv6 link-local требует netif_index. +Новый сокет обслуживает NCD-транспорты вне FIN_WAIT; случайный выбор одного адреса не используется. `node_conn_direct_open_node` сверяет переданную запись с реестром/БД. Более свежая подписанная запись принимается целиком, старая уступает уже известной. Bootstrap-адреса не перекрывают подписанную запись даже при DOWN. +ID узла проверяется по public_key. Ошибка запуска возвращает NULL handle и не снимает +прежний FIN_WAIT. Отдельно принятый snapshot и уже добавленные линки при частичной +ошибке могут сохраниться; новый handle публикуется после подготовки ресурсов. +Явный specific_sock задаёт локальную политику, сохраняя проверки family/протокола/цели/REALITY; +автоматическое появление сокета использует обычную политику подбора. Конфигурационные подключения UTUN используют один адаптер `init_client_connections` для старта и reload. Все адреса, TCP и REALITY diff --git a/doc/service_lifecycle.md b/doc/service_lifecycle.md index 0055b075..ed27c3fe 100644 --- a/doc/service_lifecycle.md +++ b/doc/service_lifecycle.md @@ -107,6 +107,21 @@ KEEP_ALIVE полностью отменяет FIN_WAIT. Ожидание CLOSE для спящего пира увеличивается до его RX deadline. Сам факт DOWN во время FIN_WAIT завершает ранее запрошенное мягкое закрытие. +NCD возвращает новый handle после подготовки подписки на все события ETCP и нужных +таймеров. До возврата open новый владелец событий не получает; уже работающий +транспорт доставляет начальный UP через call_soon. Отказ подписки, таймера или +планирования UP возвращает ошибку и сохраняет прежних владельцев и FIN_WAIT. +TIMEOUT не закрывает удерживаемый транспорт: возможен поздний UP, новое open может +начать новый бюджет подключения. CLOSED отменяет таймеры, отсоединяет conn и требует +закрыть оставшийся handle; его можно закрыть после уничтожения ядра. +Операции открытия, обновления линков и закрытия удерживают NCD/ETCP через вложенные +callbacks, включая синхронный callback исходящей очереди при отправке CLOSE. +Более новый вложенный переход прекращает оставшуюся рассылку прежнего события. +Управляющий пакет NCD занимает ровно 10 байт: cmd=0x12, subcmd и node_id little-endian. +Приём проверяет длину, команду и принадлежность отправителя тому же транспорту. +Отказы ресурсов, вложенные события, обновление snapshot и удаление соседних линков +проверяет `test_ncd_faults`; готовый handle, TIMEOUT и сетевой CLOSE/KEEP_ALIVE — `test_node_conn_direct`. + Контроль RX независим от отправки keepalive. Объявленный сон не отключает проверку жизни: срок от последнего RX равен максимуму согласованного keepalive timeout и объявленного остатка ACTIVE+SLEEP с запасом normal timeout. Фазовые таймеры и наши