Глава 3: Архитектура протокола

3.1 Уровневая структура протокола

DTP использует многоуровневую архитектуру, сверху вниз:

┌─────────────────────────────────────────────┐
│           Прикладной уровень                 │
│   iFay / coFay / Personal Data Heap          │
│   Терминальные приложения (ПО / Оборудование)│
├─────────────────────────────────────────────┤
│           Уровень протокола DTP              │
│   DTP_Master Engine / DTP_Slave Engine       │
│   ┌───────────────────────────────────────┐ │
│   │ Agreement Manager                      │ │
│   │ Frame Codec                            │ │
│   │ DAG Manager                            │ │
│   │ Encryption Module                      │ │
│   │ Session Manager                        │ │
│   │ Resume Manager                         │ │
│   └───────────────────────────────────────┘ │
├─────────────────────────────────────────────┤
│           Уровень адаптера                   │
│   Transport_Adapter                          │
├─────────────────────────────────────────────┤
│           Транспортный уровень               │
│   BLE / WebSocket / TCP / RTSP / ...         │
└─────────────────────────────────────────────┘

Принципы проектирования

  • Транспортная агностичность: через абстракцию Transport_Adapter основная логика DTP отделена от конкретных транспортных протоколов
  • Приоритет переговоров: вся передача данных должна основываться на соглашениях, согласованных обеими сторонами — «голой передачи» не существует
  • Суверенитет данных: master обладает окончательной властью принятия решений по потокам данных; slave является производителем или потребителем данных
  • Сквозное шифрование: Payload шифруется при передаче; среда выполнения FayGer не имеет доступа к данным в открытом виде
  • Сохранение контекста: каждый Fragment несёт структурированные контекстные метаданные, обеспечивая сохранение контекста при сборе данных
  • Восстанавливаемость: механизм возобновления на основе порядковых номеров поддерживает бесшовное восстановление после разрывов соединения

3.2 Основные компоненты

DTP_Engine

Ядро обработки протокола DTP, доступное в двух вариантах:

  • DTP_Master: работает на стороне Fay; обладает правом инициировать сбор данных и принимать решения по инъекции данных
  • DTP_Slave: работает на стороне терминала; отвечает за производство данных и запросы на инъекцию

Оба варианта разделяют базовые возможности — кодек фреймов, шифрование и управление DAG, — но различаются в правах на переговоры и направлении потока данных.

Transport_Adapter

Абстрактный интерфейс для нижележащих транспортных протоколов. DTP_Engine взаимодействует с конкретными транспортными протоколами через этот интерфейс, обеспечивая транспортную агностичность. Поддерживаемые транспортные протоколы включают BLE, WebSocket, TCP, RTSP и другие.

При разрыве нижележащего транспортного соединения Transport_Adapter сообщает DTP_Engine о событии изменения состояния соединения, запуская приостановку сессии и процесс возобновления.

Agreement Manager

Управляет полным жизненным циклом соглашений:

  1. Создание: инициирует запрос на переговоры
  2. Переговоры: обрабатывает запросы и ответы
  3. Активация: генерирует Agreement_ID после достижения консенсуса обеими сторонами
  4. Динамическая корректировка: изменяет параметры соглашения во время передачи
  5. Завершение: прекращает соглашение по директиве остановки

Frame Codec

Отвечает за сериализацию LogicalFrame (кодирование в двоичный формат) и десериализацию (декодирование из двоичного формата), а также форматированный вывод (Pretty Print). Обеспечивает корректную передачу фреймов между различными платформами.

DAG Manager

Управляет зависимостями направленного ациклического графа между Fragment:

  • Обнаружение циклов: предотвращает формирование циклических зависимостей
  • Разрешение зависимостей: обрабатывает случаи, когда целевые зависимости ещё не прибыли
  • Запросы связей: запрашивает зависимости и зависимые элементы Fragment

Encryption Module

Отвечает за сквозное шифрование и дешифрование Payload с использованием ключей, предварительно согласованных CAP. Гарантирует, что среда выполнения FayGer не имеет доступа к данным в открытом виде.

Session Manager

Управляет жизненным циклом сессий DTP:

  • Создание и закрытие сессий
  • Сохранение и восстановление состояния
  • Обнаружение тайм-аутов и освобождение ресурсов

Resume Manager

Управляет механизмом возобновления на основе порядковых номеров:

  • Управление кэшем Fragment
  • Отслеживание порядковых номеров
  • Координация восстановления с точки прерывания

3.3 Конечный автомат DTP_Engine

Рабочие состояния DTP_Engine описываются следующим конечным автоматом:

                    ┌──────────────────────────────────────────┐
                    │                                          │
    ┌───────┐      │  ┌──────────────┐    ┌────────────────┐  │
    │ Idle  │──────┼─▶│WaitingForCAP │───▶│SessionEstablished│ │
    │       │◀─────┼──│              │◀───│                │  │
    └───────┘      │  └──────────────┘    └───────┬────────┘  │
        ▲          │                              │            │
        │          │                              ▼            │
        │          │                     ┌─────────────┐       │
        │          │                     │ Negotiating │       │
        │          │                     └──────┬──────┘       │
        │          │                            │              │
        │          │                            ▼              │
        │          │                    ┌──────────────┐       │
        │          │                    │ Transmitting │       │
        │          │                    └───────┬──────┘       │
        │          │                            │              │
        │          │                            ▼              │
        │          │  ┌──────────┐      ┌─────────────┐       │
        └──────────┼──│ Resuming │◀─────│  Suspended  │       │
                   │  └──────────┘      └─────────────┘       │
                   └──────────────────────────────────────────┘

Описание переходов состояний:

Текущее состояниеСобытие-триггерЦелевое состояние
IdleПолучен запрос на подключениеWaitingForCAP
WaitingForCAPВерификация CAP + обмен ключами завершеныSessionEstablished
WaitingForCAPСбой CAP / тайм-аутIdle
SessionEstablishedRequest_Frame инициирован или полученNegotiating
SessionEstablishedЗакрытие сессии по тайм-аутуIdle
NegotiatingСоглашение достигнутоTransmitting
NegotiatingСбой переговоров / отклонениеSessionEstablished
TransmittingНепрерывная передача FragmentTransmitting
TransmittingДинамическая корректировка соглашенияNegotiating
TransmittingРазрыв соединенияSuspended
TransmittingСоглашение завершено (нет других активных соглашений)SessionEstablished
SuspendedСоединение восстановлено + повторная верификация CAPResuming
SuspendedТайм-аут сессииIdle
ResumingРукопожатие возобновления завершеноTransmitting
ResumingСбой восстановленияIdle

3.4 Последовательность взаимодействия Master-Slave

Полное взаимодействие DTP состоит из пяти фаз:

Фаза 1: Предварительная обработка CAP

  • CAP завершает верификацию личности и обмен ключами

Фаза 2: Установление сессии DTP

  • Master инициирует установление сессии со slave, генерируя Session_ID

Фаза 3a: Переговоры о сборе данных (инициируется Master)

  • Master отправляет Request_Frame (запрос на сбор данных)
  • Slave отвечает Response_Frame (принято / отклонено / контрпредложение)
  • Соглашение достигнуто, генерируется Agreement_ID

Фаза 3b: Переговоры об инъекции данных (инициируется Slave)

  • Slave отправляет Request_Frame (запрос на инъекцию данных)
  • Master отвечает Response_Frame (принято / отклонено / контрпредложение)
  • Соглашение достигнуто, генерируется Agreement_ID

Фаза 4: Передача данных

  • Slave → Master: Fragment (сбор данных, с Agreement_ID)
  • Master → Slave: Fragment (инъекция данных, с Agreement_ID)

Фаза 5: Прерывание и восстановление соединения

  • Разрыв соединения → Восстановление соединения (повторная верификация CAP) → Сообщение наивысшего полученного порядкового номера → Возобновление передачи с точки прерывания