ネットワーク障害または自システム内の異常によって,メッセージ送受信中にコネクション障害を検出すると,コネクションが解放され,メッセージを送受信できなくなります。このように,オンライン終了時を除いて,運用コマンドやAPIを使用しないでコネクションが解放されることを,コネクションの切断といいます。
ここでは,コネクションの切断と,相手アドレス指定時,または相手アドレスチェックの抑止時のコネクション障害について説明します。
TP1/NET/TCP/IPは障害通知イベント(CERREVT)によって,障害の発生とコネクションの切断を通知します。送信中の場合,該当メッセージはコネクション再確立後に再送されますが,受信中の場合,該当メッセージは破棄されます。
コネクション障害時の対策については,「9.2 コネクション障害時の処理」を参照してください。
コネクションの切断を,次の図に示します。
図2-18 コネクションの切断
主に障害の検出によって自システムからコネクションを解放する場合,コネクション定義(mcftalccn -f)のcnreleaseオペランドを指定することで,コネクションの解放形態を指定できます。解放形態には,FINパケットを送信してコネクションを解放する形態(finを指定)と,RSTパケットを送信して強制的にコネクションを解放する形態(rstを指定)があります。コネクションを解放する要因と送信するパケットを次の表に示します。
表2-3 コネクションの解放要因と送信するパケット
コネクションの解放要因 | コネクション定義(mcftalccn -f)のcnreleaseオペランドの指定値 | 送信するパケット | |
---|---|---|---|
mcftdctcnコマンド | -fオプションなし | 任意 | FINパケット |
-fオプションあり | fin | FINパケット | |
rst | RSTパケット | ||
API(dc_mcf_tdctcn関数またはCBLDCMCF('TDCTCN△△')) | 強制解放オプションなし※1 | 任意 | FINパケット |
強制解放オプションあり※2 | fin | FINパケット | |
rst | RSTパケット | ||
相手システムからの解放 | 任意 | FINパケット | |
OpenTP1終了 |
| 任意 | FINパケット |
強制停止 | fin | FINパケット※3 | |
rst | RSTパケット | ||
障害の検出 | サーバ型コネクションの確立拒否 | 任意 | FINパケット |
上記以外(受信バッファ数不足,後続セグメント受信監視タイムアウトなど) | fin | FINパケット | |
rst | RSTパケット |
次に示す場合,TP1/NET/TCP/IPは,コネクションの切断後にどの相手システムとコネクションを確立するか特定できません。
このような場合に出力キューまたは入力キューにメッセージがあるときは,次のことに注意する必要があります。
いったんコネクションが解放されると,そのコネクションは次にどの相手システムと接続するのか特定できないため,現在出力キューにあるメッセージが本来のあて先でない相手に送信される場合があります。
このため,コネクション確立前に,出力キューに残っている不要なメッセージを運用コマンド(mcftdlqle)の入力,またはAPI(dc_mcf_tdlqle関数もしくはCBLDCMCF('TDLQLE△△'))の発行によって削除するようにしてください。ただし,出力キューに残っている不要なメッセージを削除するタイミングよりも早く,別の相手システムと接続されてメッセージが送信されてしまう場合があります。相手システムが不要なメッセージを受信してしまった場合は,メッセージ受信後にそのメッセージを破棄してください。
コネクション障害時に出力キューにメッセージがあるときの流れを,dc_mcf_send関数を使用する場合を例に次の図に示します。
図2-19 コネクション障害時に出力キューにメッセージがある場合の流れ
なお,MHPからメッセージを送信する場合は,コネクション再確立時に未送信メッセージの送信を抑止できます。詳細については,「2.3.12 コネクション再確立時の未送信メッセージの送信抑止」を参照してください。
いったんコネクションが解放されると,そのコネクションは次にどの相手システムと接続するのかを特定できないため,現在入力キューにあるメッセージが,現在接続している相手システムから送信されたものではない場合があります。したがって,UAP側で,メッセージ内容などからどの相手システムから送信されたメッセージなのかを判断する必要があります。
コネクション障害後に入力キューからメッセージを取り出したときの流れを,dc_mcf_receive関数を使用する場合を例に次の図に示します。
図2-20 コネクション障害後に入力キューからメッセージを取り出した場合の流れ