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 ID | 16 | Идентификатор вызываемой функции |
| Transaction ID | 32 | Идентификатор транзакции |
| Длина тела | 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 →
