# シーケンス

本ドキュメントは porter の主要な動作シナリオをシーケンス図で示します。

# 1 サービス開始 (送信者)

`potrOpenService()` を SENDER として呼び出したときの内部処理です。

サービス開始 (送信者)

# 2 サービス開始 (受信者)

`potrOpenService()` を RECEIVER として呼び出したときの内部処理です。

サービス開始 (受信者)

# 3 正常送受信 (ノンブロッキング)

`POTR_SEND_BLOCKING` を指定せずに `potrSend()` を呼び出したときのデータフローです。

正常送受信 (ノンブロッキング)

# 4 正常送受信 (ブロッキング)

`POTR_SEND_BLOCKING` を指定して `potrSend()` を呼び出したときのデータフローです。
送信完了まで `potrSend()` が返りません。

正常送受信 (ブロッキング)

# 5 フラグメント化と結合

送信データが `max_payload` を超える場合の分割・結合処理です。

フラグメント化と結合 (3 フラグメントの例)

# 6 NACK による再送

パケットロスが発生した場合の再送シーケンスです。

NACK による再送

# 7 リオーダーバッファ (reorder_timeout_ms > 0)

`reorder_timeout_ms` を 0 より大きな値に設定すると、欠番検出後にただちに NACK や DISCONNECTED を発行せず、指定時間だけ待機します。待機中に欠落パケットが届いた場合は NACK/DISCONNECTED を発行せずに正常配信します。

## 7.1 通常モード: 待機中に届いた場合 (NACK なし)

リオーダー - 通常モード: 待機中に届いた場合 (NACK なし)

## 7.2 RAW モード: 待機中に届いた場合 (DISCONNECTED なし)

リオーダー - RAW モード: 待機中に届いた場合 (DISCONNECTED なし)

# 8 REJECT による切断と復帰

送信ウィンドウから evict 済みのパケットを要求した場合のシーケンスです。

REJECT による切断と復帰

# 9 ヘルスチェック (正常疎通)

ヘルスチェックが有効な場合の定周期 PING 送信です。

ヘルスチェック (正常疎通)

# 10 ヘルスチェックタイムアウト

PING が届かなくなった場合の切断検知と復帰です。

ヘルスチェックタイムアウト

# 11 サービス終了 (potrCloseService)

`potrCloseService()` による正常終了シーケンスです。

## 11.1 送信者側の終了

正常終了 (送信者側)

## 11.2 受信者側の終了

正常終了 (受信者側)

# 12 RAW モード: ギャップ検出による切断と復帰 (DATA)

DATA パケットの追い越し (欠落) を検出した場合のシーケンスです。

RAW モード - DATA ギャップ検出

# 13 RAW モード: ギャップ検出による切断と復帰 (PING)

PING の `seq_num` から欠落パケットを検出した場合のシーケンスです。

RAW モード - PING ギャップ検出

# 14 補足：接続状態の遷移

接続状態遷移 (受信者側 health_alive フラグ)

# 15 unicast_bidir 1:1 双方向通信

`POTR_TYPE_UNICAST_BIDIR` における双方向データ通信のシーケンスです。
両端が独立したセッションを持ち、それぞれがデータ送受信・NACK・ヘルスチェックを行います。

unicast_bidir 通信シーケンス

# 16 unicast_bidir N:1 サーバでの接続と送受信

`POTR_TYPE_UNICAST_BIDIR` を N:1 モードで開いたサーバが、新規クライアントを受け付けて `peer_id` ごとに通信するシーケンスです。

unicast_bidir N1 接続

# 17 unicast_bidir N:1 サーバでの切断

サーバは FIN 受信、`potrDisconnectPeer()`、またはヘルスチェックタイムアウトによりピア単位で切断を処理します。

unicast_bidir N1 切断

# 18 unicast_bidir ヘルスタイムアウトによる切断検知

`POTR_TYPE_UNICAST_BIDIR` において、相手側が停止した場合の切断検知シーケンスです。1:1 モードでは相手端単位、N:1 モードでは各 `peer_id` 単位で `last_recv_tv_sec` を監視し、`health_timeout_ms` 超過で切断を検知します。

unicast_bidir タイムアウト

# 19 TCP サービス開始 (SENDER)

`potrOpenService()` を TCP SENDER として呼び出したときの内部処理です。
`potrOpenService()` はすぐに返り、接続確立は connect スレッドが非同期に行います。

TCP サービス開始 (SENDER)

# 20 TCP サービス開始 (RECEIVER)

`potrOpenService()` を TCP RECEIVER として呼び出したときの内部処理です。

TCP サービス開始 (RECEIVER)

# 21 TCP 正常接続・通信・切断

TCP SENDER / RECEIVER 間の正常な接続確立・データ送信・切断シーケンスです。

TCP 正常シーケンス

# 22 TCP SENDER 再起動・自動再接続

SENDER プロセスが再起動した場合に自動再接続が行われるシーケンスです。

TCP SENDER 再起動・自動再接続

# 23 TCP PING 応答タイムアウト

RECEIVER のアプリケーション層がハングした場合に SENDER が切断を検知するシーケンスです。
TCP 接続は OS レベルで生存していてもアプリ層の PING 応答が途絶えることで検知します。

TCP PING 応答タイムアウト

# 24 TCP RECEIVER 側 PING タイムアウト

SENDER のアプリケーション層がハングして PING 送信が停止した場合に RECEIVER が切断を検知するシーケンスです。
TCP 接続は OS レベルで生存していても、PING 要求が届かなくなることで RECEIVER が検知します。

TCP RECEIVER 側 PING タイムアウト

# 25 TCP マルチパス

## 25.1 TCP マルチパス接続確立

path 数 = 2 の例。RECEIVER が 2 つの listen ソケットを用意し、SENDER が各 path に接続します。
最初の 1 本が接続した時点で `POTR_EVENT_CONNECTED` が発火します。

TCP マルチパス接続確立（path 数 = 2）

## 25.2 部分切断時の継続

1 本の path が切断しても残りの path で通信を継続します。
`POTR_EVENT_DISCONNECTED` は発火しません。

TCP 部分切断時の継続（path 0 切断）

## 25.3 全 path 切断

全 path が切断した時点で `POTR_EVENT_DISCONNECTED` が発火します。

TCP 全 path 切断