61 lines
6.2 KiB
Markdown
61 lines
6.2 KiB
Markdown
# Подписанная запись узла
|
|
|
|
`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-линк с выбором локального адреса операционной системой.
|