Сейчас идёт тестирование: код на GitHub будет открыт после завершения.

Протокол — клиент ↔ сервер

Полная спецификация каждого байта, передаваемого на клиентском порту (по умолчанию 5225). Она состоит из аутентификационного хендшейка, выполняемого один раз сразу после подключения, за которым следует бинарный протокол блокировок на основе кадров. Каждый официальный клиент реализует эту спецификацию идентично, байт в байт.

На каждой странице сообщения раздел «Структура» показывает расположение полей, а «Пример» — фактически передаваемые байты (значения меняются по refresh).

Обозначение байтов: op показан как символ ASCII (например, A); wait и lease — бинарные значения u8, а token и owner — бинарные значения u64 big-endian. Они показаны в hex (например, wait=505). key и addrтекст в UTF-8, а reasonтекст ASCII; все они имеют переменную длину, обозначаемую в структуре как N. Завершающий \n (перевод строки) заканчивает кадр как 0A. Поля передаются подряд без разделителей.

Фиксированные заголовки (wait, lease, token, owner) — бинарные значения и могут содержать 0x0A, поэтому парсер обязан сначала вычитать фиксированный заголовок по количеству байт для данного op, и только затем искать перевод строки. Длины: запросы A = 10 Б / R = 8 Б, ответы A = 16 Б / T·B·R·N = 8 Б / M·L·E = 0 Б.

Содержание

Протокол консенсуса кластера (Raft) между серверами описан на отдельной странице.