Открыть сервис

Rfab: протокол и формат удалённого вызова функций

Rfab (Remote Function Activation Bridge) — это сетевой протокол прикладного уровня и одноимённый формат сообщений, предназначенный для организации удалённого вызова процедур (RPC) между распределёнными компонентами программных систем. Протокол обеспечивает передачу запросов на выполнение функций и возврат результатов их работы через транспортные среды, поддерживающие обмен текстовыми или бинарными данными, и ориентирован на использование в микросервисной архитектуре, системах интернета вещей (IoT) и встраиваемых решениях.

История

Разработка Rfab началась в 2016 году в рамках исследовательского проекта группы российских разработчиков, занимавшихся проблемами совместимости гетерогенных устройств в концепции «умного дома». Изначально проект носил название Remote Function Activation Protocol (RFAP) и представлял собой закрытую спецификацию для внутреннего использования. В 2018 году спецификация была переработана, получила сокращённое наименование Rfab и была опубликована под свободной лицензией MIT, что позволило использовать её в коммерческих и открытых проектах без ограничений.

Ключевым стимулом для создания Rfab стала избыточная сложность существующих RPC-решений (таких как XML-RPC, SOAP, gRPC) для задач, требующих малого объёма служебного трафика и минимальной задержки. В отличие от них, Rfab изначально проектировался как лёгкий протокол с возможностью работы поверх различных транспортных уровней: TCP, UDP, WebSocket, последовательного порта (UART) и даже шины I²C. В 2020 году вышла версия 2.0, добавившая поддержку потоковой передачи данных и асинхронных уведомлений. По состоянию на 2025 год актуальной является версия 2.3, поддерживаемая сообществом разработчиков.

Архитектура и принцип работы

Rfab использует модель «клиент-сервер», где клиент инициирует вызов функции, а сервер выполняет её и возвращает ответ. Взаимодействие строится на обмене сообщениями фиксированной структуры, которые называются кадрами (frames). Кадр состоит из заголовка и тела. Заголовок содержит идентификатор функции (Function ID), идентификатор транзакции (Transaction ID), флаги управления и контрольную сумму. Тело кадра содержит сериализованные параметры вызова или результат.

Для сериализации данных Rfab поддерживает два формата: компактный бинарный (по умолчанию) и текстовый на основе JSON. Бинарный формат использует собственную схему кодирования типов (целые числа, числа с плавающей запятой, строки, булевы значения, массивы, словари), что позволяет достичь высокой плотности упаковки данных. Текстовый режим предназначен для отладки и интеграции с веб-технологиями.

Идентификация функций

Каждая функция на сервере регистрируется под уникальным числовым идентификатором (Function ID) в диапазоне от 1 до 65535. Сопоставление идентификатора с фактическим кодом выполняется на этапе инициализации сервера. Такой подход исключает необходимость передачи длинных строковых имён функций в каждом запросе, что снижает объём трафика. Для динамического обнаружения доступных функций предусмотрен встроенный метод system.list, возвращающий таблицу соответствий.

Управление транзакциями

Каждый вызов получает уникальный Transaction ID, который позволяет сопоставлять ответы с запросами при параллельном выполнении. Протокол поддерживает три режима выполнения: синхронный (клиент блокирует ожидание ответа), асинхронный (клиент продолжает работу и получает ответ позже) и потоковый (сервер отправляет несколько сообщений-результатов в рамках одной транзакции, например, при передаче больших массивов данных или телеметрии).

Формат сообщений

Сообщения Rfab делятся на четыре типа: запрос (request), успешный ответ (response), ответ с ошибкой (error) и уведомление (notification). Уведомления не требуют ответа и используются для передачи событий от сервера клиенту (например, изменение состояния датчика).

Структура бинарного заголовка фиксирована и занимает 12 байт:

ПолеРазмер (бит)Назначение
Версия протокола4Номер версии (для v2.x — значение 2)
Тип сообщения4Код типа (запрос, ответ, ошибка, уведомление)
Флаги8Признаки сжатия, шифрования, потокового режима
Function ID16Идентификатор вызываемой функции
Transaction ID32Идентификатор транзакции
Длина тела32Размер тела сообщения в байтах

Контрольная сумма (CRC16) вычисляется по заголовку и телу и помещается в конец кадра. Максимальный размер тела по умолчанию ограничен 64 килобайтами, однако это значение может быть изменено настройками конкретной реализации.

Применение

Rfab нашёл применение в нескольких областях, где требуется лёгкий и быстрый RPC:

  • Встраиваемые системы и IoT. Благодаря малому потреблению памяти (минимальная реализация занимает около 4 КБ flash и 512 байт RAM) протокол используется для управления микроконтроллерами ESP32, STM32 и Arduino. Примером служит проект открытой платформы автоматизации теплиц, где Rfab обеспечивает связь между центральным контроллером и датчиками.
  • Микросервисная архитектура. Rfab применяется для внутреннего взаимодействия между легковесными сервисами, когда использование HTTP/REST или gRPC избыточно. В частности, протокол используется в одном из российских банков для обмена данными между модулями скоринга.
  • Мобильные приложения. Текстовый режим Rfab поверх WebSocket используется в ряде приложений для синхронизации данных с сервером в реальном времени.
  • Промышленная автоматизация. В системах диспетчерского управления (SCADA) протокол применяется для опроса программируемых логических контроллеров (ПЛК) по промышленным сетям.

Реализации

Существует несколько официальных и сторонних реализаций Rfab:

  • libRfab — эталонная реализация на языке C, поддерживающая работу через сокеты, последовательный порт и пользовательские транспортные адаптеры.
  • rfab-py — реализация на Python для быстрой разработки прототипов и серверной логики.
  • Rfab.js — реализация на JavaScript для Node.js и браузеров, работающая поверх WebSocket.
  • rfab-rs — реализация на Rust, ориентированная на высоконагруженные системы.

Все реализации совместимы между собой при условии использования одинаковой версии протокола и формата сериализации.

Безопасность

Протокол не определяет встроенных механизмов аутентификации и шифрования, полагаясь на нижележащий транспортный уровень. При работе через незащищённые сети рекомендуется использовать TLS (для TCP/WebSocket) или DTLS (для UDP). Для авторизации вызовов предусмотрен необязательный заголовок с токеном доступа, который проверяется серверной стороной. В бинарном формате поддерживается сжатие тела сообщений алгоритмом Deflate, что снижает объём передаваемых данных при работе с текстовыми структурами.

Критика и ограничения

Основные замечания к Rfab связаны с отсутствием стандартизированного механизма обнаружения сервисов (service discovery) и ограниченной экосистемой по сравнению с gRPC или Apache Thrift. Числовая адресация функций усложняет обновление API, требуя синхронизации реестра идентификаторов между клиентом и сервером. Кроме того, фиксированный 12-байтовый заголовок считается избыточным для ультракоротких сообщений в сетях с низкой пропускной способностью (например, LoRaWAN). Разработчики проекта отвечают на это указанием на возможность использования сокращённого заголовка (8 байт) в режиме совместимости.

Литература и источники

  • Спецификация протокола Rfab версии 2.3 (официальный документ проекта).
  • Документация библиотеки libRfab.
  • Статья «Лёгкие RPC-протоколы для встраиваемых систем» в журнале «Современная электроника», № 4, 2021.
  • Репозиторий проекта Rfab на GitHub (раздел документации).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →