Document of c-modernization-kit (porter) 1.0.0
Loading...
Searching...
No Matches
シーケンス

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

サービス開始 (送信者)

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

サービス開始 (送信者)

サービス開始 (受信者)

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

サービス開始 (受信者)

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

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

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

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

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

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

フラグメント化と結合

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

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

NACK による再送

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

NACK による再送

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

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

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

リオーダー - 通常モード 待機中に届いた場合

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

リオーダー - RAW モード 待機中に届いた場合

REJECT による切断と復帰

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

REJECT による切断と復帰

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

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

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

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

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

サービス終了 (potrCloseService)

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

送信者側の終了

正常終了 (送信者側)

受信者側の終了

正常終了 (受信者側)

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

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

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

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

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

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

補足:接続状態の遷移

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

unicast_bidir 1:1 双方向通信

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

unicast_bidir 通信シーケンス

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

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

unicast_bidir N1 接続

unicast_bidir N:1 サーバでの切断

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

unicast_bidir N1 切断

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

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

unicast_bidir タイムアウト

TCP サービス開始 (SENDER)

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

TCP サービス開始 (SENDER)

TCP サービス開始 (RECEIVER)

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

TCP サービス開始 (RECEIVER)

TCP 正常接続・通信・切断

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

TCP 正常シーケンス

TCP SENDER 再起動・自動再接続

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

TCP 再接続シーケンス

TCP PING 応答タイムアウト

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

TCP PING 応答タイムアウト

TCP RECEIVER 側 PING タイムアウト

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

TCP RECEIVER PING タイムアウト

TCP マルチパス

TCP マルチパス接続確立

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

TCP マルチパス接続確立

部分切断時の継続

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

TCP 部分切断時の継続

全 path 切断

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

TCP 全 path 切断