第3章 プロトコルアーキテクチャ

3.1 プロトコル階層

DTP は階層型アーキテクチャ設計を採用しており、上位から下位へ以下の順に構成されます:

┌─────────────────────────────────────────────┐
│           アプリケーション層                    │
│   iFay / coFay / Personal Data Heap          │
│   端末アプリケーション(ソフトウェア / ハードウェア)│
├─────────────────────────────────────────────┤
│           DTP プロトコル層                     │
│   DTP_Master Engine / DTP_Slave Engine       │
│   ┌───────────────────────────────────────┐ │
│   │ Agreement Manager(ネゴシエーション管理)│ │
│   │ Frame Codec(フレームコーデック)        │ │
│   │ DAG Manager(DAG 管理)                │ │
│   │ Encryption Module(暗号化モジュール)    │ │
│   │ Session Manager(セッション管理)       │ │
│   │ Resume Manager(再開管理)             │ │
│   └───────────────────────────────────────┘ │
├─────────────────────────────────────────────┤
│           アダプター層                        │
│   Transport_Adapter                          │
├─────────────────────────────────────────────┤
│           トランスポート層                     │
│   BLE / WebSocket / TCP / RTSP / ...         │
└─────────────────────────────────────────────┘

設計原則

  • トランスポート非依存性:Transport_Adapter により下位トランスポートを抽象化し、DTP コアロジックを具体的なトランスポートプロトコルから分離
  • ネゴシエーション優先:すべてのデータ伝送は双方のネゴシエーションで合意された約定に基づく必要があり、「裸の伝送」は存在しない
  • データ主権:マスター端がデータフローに対する最終決定権を持ち、スレーブ端はデータの生産者または消費者
  • エンドツーエンド暗号化:Payload は暗号化伝送され、FayGer ランタイムは平文にアクセス不可
  • コンテキスト保全:各 Fragment は構造化されたコンテキストメタデータを携帯し、データ収集時にコンテキストが失われないことを保証
  • 回復可能性:シーケンス番号に基づく再開メカニズムにより、接続中断後のシームレスな復旧をサポート

3.2 コアコンポーネント

DTP_Engine

DTP プロトコルのコア処理エンジンであり、2つのバリアントに分かれます:

  • 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(フレームコーデック)

Logical_Frame のシリアライズ(バイナリへのエンコード)とデシリアライズ(バイナリからのデコード)、およびフォーマット出力(Pretty Print)を担当します。異なるプラットフォーム間でフレームが正しく伝送されることを保証します。

DAG Manager(DAG 管理)

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
WaitingForCAPCAP 検証 + 鍵交換完了SessionEstablished
WaitingForCAPCAP 失敗 / タイムアウトIdle
SessionEstablishedRequest_Frame の発行または受信Negotiating
SessionEstablishedセッションタイムアウトによるクローズIdle
NegotiatingAgreement 成立Transmitting
Negotiatingネゴシエーション失敗 / 拒否SessionEstablished
TransmittingFragment の継続伝送Transmitting
Transmittingアグリーメントの動的調整Negotiating
Transmitting接続切断Suspended
TransmittingAgreement 終了(他にアクティブなアグリーメントなし)SessionEstablished
Suspended接続復旧 + CAP 再検証Resuming
SuspendedセッションタイムアウトIdle
Resuming再開ハンドシェイク完了Transmitting
Resuming復旧失敗Idle

3.4 マスター・スレーブ間インタラクションシーケンス

完全な DTP インタラクションは5つのフェーズに分かれます:

フェーズ 1:CAP 前処理

  • CAP が身分認証と鍵交換を完了

フェーズ 2:DTP セッション確立

  • マスター端がスレーブ端に対してセッション確立を発行し、Session_ID を生成

フェーズ 3a:データ収集ネゴシエーション(Master 発行)

  • Master が Request_Frame(データ収集リクエスト)を送信
  • Slave が Response_Frame(承認/拒否/代替案)で応答
  • Agreement 成立、Agreement_ID を生成

フェーズ 3b:データ注入ネゴシエーション(Slave 申請)

  • Slave が Request_Frame(データ注入申請)を送信
  • Master が Response_Frame(承認/拒否/代替案)で応答
  • Agreement 成立、Agreement_ID を生成

フェーズ 4:データ伝送

  • Slave → Master:Fragment(データ収集、Agreement_ID を携帯)
  • Master → Slave:Fragment(データ注入、Agreement_ID を携帯)

フェーズ 5:接続中断と復旧

  • 接続切断 → 接続再確立(CAP 再検証)→ 受信済み最高シーケンス番号を報告 → ブレークポイントから伝送を継続