第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(ネゴシエーション管理)
アグリーメントの完全なライフサイクルを管理します:
- 作成:ネゴシエーションリクエストの発行
- ネゴシエーション:リクエストとレスポンスの処理
- アクティベーション:双方が合意に達した後、Agreement_ID を生成
- 動的調整:伝送中にアグリーメントパラメータを変更
- 終了:停止指示によりアグリーメントを終了
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 |
| WaitingForCAP | CAP 検証 + 鍵交換完了 | SessionEstablished |
| WaitingForCAP | CAP 失敗 / タイムアウト | Idle |
| SessionEstablished | Request_Frame の発行または受信 | Negotiating |
| SessionEstablished | セッションタイムアウトによるクローズ | Idle |
| Negotiating | Agreement 成立 | Transmitting |
| Negotiating | ネゴシエーション失敗 / 拒否 | SessionEstablished |
| Transmitting | Fragment の継続伝送 | Transmitting |
| Transmitting | アグリーメントの動的調整 | Negotiating |
| Transmitting | 接続切断 | Suspended |
| Transmitting | Agreement 終了(他にアクティブなアグリーメントなし) | 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 再検証)→ 受信済み最高シーケンス番号を報告 → ブレークポイントから伝送を継続
