Ticketing
Документация

Установление соединения · аутентификация

Соединение между пирами (Raft-порт = клиентский порт + 1000) устанавливается в точности в том же порядке, что и на клиентском порту. В самом протоколе нет процедуры различения клиента и пира — роль определяется только портом.

  1. TCP-подключение — инициатором всегда является вызывающая (dial) сторона
  2. Если на сервере включён TLS — TLS-хендшейк
  3. Аутентификационный хендшейк — один раз; спецификация (challenge · digest · ответ) байт в байт совпадает с клиентским портом
  4. Далее — обмен RPC с префиксом длины

Поток

Вызывающий узел (dial)
Принимающий узел
TCP-подключение (Raft-порт = клиентский + 1000)
если на сервере включён TLS — TLS-хендшейк
challenge (SHA-256 ␣ nonce)
digest — вычислен по первому токену из cluster_tokens
проверка идёт по всему списку cluster_tokens
далее — обмен RPC Raft с префиксом длины
запросответRPC консенсуса (Raft)

Отличия от клиентского порта

ПараметрКлиентский портRaft-порт
Набор токенов для проверкиclient_tokenscluster_tokens
Токен отправляющей сторонытокен, заданный клиентомпервый токен из cluster_tokens
После аутентификациикадры, завершаемые \nRPC с префиксом длины
  • При приёме проверка идёт по всему списку cluster_tokens, поэтому, перечислив старый и новый токен вместе и выполнив последовательный перезапуск узлов, токен можно заменить без простоя (Конфигурация (переменные окружения)).
  • Если включён TLS, Raft-порт использует тот же сертификат. Вызывающая сторона проверяет сертификат собеседника через tls_ca (или системное хранилище доверия, если он не задан), а tls_skip_verify предназначен только для тестов.
  • При ошибке аутентификации соединение закрывается после E auth_failed — так же, как и на клиентском порту.