2.1.9 コネクション障害

ネットワーク障害または自システム内の異常によって,メッセージ送受信中にコネクション障害を検出すると,コネクションが解放され,メッセージを送受信できなくなります。このように,オンライン終了時を除いて,運用コマンドやAPIを使用しないでコネクションが解放されることを,コネクションの切断といいます。

ここでは,コネクションの切断と,相手アドレス指定時,または相手アドレスチェックの抑止時のコネクション障害について説明します。

<この項の構成>
(1) コネクションの切断
(2) 相手アドレス指定時,または相手アドレスチェックの抑止時のコネクション障害

(1) コネクションの切断

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オプションありfinFINパケット
rstRSTパケット
API(dc_mcf_tdctcn関数またはCBLDCMCF('TDCTCN△△'))強制解放オプションなし※1任意FINパケット
強制解放オプションあり※2finFINパケット
rstRSTパケット
相手システムからの解放任意FINパケット
OpenTP1終了
  • 正常終了
  • 強制正常終了
  • 計画停止A
  • 計画停止B
  • MCF構成変更準備停止
任意FINパケット
強制停止finFINパケット※3
rstRSTパケット
障害の検出サーバ型コネクションの確立拒否任意FINパケット
上記以外(受信バッファ数不足,後続セグメント受信監視タイムアウトなど)finFINパケット
rstRSTパケット
注※1
dc_mcf_tdctcn関数の場合,action引数にDCMCFFRCを指定しません。
CBLDCMCF('TDCTCN△△')の場合,データ名D1に空白または'0'を指定します。
注※2
dc_mcf_tdctcn関数の場合,action引数にDCMCFFRCを指定します。
CBLDCMCF('TDCTCN△△')の場合,データ名D1に'1'を指定します。
注※3
Windowsの場合,RSTパケットを送信します。
注意
  • TP1/NET/TCP/IPはOSが提供するTCP/IPのソケットインタフェースを利用しています。そのため,FINパケットを送信する指定をしていても,ネットワーク上のデータのすれ違いなどによって,TP1/NET/TCP/IPの指示と関係なくOSがRSTパケットを送信する場合があります。
  • RSTパケットによるコネクション解放の場合,TCP/IPソケットの送信バッファに蓄積されている送信メッセージがコネクション解放時に破棄されます。送信メッセージが相手システムに到達してからコネクションを解放する場合は,メッセージの送達を確認してからコネクションを解放してください。送達確認については,「2.3.10 メッセージ送達の確認」を参照してください。

(2) 相手アドレス指定時,または相手アドレスチェックの抑止時のコネクション障害

次に示す場合,TP1/NET/TCP/IPは,コネクションの切断後にどの相手システムとコネクションを確立するか特定できません。

このような場合に出力キューまたは入力キューにメッセージがあるときは,次のことに注意する必要があります。

(a) コネクション障害時に出力キューにメッセージがある場合

いったんコネクションが解放されると,そのコネクションは次にどの相手システムと接続するのか特定できないため,現在出力キューにあるメッセージが本来のあて先でない相手に送信される場合があります。

このため,コネクション確立前に,出力キューに残っている不要なメッセージを運用コマンド(mcftdlqle)の入力,またはAPI(dc_mcf_tdlqle関数もしくはCBLDCMCF('TDLQLE△△'))の発行によって削除するようにしてください。ただし,出力キューに残っている不要なメッセージを削除するタイミングよりも早く,別の相手システムと接続されてメッセージが送信されてしまう場合があります。相手システムが不要なメッセージを受信してしまった場合は,メッセージ受信後にそのメッセージを破棄してください。

コネクション障害時に出力キューにメッセージがあるときの流れを,dc_mcf_send関数を使用する場合を例に次の図に示します。

図2-19 コネクション障害時に出力キューにメッセージがある場合の流れ

[図データ]

なお,MHPからメッセージを送信する場合は,コネクション再確立時に未送信メッセージの送信を抑止できます。詳細については,「2.3.12 コネクション再確立時の未送信メッセージの送信抑止」を参照してください。

(b) コネクション障害時に入力キューにメッセージがある場合

いったんコネクションが解放されると,そのコネクションは次にどの相手システムと接続するのかを特定できないため,現在入力キューにあるメッセージが,現在接続している相手システムから送信されたものではない場合があります。したがって,UAP側で,メッセージ内容などからどの相手システムから送信されたメッセージなのかを判断する必要があります。

コネクション障害後に入力キューからメッセージを取り出したときの流れを,dc_mcf_receive関数を使用する場合を例に次の図に示します。

図2-20 コネクション障害後に入力キューからメッセージを取り出した場合の流れ

[図データ]