You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

6.2 KiB

Подписанная запись узла

TOPO_NODE.timestamp — версия всей подписанной записи, а не отдельного адреса. Узел-владелец назначает Unix microseconds, строго больше предыдущей сохранённой версии. Имя, тип, активность, адреса, метаданные сокетов, REALITY и подпись заменяются вместе. Timestamp входит в подпись. Групповые пути и подсети остаются в TOPO_GROUP_NODE и не являются частью общей записи узла.

Получатель проверяет подпись до изменения реестра или маршрутов. Более свежая запись заменяет старую целиком, включая пустые списки адресов. Старые записи игнорируются; разные подписанные записи с одинаковым timestamp — конфликт. Повторное BGP-объявление может обновить путь, но не содержимое общей записи. 8-битный ver сохраняется как диагностический счётчик; свежесть определяется только timestamp.

Таблица node_snapshots хранит полную сериализованную запись без группового окружения. node_addresses остаётся проекцией для поиска и отображения, а не источником для восстановления подписанной записи. При наличии сохранённого snapshot загрузка использует его. Локальная публикация сохраняется до рассылки; ошибка сохранения не разрешает публикацию новой версии.

Timestamp 0 обозначает bootstrap-сведения без подписи (конфиг, приглашение, начальные адреса). Они могут помочь установить первое соединение, но не заменяют принятую подписанную запись. По BGP принимаются подписанные записи с ненулевым timestamp. Формат NODEINFO изменён без обратной совместимости.

После принятия BGP-записи node_conn_direct_update_node применяет адреса к существующему NCD-соединению. Отсутствующее соединение этот вызов не создаёт. Линки дополняются как при UP, так и до установления соединения; повторная доставка не создаёт дубликаты UDP/TCP. Работающие линки не закрываются только из-за смены списка адресов. NCD удерживает ссылку на общую запись, пока обслуживает соединение, и использует её при восстановлении.

node_conn_direct_open_node сверяет переданную запись с реестром/БД. Более свежая подписанная запись принимается целиком, старая уступает уже известной. Bootstrap-адреса не перекрывают подписанную запись даже при DOWN.

Конфигурационные подключения UTUN используют один адаптер init_client_connections для старта и reload. Все адреса, TCP и REALITY передаются NCD; адаптер не создаёт ETCP-линки. Новый набор handles открывается до освобождения старого; при ошибке старые handles сохраняются. Конфигурация удерживает один handle на клиента, независимо от количества его адресов.

Включение конфигурационного пира в UTUN-группу выполняет callback NCD UP. Транспортный UP и наличие callback старого etcp_connect больше не включают соединение в UTUN-группу автоматически. Входящий JOIN остаётся явным запросом участия. При пересоздании UTUN-группы учитываются её конфигурационные handles. Удаление клиента отправляет LEAVE_GROUP и освобождает удержание UTUN-группы с обеих сторон. Другие владельцы NCD сохраняют транспорт. Поздние NODEINFO и WITHDRAW от отсоединённого UTUN-пира игнорируются, чтобы не вернуть его маршруты. LEAVE ждёт backpressure через queue waiter и временно удерживает собственный NCD handle. Закрытие транспорта отменяет ожидание; новое участие в группе делает ожидающий LEAVE устаревшим, и он не отправляется. Причина удаления пира передаётся явно: только потеря транспорта запускает recovery каскадных маршрутов. Локальный/удалённый LEAVE и удаление битой member-записи не должны восстанавливать намеренно закрытое участие.

REALITY использует полное SNI до 255 символов; размер поля в записи узла согласован с транспортом. Если локального TCP listen-сокета нет, NCD может создать исходящий TCP-линк с выбором локального адреса операционной системой.