説明

受信プログラム、送信プログラム、送受信システム、および送受信方法

【課題】高スループットだがデータの到達を保証しないプロトコルを使って、高スループットと高信頼性という利点を兼ね備えた通信を可能とする。
【解決手段】送信元コンピュータ101は、異なるパケット間の送信順序を示す送信順序情報104を管理し、同じ送信対象データ103に対しては同じ送信順序情報104を付加して二つのパケット105と106を作成し、それぞれ経路107と108を介して送信先コンピュータ102に送信する。送信先コンピュータ102は、過去に受信したパケットに含まれる送信順序情報にもとづいて、次に受信されると期待されるパケットに対応する順序を表す受信順序情報111を管理し、受信したパケット105または106から送信順序情報109または110を取得して受信順序情報111と比較し、比較の結果、パケットの重複や消失を判断する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、データの到達を保証しないプロトコルによるデータの送信の信頼性を、送信経路を多重化することにより高める技術に関する。
【背景技術】
【0002】
従来から、様々な分野でネットワークを介したデータの転送が行われている。データの転送は様々なプロトコルにしたがって行われるが、特に、TCP(Transmission Control
Protocol)とUDP(User Datagram Protocol)は広く利用されているプロトコルである。TCPとUDPはいずれもOSI(Open Systems Interconnection)参照モデルのトランスポート層(レイヤ4ともいう)のプロトコルであり、ネットワーク層(レイヤ3ともいう)のプロトコルであるIP(Internet Protocol)と組み合わされて広く利用されている。
【0003】
TCPとUDPには以下のような違いがあるので、利用分野の性質に応じて、TCPとUDPのうち適切な方のプロトコルが使われる。
・TCPは送信先までデータが到達することを保証するプロトコルだが、UDPはそのような保証をしないプロトコルである。
【0004】
・送信にエラーが生じた場合、TCPによるデータ転送では自動的にパケットが再送されるが、UDPによるデータ転送では単にパケットが破棄されるだけである。
・TCPは実際の通信を開始する前にコネクションを確立するコネクション型のプロトコルだが、UDPはコネクションレス型のプロトコルである。
【0005】
・以上のように、TCPはデータの送信自体以外の様々な処理が必要なのに対して、UDPはそのような処理を行わない。したがって、TCPによるデータ転送よりUDPによるデータ転送の方が高速であり、スループットが高い。逆に言うと、TCPによるデータ転送は送達確認や再送制御をともなうため信頼性が高いが、UDPによるデータ転送は信頼性が低い。
【0006】
TCPとUDPのどちらのプロトコルを利用するかは、データの量、データを送信する目的、データの種類など、種々の要因を考慮に入れて決められる。一般には、信頼性を重視するアプリケーションではTCPが利用され、処理速度を重視するアプリケーションではUDPが利用されることが多い。しかし、高スループットと高信頼性を両立することが求められる場合もある。
【0007】
例えば、フォールトトレラントなシステムでは、2台のコンピュータを組にして、一方をアクティブ(現用)装置、他方をスタンバイ(待機)装置として利用することがある。このような構成を採用すると、アクティブ装置に障害が発生しても、アクティブ装置とスタンバイ装置を切り換えることにより、外部にサービスを提供し続けることが可能である。つまり、このような構成により、サービスの可用性(アベイラビリティ)を高められる。
【0008】
アクティブ装置とスタンバイ装置の切り換えを行うには、まず、アクティブ装置が保持するデータをスタンバイ装置に引き継ぎ、データを同期化する必要がある。アクティブ装置とスタンバイ装置がネットワークを介して接続されている場合、データの引き継ぎは、ネットワークを介したデータ転送をともなう。
【0009】
サービスの可用性という観点からは、明らかに、アクティブ装置とスタンバイ装置の切り換えにかかる時間は短いほど好ましい。よって、データ同期化のためのデータ転送は、高速であることが望ましい。一方で、このような多重化されたシステムにおいては、現在のアクティブ装置が保持するデータが確実に現在のスタンバイ装置に引き継がれることも必要である。
【0010】
このような例においては、高スループットというUDPの利点と、TCPのような高信頼性を両立することが求められている。
UDPのようにデータの到達を保証しない通信プロトコルを使う場合に、信頼性を高める方法には、一般的に次の第一の方法と第二の方法がある。
【0011】
第一の方法は、UDPなどの通信プロトコルを呼び出す上位層のソフトウェアにより、受信側ではデータパケットを受信したら送達確認パケットを返信するよう制御し、送信側では送達確認パケットが受信されなければデータパケットを再送するよう制御する方法である。これにより、通信プロトコル自体に送達確認や再送制御が組み込まれていなくても、送達確認と再送が実現され、信頼性が向上する。
【0012】
しかし、この方法には、データ送信にエラーが生じると、再送までにある程度の待ち時間がかかってしまうという欠点がある。つまり、エラーの発生がスループットの低下に直結する。もともと、データの到達を保証しない通信プロトコルを使うのは、高スループットが要求される場合が多いので、このように明らかなスループットの低下をともなう方法は望ましくない。
【0013】
第二の方法は、伝送路を多重化する方法である。すべての伝送路に同時に障害が生じる確率が、無視しても問題がない程度に低ければ、複数の異なる伝送路を介してそれぞれ同じデータを送信することにより、事実上、少なくとも一つの伝送路を介してデータが確実に送信先に届く。しかし、この方法の問題は、データの送信先、すなわち受信側から見ると、複数の伝送路から重複してデータが送られることである。
【0014】
この問題を解決する一つの方法は、特許文献1と2に記載されているように、受信側の装置が、データを受信する伝送路を選択的に切り換えて、一つの伝送路だけからデータを受信する方法である。
【0015】
特許文献1のバス型二重化伝送装置は、二つのバス型伝送路にそれぞれ接続された、二つの送信器と、二つの受信器と、二つの異常検出回路とを備える。異常検出回路は、それぞれの伝送路の異常を検出し、その出力は系切換制御回路に接続されている。データ送信時には、二つの送信器から二つのバス型伝送路に同じデータが送信される。データ受信時には、系切換制御回路が系選択器に正常な伝送路を選択させ、選択された伝送路に接続された受信器がデータを受信する。
【0016】
特許文献2の二重化伝送路切換方式は、二重化された伝送路を介して互いに送受信する伝送装置が、送信時に二つの伝送路を同時に選択し、受信時には正常な一方の伝送路を選択する方式である。特許文献2の発明は、受信する伝送路の切換に伴って発生する次の1フレーム分のデータの棄却の割合、および、前回のフレームに対する診断では正常と診断されていたがフレーム外で異常が発生した伝送路を先着系と誤認する割合を低減することを目的としている。なお、先着系とは、二つの伝送路がともに正常な場合において先にデータを受信した系を指し、受信する伝送路として優先的に選択される。
【特許文献1】特開平8−163153号公報
【特許文献2】特開平8−223185号公報
【発明の開示】
【発明が解決しようとする課題】
【0017】
しかしながら、上記のとおり第一の方法には、データ送信にエラーが生じると、再送までにある程度の時間がかかってしまうという欠点がある。また、上記第二の方法では、伝送路を二重化した利点が十分に活かされないことがある。
【0018】
例えば、実際には第一の伝送路に故障が発生しており、第二の伝送路は正常なのに、両者とも正常だと誤って判断されて、その結果、第一の伝送路が偶然、データを受信すべき伝送路として選択されることがありうる。このようなことは、伝送路の異常を検出する回路に故障が発生した場合や、伝送路が正常だと判断された直後に実際の故障が発生し、データが送信される場合などに起こりうる。
【0019】
この例では、実際には第二の伝送路からは正常にデータが送信されているにもかかわらず、受信側の装置は、第二の伝送路がデータを受信すべき伝送路として選択していないため、正常なデータを受信することができない。つまり、第二の伝送路を介して送信された正常なデータを無駄に捨ててしまうことにより、データが正しく送信先に届く割合が低下している。
【0020】
そこで本発明の目的は、高スループットだがデータの到達を保証しないプロトコルを使って、高スループットと高信頼性という利点を兼ね備えた通信を可能とすることであり、特に、スループットおよび/または信頼性が無駄に低下することを避けることである。
【課題を解決するための手段】
【0021】
本発明による受信プログラムは、データの到達を保証しないプロトコルにより送信元コンピュータから複数の経路のそれぞれを介して、異なるパケット間の送信順序を示す送信順序情報を含めて送信された同内容のパケットを受信して、パケットの重複および消失を判別する処理を送信先コンピュータに制御させる。
【0022】
前記受信プログラムは、前記複数の経路のいずれを介して送信された前記パケットでも受信する受信ステップと、受信した前記パケットから、前記送信順序情報を取得する送信順序情報取得ステップと、過去に受信した前記パケットの前記送信順序情報にもとづいて管理され、次に受信されると期待されるパケットに対応する順序を表す受信順序情報を、格納手段から取得する受信順序情報取得ステップと、前記送信順序情報が表す第一の順序と前記受信順序情報が表す第二の順序を比較する比較ステップと、前記第一の順序が前記第二の順序よりも前の場合に、前記受信ステップで受信した前記パケットが、過去に受信した他のパケットと重複すると判断する重複判断ステップと、前記第一の順序と前記第二の順序が等しい場合に、前記格納手段に格納された前記受信順序情報が表す順序が前記第二の順序の次の順序になるよう前記格納手段を更新する正常処理ステップと、前記第一の順序が前記第二の順序よりも後の場合に、パケットの消失が生じたと判断する消失判断ステップと、を前記送信先コンピュータに実行させる。
【0023】
また、本発明による送信プログラムは、前記送信順序情報を格納手段から取得する送信順序情報取得ステップと、前記格納手段に格納されている前記送信順序情報を更新する送信順序情報更新ステップと、同じ前記送信順序情報および同じ送信対象のデータを含む、前記複数の経路のそれぞれに対応する複数のパケットを作成するパケット作成ステップと、前記複数の経路のそれぞれを介して前記プロトコルにより前記複数のパケットを前記送信先コンピュータに送信する送信ステップと、を前記送信元コンピュータに実行させる。
【0024】
パケットの送信先と送信元のコンピュータが、それぞれ前記受信プログラムと前記送信プログラムにしたがって動作することにより、少なくとも一つの経路が正常ならば、必ず
パケットが送信先コンピュータに届く。また、複数の経路が正常な場合、複数の同内容のパケットが送信先コンピュータに届くが、重複して届いたパケットは重複したと判断される。一方、送信先コンピュータは、パケットの順序が入れ替わって受信された場合や、複数の経路のすべてが異常でパケットが消失した場合など、送信された順序どおりにパケットを受信することができなかった場合を、上記消失判断ステップにより判別することができる。
【0025】
本発明は、前記送信元コンピュータおよび前記送信先コンピュータを含むシステム、および前記送信元コンピュータが前記送信先コンピュータにパケットを送信する方法も提供する。
【発明の効果】
【0026】
本発明によれば、少なくとも一つの経路が正常ならば必ずパケットが送信先コンピュータに届き、重複や消失を送信先コンピュータが判別することができるので、データの到達を保証しないプロトコルを利用していても信頼性が高い。
【0027】
また、送信先コンピュータは、パケットを受信する経路を切り換えるのではなく、複数の経路のいずれを介して送信されたパケットでも受信する。つまり、送信先コンピュータに到達したパケットは漏れなく受信される。よって、切り換え処理のタイミングや切り換え処理の不具合が原因で信頼性が低下することはない。
【0028】
データの到達を保証するための種々の処理を含まないプロトコルは、それら種々の処理を含む他のプロトコルに比べて、高スループットという特徴がある。本発明では、そのような高スループットのプロトコルを利用してパケットの送信が行われる。
【0029】
また、一つの経路のみを利用し、その経路での送信が失敗したことを検知してから再送処理を行う方法では必然的に遅延時間が発生する。しかし、本発明では、一つの経路に異常が発生しても他の経路が正常ならば、特段の遅延時間を必要とせずに、パケットが送信先コンピュータに到達する。
【0030】
すなわち、本発明によれば、データの到達を保証しないプロトコルを利用して、高信頼性と高スループットを両立させることができる。
【発明を実施するための最良の形態】
【0031】
以下、本発明の実施形態について、図面を参照しながら詳細に説明する。説明の順序は次のとおりである。まず、図1を参照して本発明の原理を説明した後、図2を参照して本発明を利用したシステムの構成を説明する。その後は、図2の実施形態を例にして、図3のデータ転送制御表、図4のスレッドの構成、図5のパケットの構成、図6〜図9のフローチャート、図10〜図13の処理シーケンス図について説明する。その後、本発明のプログラムを実行するコンピュータのブロック図である図14について説明し、最後に、様々な変形例について説明する。
【0032】
図1は、本発明の原理を示す図である。図1は、送信対象データ103が送信元コンピュータ101から送信先コンピュータ102に送信される流れを示している。
送信元コンピュータ101から送信先コンピュータ102に送信する対象のデータは、送信対象データ103である。送信元コンピュータ101と送信先コンピュータ102は複数の通信経路(以下、単に「経路」という)により接続されている。各経路は、有線、無線、またはその組み合わせによる経路である。図1には二つの経路107と108を図示してある。経路107と108を介した通信は、データの到達を保証しないプロトコルにより行われる。また、データはそのプロトコルで定義されたパケットの形式で送信され
る。プロトコルの例はUDPである。
【0033】
送信対象データ103が確実に送信先コンピュータ102に到達するという意味での信頼性を高めるために、送信元コンピュータ101は、複数の経路のそれぞれを介して、同じ送信対象データ103を含むパケット105と106を送信先コンピュータ102に送信する。
【0034】
送信先コンピュータ102は、受信したパケットに含まれる送信対象データ103を利用して、実施形態に応じた処理を行う。しかし、単に送信元コンピュータ101が同内容のパケットを複数送信し、送信先コンピュータ102が同じ処理を重複して行うのでは、無駄が多い。よって、重複したパケットを受信した場合はそのパケットを破棄して無駄な処理を回避することが可能なように、送信先コンピュータ102に重複を判別させる必要がある。
【0035】
また、ごくまれに、複数の経路のすべてに異常が同時に発生し、複数のパケットのすべてが消失(ロスト)することもある。経路の状態によっては、複数の異なるパケットが送信された順序とは違う順序で送信先コンピュータ102に到達することもある。
【0036】
一般に、順序の入れ替わりと消失の判別には一定の待ち時間が必要である。例えば、パケットA、Bがこの順序で送信され、パケットBがパケットAよりも先に受信された場合、一定の時間内にパケットAが受信されれば、順序の入れ替わりが発生したと判明する。そうでなければタイムアウトによりパケットAが消失したと判断される。よって、順序の入れ替わりの判明にはパケットBの受信からパケットAの受信までの待ち時間が必要であり、順序の入れ替わりと消失を区別するにはさらに待ち時間が必要である。
【0037】
一方、本発明は高信頼性と高スループットの両立を目的としている。高スループットは、処理が速いことの結果得られる特徴である。したがって、以下では、待ち時間を減らして処理を高速化するために、順序の入れ替わりと消失を区別せず、順序の入れ替わりも消失の一種と見なして処理する方法について説明する。
【0038】
以上のことを考慮して、送信先コンピュータ102がパケットの重複や消失を判別することができるように、図1のシステムは構成されている。具体的には、送信元コンピュータ101が送信順序情報104を管理して、パケット105と106に送信順序情報104を含めて送信先コンピュータ102に送信する。送信先コンピュータ102は、受信順序情報111を管理し、受信したパケット105または106から送信順序情報109または110を取得し、取得した送信順序情報109または110と受信順序情報111が表す順序とを比較する。比較の結果、パケットの重複や消失が判断される。なお、送信順序情報109と110の内容は送信順序情報104と同じである。
【0039】
図1には送信対象データ103を表すブロックを一つだけ示したが、実際の環境では、送信元コンピュータ101から送信先コンピュータ102に、様々なデータに対応する様々なパケットを順々に送信するのが一般的である。送信順序情報104は、そのような異なるパケット間の送信順序を示す情報であり、例えば番号を含む。その番号の大小により、送信順序の前後が示される。送信順序情報104は、送信元コンピュータ101が備える不図示の格納部に格納されており、送信元コンピュータ101が備える不図示の送信順序情報更新部により読み取られ、更新される。例えば、格納部はRAM(Random Access Memory)により実現され、送信順序情報更新部は本発明による送信プログラムを実行するCPU(Central Processing Unit)により実現される。
【0040】
送信元コンピュータ101が備える不図示のパケット作成部は、同じ送信対象データ1
03に対しては同じ送信順序情報104を付加して、二つのパケット105と106を作成する。送信元コンピュータ101が備える不図示の送信部は、パケット105と106をそれぞれ経路107と108を介して送信先コンピュータ102に送信する。例えば、パケット作成部は本発明による送信プログラムを実行するCPUにより実現され、送信部はそのCPUと通信インターフェイスにより実現される。
【0041】
二つの経路がともに正常なら、送信先コンピュータ102の不図示の受信部はパケット105と106を正常に受信する。送信先コンピュータ102の不図示の比較判断部は、パケット105をパケット106より早く受信した場合は、パケット106を重複したパケットだと判断する。逆に、パケット106をパケット105より早く受信した場合は、比較判断部は、パケット105を重複したパケットだと判断する。例えば、受信部は本発明の受信プログラムを実行するCPUと通信インターフェイスにより実現され、比較判断部も同じCPUにより実現される。
【0042】
このようにパケットの重複を判別することができるのは、送信先コンピュータ102が受信順序情報111を管理しているためである。受信順序情報111は、送信先コンピュータ102が過去に受信したパケットに含まれる送信順序情報にもとづいて管理され、送信先コンピュータ102が備える不図示の格納部に格納されている。格納部は例えばRAMである。受信順序情報111は、次に受信されると期待されるパケットに対応する順序を表す。
【0043】
送信順序情報104と受信順序情報111について、理解を容易にするため、簡単な例で説明する。送信順序情報104は昇順で順序を表す番号を含み、その番号により順序が表される。つまり、この例では、「1」が表す順序の次の順序は「2」により表され、「2」が表す順序の次の順序は「3」により表される。
【0044】
送信元コンピュータ101から送信先コンピュータ102に送信されるデータのうち、送信対象データ103は「2」が表す順序に対応すると仮定する。また、「1」が表す順序に対応する別のパケットは、既に送信先コンピュータ102に正常に送信されており、パケット105がパケット106よりも先に受信されたと仮定する。
【0045】
送信順序情報104が「2」という番号を含む場合、送信先コンピュータ102の比較判断部は受信したパケット105と106からそれぞれ、「2」という番号を含む送信順序情報109と110を取得することができる。また、送信先コンピュータ102は「1」が表す順序に対応する別のパケットを過去に受信済みなので、パケット105を受信した時点では、次に「2」が表す順序に対応するパケットが受信されることを期待している。この期待している順序を表す情報が受信順序情報111である。受信順序情報111も送信順序情報104と同様に昇順で順序を表す番号を含んでいてもよい。例えば、この時点における受信順序情報111は、「2」という番号を含んでもよい。
【0046】
以上の仮定のもとで送信先コンピュータ102の受信部がパケット105を受信すると、パケット105から取得した送信順序情報109が表す順序と受信順序情報111が表す順序が等しい。このことは、期待していたとおりの順序に対応するパケットが正常に受信されたことを表す。よって、送信先コンピュータ102は、パケット105に含まれる送信対象データ103を利用して、実施形態に応じた必要な処理を行う。また、パケット105の受信により、次に受信されると期待されるパケットに対応する順序は一つ後ろにずれ、「3」により表される順序となる。よって、送信先コンピュータ102の不図示の正常処理部は、受信順序情報111が含む番号を「3」に更新する。例えば、正常処理部は本発明の受信プログラムを実行するCPUにより実現される。
【0047】
その後、送信先コンピュータ102の受信部はパケット106を受信する。パケット106から取得される送信順序情報110は「2」という番号を含み、上記で更新された受信順序情報111は「3」という番号を含む。つまり、送信順序情報110の方が受信順序情報111よりも早い順序を表す。したがって、パケット106は過去に受信した他のパケットと重複していると送信先コンピュータ102の比較判断部が判断する。実際、パケット106は、パケット105と同じ送信対象データ103および同じ送信順序情報104を含んでおり、パケット105と重複している。送信先コンピュータ102において、重複していると判断されたパケット106が含む送信対象データ103は利用されず、破棄される。それにより、同じデータに対して無駄に重複して同じ処理を行う時間をなくしている。
【0048】
次に、パケットの消失について、上記とは一部仮定を変えて説明する。まず、「1」が表す順序に対応するパケットを送信先コンピュータ102が正常に受信済みであり、「2」が表す順序に対応するパケットは、経路107と108の双方で消失したと仮定する。この段階で、送信先コンピュータ102が次に受信すると期待しているパケットは「2」が表す順序に対応するから、受信順序情報111は「2」という番号を含む。
【0049】
その後、「3」が表す順序に対応して、送信元コンピュータ101は、「3」という番号を含む送信順序情報104と送信対象データ103とを含むパケット105と106を作成し、経路107と経路108のそれぞれを介して送信先コンピュータ102に送信する。以下では、パケット105がパケット106よりも先に受信されたと仮定する。
【0050】
すると、送信先コンピュータ102の比較判断部は、パケット105から送信順序情報109を取得する。そして、送信順序情報109が含む「3」という番号は、受信順序情報111が含む「2」という番号よりも後の順序であることから、送信先コンピュータ102の比較判断部は、パケットの消失が生じたと判断することができる。
【0051】
図2は、本発明を利用してデータの同期化を行う二重化システムの構成図である。図2の二重化システムは、同様の構成を有する二つのコンピュータ201と202を組にして、一方をアクティブ装置、他方をスタンバイ装置として運用するシステムである。アクティブ装置に故障が発生した場合や、アクティブ装置のハードウェアを交換する必要がある場合などには、アクティブ装置とスタンバイ装置が切り換えられる。このようにシステムを二重化することにより、システムはフォールトトレラントなものとなり、サービスの可用性が向上する。
【0052】
以下では、アクティブ装置とスタンバイ装置の切換に必要なデータの同期化のために、UDPによるデータ転送が行われる場合を例に説明する。本発明を利用することにより、図2のシステムにおいてデータの即時的な同期化が可能となる。なお、以下では特に断らない限り、「パケット」という語はUDPパケットを意味する。
【0053】
図2は、左側に示したコンピュータ201がアクティブ装置として運用され、右側に示したコンピュータ202がスタンバイ装置として運用されている状態を表している。なお、「アクティブ装置」と「スタンバイ装置」という呼び方は相対的であり、切り換えが生じれば逆転する。しかし、以下では特に断らない限り、図2の状態を前提とし、これら2台のコンピュータを単に「アクティブ装置201」および「スタンバイ装置202」と表現する。2台のコンピュータのどちらをアクティブ装置として運用している状態であるかに関わらず、コンピュータ自体を識別する必要がある場合にのみ、2台のコンピュータを「コンピュータ201」および「コンピュータ202」と表現する。
【0054】
アクティブ装置201は一般的なコンピュータであり、スタンバイ装置202と同期化
すべきデータが格納される共有メモリ205と、不図示のCPUとを備える。共有メモリ205はRAMなどの揮発性メモリであり、ハードディスクなどの不揮発性領域に比べてアクセス速度が格段に速い。なお、同期化の処理自体に必要なデータを格納する不図示の他のメモリ領域もコンピュータ201は備えている。その領域を以下では「制御用データ領域」と呼ぶ。本実施形態では、コンピュータ201が備えるRAMの一部が共有メモリ205として利用され、その残りが制御用データ領域として利用される。制御用データ領域には、図1の送信順序情報104や受信順序情報111が格納される。スタンバイ装置202も共有メモリ206と不図示のCPUを備え、アクティブ装置201と同様に構成されている。
【0055】
図2のシステムは、アクティブ装置201とスタンバイ装置202の切換時間を短縮するために、共有メモリ205と206に格納されたデータを即時的に同期化する。本実施形態では、同期化にかかるわずかな時間を除き、共有メモリ205と206は常に同じデータを格納した状態である。よって、仮想的には、アクティブ装置201とスタンバイ装置202が一つのメモリ領域を共有していると見なすこともできる。そのため、共有メモリ205と206をまとめて仮想共有メモリ203と表している。また、共有メモリ205と206の名称に「共有」という語がつくのは、仮想共有メモリ203の構成要素であるためである。
【0056】
アクティブ装置201の不図示のCPUにより、一つ以上のユーザアプリケーション207が実行されている。なお、各種の処理を実行するのは正確にはCPUだが、以下では表記の簡略化のため、「ユーザアプリケーション207が処理を実行する」などの表現することがある。
【0057】
アクティブ装置201には、OS(Operating System)に加えて、OSとユーザアプリケーション207を仲介する種々のミドルウェアからなるミドルウェア群211がインストールされている。ミドルウェア群211に含まれるミドルウェアの一つが、UDPを使ったデータの同期化を制御する。図2ではそのミドルウェアを、共有メモリ制御部213という機能的なブロックで表している。共有メモリ制御部213を実現するミドルウェアは、本実施形態における本発明の送信プログラムおよび受信プログラムを含む。
【0058】
アクティブ装置201とスタンバイ装置202は同様の構成を備えている。すなわち、スタンバイ装置202にもOSとミドルウェア群212がインストールされており、ミドルウェア群212は共有メモリ制御部214を含む。なお、ユーザアプリケーション207と同様のユーザアプリケーションがスタンバイ装置202にもインストールされているが、スタンバイ状態においては実行されていないので、図示していない。
【0059】
ユーザアプリケーション207の実行は、一般に、共有メモリ205のデータの変更をともなう。よって、共有メモリ205と206の同期を保つために、本実施形態では、共有メモリ205のデータが変更されるたびに、必ずスタンバイ装置202の共有メモリ206にその変更が反映される。共有メモリ205や206のような揮発性メモリ領域へのアクセスは、ハードディスクなどの不揮発性領域へのアクセスに比べて高速なので、その反映は高速に行うことが可能である。また、その反映のためにアクティブ装置201とスタンバイ装置202の間で行われるデータ送信は、本発明を利用することにより、スループットと信頼性がともに高い。高スループットは、換言すれば、処理が高速であることを意味する。結局、共有メモリ205と206は、非常に迅速に同期化される。
【0060】
共有メモリ205と206の同期化には、アクティブ装置201とスタンバイ装置202の間の複数の通信路が利用される。本実施形態における通信路の数は2であり、以下では二つの通信路を第一経路215および第二経路216と呼ぶ。また、本実施形態で使わ
れる通信プロトコルはUDPである。UDPによる通信機能は一般にOSにより提供されるので、OSの上位のミドルウェアにより実現される共有メモリ制御部213および214は、UDPを利用して第一経路215または第二経路216を介した通信を行うことができる。
【0061】
図2において、ユーザアプリケーション207がデータ209を共有メモリ205に書き込む操作を「(1)Write」と表記し、ユーザアプリケーション207から共有メモリ205への矢印により表した。
【0062】
この書き込み操作の後、ユーザアプリケーション207は共有メモリ制御部213を呼び出し、共有メモリ205と206を同期化させる。この同期化の操作を図2では「(2)Commit」と表記した。また、同期化が終了するまでユーザアプリケーション207が待つことを図2では「(3)Wait」と表記した。
【0063】
図2の「(2)Commit」から「(3)Wait」までの処理の流れを、矢印に沿って説明すれば次のごとくである。
まず、ユーザアプリケーション207から点Aまでの線に示すように、ユーザアプリケーション207は、(1)の書き込み操作で共有メモリ205に書き込んだデータ209と同じデータを共有メモリ制御部213に与える。矢印は点Aで二つに分岐し、一方は第一経路215を介して点Bへ進み、他方は第二経路216を介して点Dに進む。この分岐は、共有メモリ制御部213が、データ209を含むパケットを二つの経路のそれぞれを介してスタンバイ装置202に送信することを表す。
【0064】
二つの経路を介して送信されたパケットは、いずれも、スタンバイ装置202の共有メモリ制御部214が受信する。図2では、第一経路215を介して送信されたパケットの方が、第二経路216を介して送信されたパケットよりも早く受信されたと仮定している。前者の受信は点Bに対応し、後者の受信は点Dに対応する。点Bでは、矢印が二つに分岐し、後続の処理に続くことを示している。
【0065】
一方、点Dは矢印の終点である。点Dが終点であることは、第二経路216を介して受信したパケットが破棄されることに対応する。破棄されるのは、既に第一経路215を介して受信したパケットと重複するパケットだと共有メモリ制御部214により判断されるためである。
【0066】
点Bで分岐した一方の矢印は、共有メモリ206内のデータ210を指している。これは、共有メモリ制御部214が、受信したデータを共有メモリ206に書き込むことを表す。
【0067】
点Bで分岐した他方の矢印は、点Cに進み、点Cでさらに二つに分岐している。点Cは、共有メモリ制御部214がアクティブ装置201に処理結果を伝えるメッセージ、具体的には後述のACKパケットを送信することに対応する。点Cでの分岐は、ACKパケットが第一経路215と第二経路216のそれぞれを介して送られることを表す。
【0068】
図2では、第二経路216を介して送信されたACKパケットの方が、第一経路215を介して送信されたACKパケットよりも早く受信されたと仮定している。前者は、点Cで分岐して第二経路216と共有メモリ制御部213を通り、ユーザアプリケーション207で終わる矢印に対応し、後者は、点Cで分岐して第一経路215を通り点Eで終わる矢印に対応する。つまり、共有メモリ制御部213からユーザアプリケーション207への通知は、先に共有メモリ制御部213で受信された一方のACKパケットにのみもとづいてなされる。ユーザアプリケーション207はその通知をもって共有メモリ205と2
06の同期化が終了したことを検知し、(3)の待ち状態から脱する。
【0069】
点Eは、他方のACKパケットが後で共有メモリ制御部213に受信されることに対応する。つまり、点Eは、データ209の同期化に関する応答であるACKパケットを、第二経路216から受信した後の時点に対応しているので、点Eで二度目に受信したACKパケットは不要である。よって、共有メモリ制御部213はこの不要なACKパケットを無視する。
【0070】
以上のようにして、ユーザアプリケーション207がデータ209を共有メモリ205に書き込むたびに、同じ内容のデータ210が共有メモリ206にも書き込まれ、共有メモリ205と206が同期化される。
【0071】
また、この同期化に使われる通信プロトコルはUDPなので、同期化のためのデータ送信にかかる時間は、TCPを使う場合に比べて短時間である。一方で、第一経路215と第二経路216という二つの異なる経路に同時に故障が発生することはほとんどないので、ほぼ確実に、データの同期化を達成することができる。
【0072】
また、第一経路215と第二経路216のうち一方に故障が発生しても、正常な経路を介して正常に受信されたデータを共有メモリ制御部214が共有メモリ206に書き込むことにより同期化が達成される。つまり、各経路を介した送信にかかる時間のばらつきが極端に大きくなければ、たとえ一方の経路に故障が発生しても、両経路とも正常な場合の同期化のタイミングに比べて同期化のタイミングが大きく遅れることはない。この点も、データの同期化が高速であるという特徴に寄与している。
【0073】
次に、図3を参照して、図2のコンピュータ201と202がそれぞれ管理するデータ転送制御表301と302の例を説明する。図3に示すように、データ転送制御表301と302は、同じ形式であり、それぞれ例えばRAM上の制御用データ領域に格納されている。
【0074】
データ転送制御表301と302の内容は、コンピュータ201と202のどちらがアクティブ装置として運用されているかに関係ない。つまり、データ転送制御表301と302は、図2の状態を前提としていない。よって、図3の説明においては、「アクティブ装置201」と「スタンバイ装置202」ではなく、「コンピュータ201」と「コンピュータ202」と表現する。
【0075】
データ転送制御表301は、第一経路215と第二経路216についてそれぞれ、「自分のIPアドレス」、「通信相手のIPアドレス」、「自分のポート番号」、「通信相手のポート番号」、「状態」というフィールドを有している。データ転送制御表302も同様の形式である。
【0076】
UDPを用いた通信では、送信先と送信元が、IPアドレスとポート番号の組であるソケットアドレスにより表される。よって、第一経路215のコンピュータ201側の端点は、データ転送制御表301の「自分のIPアドレス」と「自分のポート番号」を組にした「192.168.1.100:6100」である。このソケットアドレスは、データ転送制御表302では逆に、「通信相手のIPアドレス」と「通信相手のポート番号」の組により表される。
【0077】
一方、第一経路215のコンピュータ202側の端点は、データ転送制御表301の「通信相手のIPアドレス」と「通信相手のポート番号」を組にした「192.168.1.200:6200」である。このソケットアドレスは、データ転送制御表302では「
自分のIPアドレス」と「自分のポート番号」の組により表される。
【0078】
データ転送制御表301と302の「状態」は、「正常」または「異常」という値を取る。データ転送制御表301の「状態」の値は、第一経路215と第二経路216の監視結果に応じて、動的に書き換えられる。データ転送制御表302についても同様である。
【0079】
図3の例では、第一経路215が「192.168.1.100:6100」と「192.168.1.200:6200」という二つのソケットアドレスにより定義され、第二経路216が「10.1.1.100:7100」と「10.1.1.200:7200」という二つのソケットアドレスにより定義されている。つまり、第一経路215と第二経路216では、IPアドレスもポート番号も異なる。
【0080】
例えば、コンピュータ201に2枚のNIC(Network Interface Card)を取り付け、それぞれのNICに別のIPアドレスを割り当てることにより、図3の例のように、1台のコンピュータ201に異なる二つのIPアドレスを割り当てることが可能である。さらに、第一経路215と第二経路216は、ケーブルなどの物理的な媒体も異なることが望ましい。
【0081】
なお、実施形態によっては、例えば、第一経路215または第二経路216のコンピュータ201側のIPアドレスが同じであってもよい。たとえIPアドレスが同じでも、異なるポート番号を用いることにより、二つの経路を区別することができるからである。
【0082】
また、図3のような設定であっても、経路の物理的な媒体自体は、第一経路215と第二経路216が共有することも可能である。例えば、コンピュータ201と202が、1台のスイッチングハブを介して接続され、コンピュータ201とスイッチングハブの間およびコンピュータ202とスイッチングハブの間はそれぞれ1本のケーブルで接続されていてもよい。ただし、このように複数の経路が物理的な媒体を共有すると、一つの媒体のトラフィック量が多くなるために、データの衝突(コリジョン)などが発生しやすくなり、結果的に全体的な処理速度の低下を招くことがある。よって、異なる経路は異なる物理的媒体により実現することが望ましい。
【0083】
図4は、共有メモリ制御部213と214を実現するミドルウェアを構成するスレッドのブロック図である。図2に示したように、本実施形態では、コンピュータ201と202が同様の構成を備え、アクティブ装置とスタンバイ装置は切り換え可能である。したがって、共有メモリ制御部213には、コンピュータ201がアクティブ装置として運用される場合のために、データをコンピュータ202に送信する機能が必要であり、コンピュータ201がスタンバイ装置として運用される場合のために、データをコンピュータ202から受信して共有メモリ205に反映する機能が必要である。共有メモリ制御部214も共有メモリ制御部213と同様である。
【0084】
具体的には、共有メモリ制御部213と214はそれぞれ、UDPポート411と412を介して第一経路215へのデータ送信および第一経路215からのデータ受信が可能なように構成されている。また、共有メモリ制御部213と214はそれぞれ、UDPポート413と414を介して第二経路216へのデータ送信および第二経路216からのデータ受信が可能なようにも構成されている。
【0085】
共有メモリ制御部213と214を実現するミドルウェアは、図4の実施形態ではマルチスレッド・プログラムである。具体的には、コンピュータ201の不図示のCPUがヘルスチェックスレッド401、データ送信スレッド403、データ受信スレッド405、第一経路受信スレッド407、および第二経路受信スレッド409を実行することにより
共有メモリ制御部213が実現される。同様に、コンピュータ202の不図示のCPUがヘルスチェックスレッド402、データ送信スレッド404、データ受信スレッド406、第一経路受信スレッド408、および第二経路受信スレッド410を実行することにより、共有メモリ制御部214が実現される。
【0086】
以下では共有メモリ制御部213について説明するが、共有メモリ制御部214でも同様である。
ヘルスチェックスレッド401は、第一経路215と第二経路216の状態を監視する。具体的には、ヘルスチェックスレッド401は、一定間隔でコンピュータ202から送信される、経路の状態を監視するためのパケットの受信間隔にもとづいて、経路の状態を判断する。その監視用のパケットを以下では「ヘルスチェックパケット」と呼び、具体的な形式は図5とあわせて後述する。
【0087】
コンピュータ202からヘルスチェックパケットが送信される間隔h1は予め決められており、例えばh1=1秒である。コンピュータ202から第一経路215を介して送信されたヘルスチェックパケットは、第一経路受信スレッド407により受信される。第一経路受信スレッド407は、ヘルスチェックパケットを受信すると、ヘルスチェックパケットの受信をヘルスチェックスレッド401に通知する。
【0088】
ヘルスチェックスレッド401は、第一経路受信スレッド407からの今回の通知と、前回の通知との間隔hを調べる。その間隔hが規定時間h2以内であれば、ヘルスチェックスレッド401はデータ転送制御表301の「第一経路」レコードの「状態」フィールドの値を「正常」に設定し、そうでなければ「異常」に設定する。規定時間h2は、経路の状態を正常と見なしうる許容範囲を示す値で、予め決められたヘルスチェックパケットの送信間隔h1よりも少しだけ大きな値である。送信間隔h1と規定時間h2は、実験等から適切な値を定めることが望ましい。
【0089】
第二経路216についても同様にして、ヘルスチェックスレッド401が状態を監視し、その監視の結果をデータ転送制御表301に反映する。
コンピュータ202において、コンピュータ201にヘルスチェックパケットを送信するのは、具体的にはヘルスチェックスレッド402である。ヘルスチェックスレッド402は、第一経路215と第二経路216のそれぞれについて、データ転送制御表302を参照して「通信相手のIPアドレス」と「通信相手のポート番号」宛てのヘルスチェックパケットを生成する。ヘルスチェックスレッド402は、第一経路215へはUDPポート412から、第二経路216へはUDPポート414から、生成したヘルスチェックパケットを送出する。
【0090】
また、ヘルスチェックスレッド402も、上記と同様の方法で第一経路215と第二経路216の状態を監視し、データ転送制御表302の「状態」フィールドの値を動的に設定している。そして、ヘルスチェックスレッド401も、ヘルスチェックスレッド402が第一経路215と第二経路216の状態を監視することができるように、送信間隔h1でヘルスチェックパケットをコンピュータ202に二つの経路を介して送信している。
【0091】
すなわち、本実施形態では、コンピュータ201と202のどちらがアクティブ装置であるかに関わらず、ヘルスチェックスレッド401と402は両方とも、ヘルスチェックパケットの送信、およびヘルスチェックパケットの受信間隔hにもとづく経路の状態の監視を行っている。
【0092】
データ送信スレッド403は、コンピュータ201がアクティブ装置として運用されているとき、送信対象のデータ、すなわち共有メモリ205に書き込まれたデータ209を
、スタンバイ装置として運用されているコンピュータ202へ送信する。データ209は図1の送信対象データ103に相当する。データ209はUDPパケットの形式で送信される。そのUDPパケットを以下では「共有メモリデータパケット」と呼び、形式は図5とあわせて後述する。共有メモリデータパケットは、図1のパケット105と106に相当する。
【0093】
また、データ送信スレッド403は、コンピュータ201がスタンバイ装置として運用されているとき、アクティブ装置として運用されているコンピュータ202から送信されたパケットに対する送達確認をコンピュータ202へ送信する。この送達確認も、具体的にはUDPパケットの一種であり、以下では「ACKパケット」と呼ぶ。ACKパケットの形式の詳細は図5とあわせて後述する。
【0094】
いずれの場合も、データ送信スレッド403は、送信すべきUDPパケット、より正確には、そのUDPパケットをカプセル化して得られるIPパケットを生成する。その生成に際して、データ送信スレッド403は、データ転送制御表301を参照して送信元と送信先のIPアドレスおよびポート番号を設定する。また、データ送信スレッド403はデータ転送制御表301を参照して、「状態」フィールドの値が「正常」である経路だけから生成したパケットを送信する。
【0095】
共有メモリ制御部214におけるデータ送信スレッド404も、データ送信スレッド403と同様である。
データ受信スレッド405は、第一経路受信スレッド407および第二経路受信スレッド409が受信したデータを適宜処理する。具体的には、データ受信スレッド405は、コンピュータ201がアクティブ装置として運用されているか否かによらず、コンピュータ202から送られた各種の制御用パケットを処理する。また、コンピュータ201がスタンバイ装置として運用されているとき、データ受信スレッド405はさらに、共有メモリデータパケットを処理する。その処理は、共有メモリデータパケットの重複や消失を判断すること、重複していない共有メモリデータパケットの内容を共有メモリ205に反映すること、必要に応じてACKパケットを送信するようデータ送信スレッド403に要求すること、を含む。
【0096】
第一経路受信スレッド407は、データ転送制御表301の「第一経路」レコードの「自分のIPアドレス」と「自分のポート番号」の値が宛先に指定されたパケットを待ち合わせる。つまり、第一経路受信スレッド407は、第一経路215を介してUDPポート411にパケットが送信されるのを常に監視し、送信されたパケットを受信する。そして、第一経路受信スレッド407は、受信したパケットがヘルスチェックパケットか否かを判断し、ヘルスチェックパケットならヘルスチェックスレッド401にヘルスチェックパケットの受信を通知し、そうでなければ受信したパケットの処理をデータ受信スレッド405に要求する。
【0097】
第二経路受信スレッド409も同様に、データ転送制御表301の「第二経路」レコードの「自分のIPアドレス」と「自分のポート番号」の値が宛先に指定されたパケットを待ち合わせる。そして、第二経路受信スレッド409は、受信したパケットがヘルスチェックパケットか否かを判断し、ヘルスチェックパケットならヘルスチェックスレッド401にヘルスチェックパケットの受信を通知し、そうでなければ受信したパケットの処理をデータ受信スレッド405に要求する。
【0098】
共有メモリ制御部214におけるデータ受信スレッド406、第一経路受信スレッド408、および第二経路受信スレッド410も、上記と同様である。
なお、受信に関してはデータ受信スレッド405と第一経路受信スレッド407と第二
経路受信スレッド409の三つがあるのに対し、送信に関してはデータ送信スレッド403のみである理由は、図3がスレッドを示す図だからである。パケットはいつ受信されるかが不明なため、本実施例では、常にUDPポート411を監視する第一経路受信スレッド407と、常にUDPポート413を監視する第二経路受信スレッド409と、受信したパケットに関する実質的な処理を行うデータ受信スレッド405を分けてある。一方、パケットを送信する場合は、送信のタイミング、送信元のUDPポート、送信するパケットの種別はすべてデータ送信スレッド403が把握している。よって、データ送信スレッド403だけで、送信すべきパケットの生成から実際の送信までを行うことが容易でもあり自然でもある。
【0099】
次に、図5を参照して、本実施形態において利用される各種パケットの形式を説明する。上記のとおり、本実施形態では通信プロトコルとしてUDPが利用される。また、周知のように、UDPパケットはUDPヘッダとオプションのペイロード部分からなり、UDPヘッダは送信元と送信先のポート番号を含む。図5に示した五種のパケットは、いずれもUDPパケットであり、本実施形態に特有の独自のフィールドをペイロード部分に有する。それらの独自のフィールドの値によって、図5に示した五種のパケットは判別される。
【0100】
具体的には、ヘルスチェックパケット501は、ペイロード部に「TYPE1」というフィールドのみを含み、その値は括弧内に示したように、本実施形態では「1」である。リフレッシュ要求パケット502とリフレッシュ応答パケット503は、ペイロード部に「TYPE1」と「TYPE2」と「リフレッシュID」という三つのフィールドを含む。リフレッシュ要求パケット502とリフレッシュ応答パケット503の役割については後述する。共有メモリデータパケット504は、ペイロード部に「TYPE1」と「TYPE2」と「リフレッシュID」と「通番」と「共有メモリデータ」という五つのフィールドを含む。ACKパケット505は、ペイロード部に「TYPE1」と「TYPE2」と「リフレッシュID」と「通番」という四つのフィールドを含む。各フィールドの長さは、実施形態に応じて適宜決めてよい。
【0101】
TYPE1とTYPE2は、パケットの種別を示すフィールドである。TYPE1が上位の分類を表し、TYPE2が下位の分類を表す。図5では値の例を括弧の中に示したが、その値の例からも分かるように、五種のパケットは、TYPE1フィールドの値によりヘルスチェックパケット501とそれ以外のものの二種類に分類される。後者はさらに、TYPE2フィールドの値によって、四種類に分類される。
【0102】
図4の第一経路受信スレッドまたは第二経路受信スレッド407〜410は、UDPヘッダとTYPE1フィールドのみをチェックする。UDPヘッダが適切であり、TYPE1フィールドの値が1なら、第一経路受信スレッドまたは第二経路受信スレッド407〜410は、受信したパケットがヘルスチェックパケット501であると判断し、ヘルスチェックパケット501の受信をヘルスチェックスレッド401または402に通知する。
【0103】
一方、UDPヘッダが適切であり、TYPE1フィールドの値が2なら、第一経路受信スレッドまたは第二経路受信スレッド407〜410は、受信したパケットがヘルスチェックパケット501以外であると判断し、受信したパケットの処理をデータ受信スレッド405または406に要求する。データ受信スレッド405と406は、ヘルスチェックパケット501以外の種別のパケットのみを処理する。データ受信スレッド405と406は、TYPE2フィールドの値にもとづいてパケットの種別を判別し、パケットの種別に応じた処理を行う。
【0104】
リフレッシュIDフィールドと通番フィールドの値は、データ送信スレッド403また
は404により設定される。この二つのフィールドの値を組み合わせた情報が、図1の送信順序情報104に相当する。
【0105】
共有メモリデータフィールドは、共有メモリデータパケット504にのみ含まれる。図5では、図2のように共有メモリ205と206のデータの同期化のためのデータを送信する実施形態を前提としているので、パケットの種別やフィールドの名称に「共有メモリデータ」という語を使っている。しかし、一般的に述べるなら、共有メモリデータフィールドの内容は送信対象のデータそのものであり、共有メモリデータパケット504は送信対象のデータを送信するためのパケットであり、他の種別のパケットは諸々の制御用のパケットである。つまり、共有メモリデータフィールドの内容は図1の送信対象データ103に相当する。
【0106】
次に、図6〜図9のフローチャートを参照して、上記の各スレッドの動作について説明する。図6〜図9に関しては、コンピュータ201がアクティブ装置として運用され、コンピュータ202がスタンバイ装置として運用されている、図2の状態を前提として説明する。
【0107】
図6は、共有メモリ制御部213が共有メモリデータパケット504をスタンバイ装置202に送信する共有メモリデータ送信処理のフローチャートである。共有メモリデータ送信処理は、図2のユーザアプリケーション207から点Aへ向かい、点Aで分岐して点Bと点Dに向かう矢印に対応する。つまり、共有メモリデータ送信処理が開始される契機は、ユーザアプリケーション207が、共有メモリ205に書き込んだのと同じデータ209をスタンバイ装置202の共有メモリ206にも反映するよう、共有メモリ制御部213に要求することである。
【0108】
ステップS101で、データ送信スレッド403が、第一経路215と第二経路216を介して送信すべき二つの共有メモリデータパケット504を作成する。以下では、二つの共有メモリデータパケット504を区別する必要がある場合は「504‐1」と「504‐2」なる符号を用いる。共有メモリデータパケット504‐1と504‐2を作成する過程において、通番管理テーブル601の送信通番フィールドが更新される。
【0109】
通番管理テーブル601は、例えば、共有メモリ制御部213が参照可能なRAM上の制御用データ領域に格納され、共有メモリデータパケット504の順序を管理するための情報を保持している。具体的には、通番管理テーブル601は「送信通番」、「受信通番」、および「リフレッシュID」というフィールドを有する。本実施形態では、送信通番と受信通番は1バイトで表される0〜255の整数であり、リフレッシュIDは日時を表す値である。詳しくは後述するが、本実施形態では、三つのフィールドのいずれも、有効な値に初期化される前の例外的な初期値は0である。図6には、通番管理テーブル601の二つの状態を符号「601a」と「601b」により区別して示した。
【0110】
また、詳細は後述するが、1回目に使われた255という送信通番よりも、2回目に使われた1という送信通番の方が後の順序を示すことが、共有メモリデータパケット504から判断可能でなくてはならない。リフレッシュIDは、再利用された同じ値の送信通番同士を識別するための識別情報である。
【0111】
ステップS101でデータ送信スレッド403は、通番管理テーブル601の送信通番フィールドを更新し、送信通番を、現在の値に1を足した値とする。つまり、共有メモリデータパケットの送信がユーザアプリケーション207から依頼されるたびに、送信通番はカウントアップされる。データ送信スレッド403は、この更新後の送信通番を共有メモリデータパケット504‐1と504‐2の通番フィールドにそれぞれ設定する。
【0112】
また、データ送信スレッド403は、データ転送制御表301の「第一経路」レコードから、自分のポート番号と通信相手のポート番号を読み取り、第一経路215を介して送信すべき共有メモリデータパケット504‐1のUDPヘッダに読み取ったポート番号を設定する。同様に、データ送信スレッド403は、「第二経路」レコードから自分のポート番号と通信相手のポート番号を読み取り、第二経路216を介して送信すべき共有メモリデータパケット504‐2のUDPヘッダに読み取ったポート番号を設定する。
【0113】
共有メモリデータパケット504‐1と504‐2の双方で、TYPE1、TYPE2、リフレッシュID、および共有メモリデータの各フィールドは共通である。つまり、図5に示すように、データ送信スレッド403は、TYPE1を2に、TYPE2を3に設定する。また、データ送信スレッド403は、通番管理テーブル601からリフレッシュIDを読み取って、共有メモリデータパケット504‐1と504‐2のリフレッシュIDフィールドに設定する。共有メモリデータフィールドの内容は、共有メモリデータ送信処理を呼び出したユーザアプリケーション207が共有メモリ制御部213に与えたデータであり、データ209に等しい。
【0114】
以上がステップS101の処理だが、正確には、上記の送信通番の更新処理は単純なインクリメントではなく、以下のような処理である。
本実施形態では、コンピュータ201に電源が投入されたとき、または再起動されたとき、通番管理テーブル601の三つのフィールドの値はどれも自動的に0に設定され、図6の通番管理テーブル601aの状態になると仮定している。つまり、本実施形態では、0という値は有効な値に初期化される前の例外的な値である。そして、電源が投入された後、または再起動された後の1回目の共有メモリデータパケット504の送信時には、ステップS101において送信通番が1に設定される。
【0115】
一方で、上記のとおり送信通番は255までの整数である。よって、255個より多くの共有メモリデータパケット504を送信しようとすると、送信通番はオーバーフローする。そこで、同じ番号を再利用する必要がある。現在の送信通番が255の場合、単純に255に1を足すと、オーバーフローの結果、0なる値に送信通番が更新される。しかし、0は初期化の前の例外的な値であるから、共有メモリデータパケット504の通番フィールドに0が設定されることは避けるべきである。
【0116】
そこで、ステップS101での送信通番の更新においては、まず、データ送信スレッド403は送信通番を、現在の値に1を足した値とする。そして、その結果の送信通番が0なら、データ送信スレッド403は再度、送信通番に1を足す。データ送信スレッド403は、こうして得られた1という送信通番を共有メモリデータパケット504の通番フィールドに設定する。そのため、通番フィールドの値が255の共有メモリデータパケット504の次に送信される共有メモリデータパケット504の通番フィールドの値は、1である。
【0117】
以上のようにして、1〜255のいずれかの値が通番フィールドに設定された共有メモリデータパケット504‐1と504‐2をステップS101で作成すると、データ送信スレッド403はステップS102において、通番管理テーブル601に格納された送信通番が1か否かを判定する。送信通番が1の場合、判定は「YES」となって処理はステップS103に移行し、それ以外の場合、判定は「NO」となって処理はステップS106に移行する。
【0118】
ステップS103〜S105は、ステップS102の判定が「YES」の場合のみ実行される。ステップS103で、データ送信スレッド403は現在の日時を取得し、取得し
た日時を表す値Aを通番管理テーブル601のリフレッシュIDフィールドに登録する。その結果は、図6の通番管理テーブル601bのとおりである。
【0119】
続くステップS104で、データ送信スレッド403は、第一経路215と第二経路216を介して送信すべき二つのリフレッシュ要求パケット502を作成して、スタンバイ装置202に送信する。以下では二つのリフレッシュ要求パケット502を区別する必要がある場合は「502‐1」と「502‐2」なる符号を用いる。ステップS104の処理は、アクティブ装置201とスタンバイ装置202の間で足並みを揃えてそれぞれの送信通番と受信通番とリフレッシュIDを初期化するための処理である。
【0120】
データ送信スレッド403は、データ転送制御表301の「第一経路」レコードと「第二経路」レコードのそれぞれから自分のポート番号と通信相手のポート番号を読み取って、リフレッシュ要求パケット502‐1と502‐2それぞれのUDPヘッダに設定する。TYPE1、TYPE2、リフレッシュIDの三つのフィールドは、リフレッシュ要求パケット502‐1と502‐2で共通である。データ送信スレッド403が、TYPE1を2に設定し、TYPE2を1に設定し、リフレッシュIDを通番管理テーブル601から読み取ってリフレッシュ要求パケット502‐1と502‐2のリフレッシュIDフィールドに設定する。
【0121】
そして、データ送信スレッド403は、データ転送制御表301を参照して第一経路215と第二経路216の状態をチェックする。データ送信スレッド403は、第一経路215が正常なら第一経路215を介してリフレッシュ要求パケット502‐1をスタンバイ装置202へ送信する。また、データ送信スレッド403は、第二経路216が正常なら第二経路216を介してリフレッシュ要求パケット502‐2をスタンバイ装置202へ送信する。
【0122】
続くステップS105では、データ送信スレッド403はスリープ状態であり、データ受信スレッド405が、スタンバイ装置202からの応答、すなわちリフレッシュ応答パケット503の受信を待ち合わせている。リフレッシュ応答パケット503の受信の詳細は図8とともに後述するが、リフレッシュ応答パケット503の受信を契機として、スリープ状態のデータ送信スレッド403が起床させられて、処理がステップS106に移行する。
【0123】
ステップS106でデータ送信スレッド403は、データ転送制御表301の「第一経路」レコードの「状態」フィールドを参照し、第一経路215が正常か否かを判定する。「状態」フィールドの値が「正常」なら判定は「YES」となって処理がステップS107に移行し、そうでなければ判定は「NO」となって処理がステップS108に移行する。
【0124】
ステップS107で、データ送信スレッド403は、まず、データ転送制御表301の「第一経路」レコードの自分のIPアドレスと通信相手のIPアドレスを読み取る。そして、データ送信スレッド403は読み取ったIPアドレスを含むIPヘッダを共有メモリデータパケット504‐1に付加して、共有メモリデータパケット504‐1をカプセル化する。そして、データ送信スレッド403は、UDPポート411から第一経路215を介してスタンバイ装置202へ、カプセル化したIPパケットを送信する。
【0125】
続くステップS108とS109からなる処理は、ステップS106とS107からなる処理と同様である。違いは、ステップS106とS107は第一経路215に対応する処理であるのに対し、ステップS108とS109は第二経路216に対応する処理である点のみである。
【0126】
ステップS108で「NO」と判定された後、またはステップS109の実行後、図6の共有メモリデータ送信処理は終了する。
図7は、図6のステップS104で送信されたリフレッシュ要求パケット502をスタンバイ装置202が受信するリフレッシュ要求受信処理のフローチャートである。
【0127】
まず、第一経路受信スレッド408または第二経路受信スレッド410が、パケットを受信し、TYPE1フィールドの値にもとづいてヘルスチェックパケット501ではないと判断し、受信したパケットの処理をデータ受信スレッド406に要求する。次に、データ受信スレッド406が受信したパケットのTYPE2フィールドの値にもとづいて、受信したパケットがリフレッシュ要求パケット502であると判断する。この判断を契機として、リフレッシュ要求受信処理が開始される。リフレッシュ要求受信処理には、どちらの経路を介してリフレッシュ要求パケット502を受信したかは関係がない。
【0128】
また、通番管理テーブル601と同様の通番管理テーブル602が、コンピュータ202のRAM上の制御用データ領域にも格納されている。なお、図7には通番管理テーブル602の二つの状態を符号「602a」と「602b」により区別して示した。コンピュータ202に電源が投入された直後またはコンピュータ202が再起動された直後には、通番管理テーブル602aのように、三つのフィールドの値はすべて0である。
【0129】
リフレッシュ要求受信処理が開始されると、まずステップS201で、データ受信スレッド406は、受信したリフレッシュ要求パケット502のリフレッシュIDフィールドの値と通番管理テーブル602のリフレッシュIDフィールドの値が一致するか否かを判定する。両者が一致していれば判定は「YES」となって、リフレッシュ要求受信処理を終了し、そうでなければ判定は「NO」となって、ステップS202に移行する。判定が「YES」となるのは、処理済みのリフレッシュ要求パケット502と同じ内容のリフレッシュ要求パケット502を、別の経路を介して受信した場合である。
【0130】
ステップS202において、データ受信スレッド406は、受信したリフレッシュ要求パケット502のリフレッシュIDフィールドの値を通番管理テーブル602のリフレッシュIDフィールドに設定する。これにより、通番管理テーブル602のリフレッシュIDフィールドの値が更新される。図7では、更新後のリフレッシュIDフィールドの値を図6と同じく符号「A」により示している。
【0131】
続いてステップS203において、データ受信スレッド406は、通番管理テーブル602の受信通番フィールドの値を1に初期化する。その結果は、通番管理テーブル602bとして図7に示したとおりである。また、データ受信スレッド406は、次のステップS204の処理を実行するよう、データ送信スレッド404に要求する。
【0132】
ステップS204において、データ送信スレッド404は、第一経路215と第二経路216を介して送信すべき二つのリフレッシュ応答パケット503を作成し、アクティブ装置201に送信する。以下では二つのリフレッシュ応答パケット503を区別する必要がある場合は「503‐1」と「503‐2」なる符号を用いる。
【0133】
データ送信スレッド404は、データ転送制御表302の「第一経路」レコードと「第二経路」レコードのそれぞれから自分のポート番号と通信相手のポート番号を読み取って、リフレッシュ応答パケット503‐1と503‐2それぞれのUDPヘッダに設定する。TYPE1、TYPE2、リフレッシュIDの三つのフィールドは、リフレッシュ応答パケット503‐1と503‐2で共通である。データ送信スレッド404が、TYPE1を2に設定し、TYPE2を2に設定し、ステップS201でリフレッシュ要求パケッ
ト502から読み取ったリフレッシュIDをリフレッシュ応答パケット503‐1と503‐2のリフレッシュIDフィールドに設定する。また、データ送信スレッド404は、データ転送制御表302の自分のIPアドレスと通信相手のIPアドレスを参照して適切なIPヘッダをリフレッシュ応答パケット503‐1と503‐2に付加する。
【0134】
そして、データ送信スレッド404は、データ転送制御表302を参照して第一経路215と第二経路216の状態をチェックする。データ送信スレッド404は、第一経路215が正常なら第一経路215を介してリフレッシュ応答パケット503‐1をアクティブ装置201へ送信し、第二経路216が正常なら第二経路216を介してリフレッシュ応答パケット503‐2をアクティブ装置201へ送信する。
【0135】
以上のようにしてリフレッシュ要求受信処理が終了する。第一経路215と第二経路216の少なくとも一方が正常なら、ステップS204で送信されたリフレッシュ応答パケット503は、その後、アクティブ装置201で受信される。第一経路受信スレッド407または第二経路受信スレッド409は、リフレッシュ応答パケット503を受信すると、ヘルスチェックパケット501ではないと判断し、受信したパケットの処理をデータ受信スレッド405に要求する。データ受信スレッド405は、受信したパケットのTYPE2フィールドの値にもとづいて、受信したパケットがリフレッシュ応答パケット503であると判断する。この判断を契機として、図8のフローチャートに示したリフレッシュ応答受信処理が開始される。リフレッシュ応答受信処理には、どちらの経路を介してリフレッシュ応答パケット503を受信したかは関係がない。
【0136】
また、リフレッシュ応答受信処理が実行されるのは図6のステップS105の待ち合わせ中なので、図8には、図6の通番管理テーブル601bと同じ状態の通番管理テーブル601bを示してある。
【0137】
ステップS301でデータ受信スレッド405は、受信したリフレッシュ応答パケット503からリフレッシュIDを読み取り、読み取ったリフレッシュIDと通番管理テーブル602のリフレッシュIDが一致するか否かを判定する。両者が一致していれば判定は「YES」となって処理がステップS302に移行し、そうでなければ判定は「NO」となってリフレッシュ応答受信処理を終了する。判定が「NO」となるのは、異なるリフレッシュIDに対応するリフレッシュ応答パケット503が時間的に近接して送信され、何らかの理由で送信順序とは違う順序で受信された場合など、例外的な場合である。
【0138】
ステップS302において、データ受信スレッド405は、受信したリフレッシュ応答パケット503の待ち合わせ先であるデータ送信スレッド403を起床させる。すなわち、データ受信スレッド405は、図6のステップS105で待ち続けているデータ送信スレッド403に対し、次のステップS106に進むべきことを通知する。そして、リフレッシュ応答受信処理が終了する。つまり、この起床通知は、アクティブ装置201の通番管理テーブル601とスタンバイ装置202の通番管理テーブル602がそれぞれ保持するリフレッシュIDを同期化させる処理が完了したことを示す通知である。
【0139】
次に、図9を参照して、共有メモリデータパケット504をスタンバイ装置202が受信する共有メモリデータ受信処理について説明する。図9の全体はループを構成している。図9は、ステップS401で共有メモリデータパケット504を受信するたびに、ステップS402〜S407の処理を実行し、次の共有メモリデータパケット504の受信に備えてステップS401に戻ることを表している。
【0140】
ステップS401で、スタンバイ装置202が共有メモリデータパケット504を受信する。具体的には、図6のステップS107で第一経路215を介して送信された共有メ
モリデータパケット504‐1を第一経路受信スレッド408が受信するか、ステップS109で第二経路216を介して送信された共有メモリデータパケット504‐2を第二経路受信スレッド410が受信する。
【0141】
第一経路受信スレッド408または第二経路受信スレッド410は、受信したパケットのTYPE1フィールドの値にもとづき、受信したパケットがヘルスチェックパケット501ではないと判断し、受信したパケットの処理をデータ受信スレッド406に要求する。データ受信スレッド406は受信したパケットのTYPE2フィールドの値にもとづき、受信したパケットが共有メモリデータパケット504であると判断する。以下の処理には、どちらの経路を介して共有メモリデータパケット504を受信したかは関係がない。
【0142】
次のステップS402では、データ受信スレッド406が、受信した共有メモリデータパケット504からリフレッシュIDを読み取り、読み取ったリフレッシュIDと通番管理テーブル602のリフレッシュIDが一致するか否かを判定する。両者が一致していれば判定は「YES」となって処理がステップS403に移行し、そうでなければ判定は「NO」となってステップS401に戻る。
【0143】
「NO」という判定は、直前のステップS401で受信した共有メモリデータパケット504が、過去に受信した他の共有メモリデータパケット504と重複する、ということを意味する。換言すれば、「NO」という判定は、図1の受信順序情報111が送信順序情報109または110よりも後の順序を示すことを意味する。よって、判定が「NO」となる場合、直前のステップS401で受信した共有メモリデータパケット504の共有メモリデータフィールドの内容に関する処理は何も行われない。つまり、この共有メモリデータパケット504は破棄される。
【0144】
ステップS403では、データ受信スレッド406が、受信した共有メモリデータパケット504の通番フィールドの値pを読み取り、通番管理テーブル602の受信通番フィールドの値tと比較する。比較の結果に応じて、処理は三通りに分岐する。
【0145】
(1)p<tの場合
p<tとなるのは、過去に受信して処理済みの共有メモリデータパケット504と同内容の共有メモリデータパケット504を、別の経路を介して重複して受信した場合である。つまり、図6のステップS101で一緒に作成された二つの共有メモリデータパケット504のうちの一方が過去の図9のループにおいて受信されて処理済みであり、他方が今回のループのステップS401で受信された場合に、p<tとなる。「p<t」なる式は、図1の受信順序情報111が送信順序情報109または110よりも後の順序を示すことに対応する。
【0146】
図6のステップS101で一緒に作成された二つの共有メモリデータパケット504は、UDPヘッダ以外のすべてのフィールドの内容が等しい。過去に受信した共有メモリデータパケット504の共有メモリデータは処理済みなので、今回のループで受信した共有メモリデータパケット504の共有メモリデータを処理する必要はない。そこで、今回のループのステップS401で受信した共有メモリデータパケット504は破棄され、その共有メモリデータフィールドの内容に関する処理は何も行われない。次の共有メモリデータパケット504の受信を待つために、処理はステップS401に戻る。
【0147】
(2)p=tの場合
p=tとなるのは、次に処理すべき共有メモリデータパケット504を受信した場合である。なお「処理すべき」とは、本実施形態では、共有メモリデータフィールドの内容を共有メモリ206に反映する処理を行うべきことを意味する。この場合、その処理を行う
ためにステップS405に移行する。つまり、「p=t」とは、次に受信されると期待される順序に対応するパケットが、まさに今回のループで受信されたことを表し、図1の受信順序情報111が送信順序情報109または110と同じ順序を示す場合に該当する。
【0148】
(3)p>tの場合
p>tとなるのは、連続してアクティブ装置201から送信された、異なる順序に対応する複数の共有メモリデータパケット504のうちの一つ以上が、何らかの理由でスタンバイ装置202に到達しなかった場合である。つまり、p>tのとき、スタンバイ装置202から見ると、連続する複数の共有メモリデータパケット504のうちの一部が消失した状態である。「p>t」なる式は、図1の受信順序情報111が送信順序情報109または110よりも前の順序を示すことに対応する。
【0149】
なお、二つの経路を介して送信された二つの共有メモリデータパケット504のうちの一方がネットワーク上で消失しても、他方が正常な経路を介してスタンバイ装置202に正しい順序で到達すれば、p>tとはならず、「消失」とは見なされない。p>tの場合、処理はステップS404に移行する。
【0150】
ステップS404は、受信した共有メモリデータパケット504の通番フィールドの値pが通番管理テーブル602の受信通番フィールドの値tより大きい場合に実行される。上記のように、この場合は連続してアクティブ装置201から送信された、異なる順序に対応する複数の共有メモリデータパケット504のうちの一つ以上が、正しい順序でスタンバイ装置202に受信されず、抜け落ちている。しかし、今回のループのステップS401で受信した共有メモリデータパケット504は未処理のデータを共有メモリデータフィールドに含む。本実施形態では、この未処理のデータは処理すべきデータであり、破棄せずに利用する。
【0151】
そこで、ステップS404では、今回のループのステップS401で受信した共有メモリデータパケット504が処理の対象であることを、通番管理テーブル602にも反映するための処理をデータ受信スレッド406が行う。具体的には、データ受信スレッド406は、通番管理テーブル602の受信通番フィールドに、今回のループのステップS401で受信した共有メモリデータパケット504の通番フィールドの値を設定する。これにより、次回のループでは、こうして更新された受信通番にもとづいてステップS403の判定が行われる。
【0152】
ステップS404の実行後、またはステップS403でp=tと判定された場合、ステップS405〜S407が実行される。
ステップS405では、今回のループのステップS401で受信された共有メモリデータパケット504の共有メモリデータフィールドの内容を、データ受信スレッド406が共有メモリ206に反映する。ステップS405は、図2で点Bから共有メモリ206に向かう矢印に対応する。ステップS405の処理を終えるとデータ受信スレッド406は、ステップS406の処理を行うようデータ送信スレッド404に要求する。
【0153】
ステップS406では、データ送信スレッド404がACKパケット505をアクティブ装置201に返信する。ACKパケット505は、スタンバイ装置202が共有メモリデータパケット504を受信し、その共有メモリデータフィールドの内容を共有メモリ206に反映したという結果をアクティブ装置201に通知するためのパケットである。データ送信スレッド404は、第一経路215と第二経路216を介して送信すべき二つのACKパケット505を作成し、アクティブ装置201に送信する。以下では二つのACKパケット505を区別する必要がある場合は「505‐1」と「505‐2」なる符号を用いる。
【0154】
データ送信スレッド404は、データ転送制御表302の「第一経路」レコードと「第二経路」レコードのそれぞれから自分のポート番号と通信相手のポート番号を読み取って、ACKパケット505‐1と505‐2それぞれのUDPヘッダに設定する。TYPE1、TYPE2、リフレッシュID、通番の四つのフィールドは、ACKパケット505‐1と505‐2で共通である。データ送信スレッド404が、TYPE1を2に設定し、TYPE2を4に設定し、通番管理テーブル602からリフレッシュIDを読み取って、読み取ったリフレッシュIDをACKパケット505‐1と505‐2のリフレッシュIDフィールドに設定する。また、データ送信スレッド404は、データ転送制御表302の自分のIPアドレスと通信相手のIPアドレスを参照して適切なIPヘッダをACKパケット505‐1と505‐2に付加する。
【0155】
そして、データ送信スレッド404は、データ転送制御表302を参照して第一経路215と第二経路216の状態をチェックする。データ送信スレッド404は、第一経路215が正常なら第一経路215を介してACKパケット505‐1をアクティブ装置201へ送信し、第二経路216が正常なら第二経路216を介してACKパケット505‐2をアクティブ装置201へ送信する。
【0156】
続くステップS407では、データ受信スレッド406が、通番管理テーブル602の受信通番フィールドを更新し、受信通番を、現在の値に1を足した値とする。この処理は、正確には図6のステップS101と同様に、255に1を足した場合はオーバーフローして0となり、0を避けるために再度1を足して受信通番を1とする処理である。受信通番の更新後、処理はステップS401に戻る。
【0157】
次に、図10〜図13の処理シーケンス図を参照して、処理の具体例を説明する。図10〜図13でも、図2のようにコンピュータ201がアクティブ装置201として運用され、コンピュータ202がスタンバイ装置202として運用されている状態を前提とする。
【0158】
また、図10〜図13では、アクティブ装置201に格納された通番管理テーブル601の状態を左列の矩形内に、スタンバイ装置202に格納された通番管理テーブル602の状態を右列の矩形内に、それぞれ示した。図10〜図13では、通番管理テーブル601と602に格納された送信通番、受信通番、およびリフレッシュIDをそれぞれ「snd_seq」、「rcv_seq」、「refresh_id」なる符号により表した。また、各種パケットの種別を矢印の上に書き、そのパケットのリフレッシュIDフィールドと通番フィールドの値を、それぞれ矢印の上に添えた「refresh_id」と「seq」なる符号により表した。
【0159】
なお、図10〜図13は、二つの経路のいずれかを介して最終的にスタンバイ装置202に共有メモリデータパケット504が到達するか否かという点と、アクティブ装置201の通番管理テーブル601とスタンバイ装置202の通番管理テーブル602がどのように連携されるかという点に注目した図である。よって、図10〜図13では、二つの経路がともに正常な場合の、パケットの重複に関する処理は省略して図示した。
【0160】
図10は、初期状態と、その後に続く正常な処理の結果を示す。状態AC101と状態ST101はそれぞれ通番管理テーブル601と602の初期状態である。どちらも、三つのフィールドすべての値が0である。
【0161】
この状態で、ユーザアプリケーション207がデータ209をスタンバイ装置202にも反映するよう共有メモリ制御部213に要求すると、図6のステップS101〜S10
3により、通番管理テーブル601は状態AC102になる。ここで、送信通番が1、リフレッシュIDがAである。
【0162】
次に、図6のステップS104でリフレッシュ要求パケット502がスタンバイ装置202に送信される。スタンバイ装置202がリフレッシュ要求パケット502を受信したときの通番管理テーブル602の状態は、状態ST101と同じ状態ST102である。スタンバイ装置202では、図7のステップS201の判定が「NO」となるので、ステップS202とS203により通番管理テーブル602が更新されて状態ST102から状態ST103へと変わる。ここで、受信通番が1、リフレッシュIDがAである。
【0163】
そして、スタンバイ装置202から図7のステップS204でリフレッシュ応答パケット503がアクティブ装置201へ送信される。アクティブ装置201がリフレッシュ応答パケット503を受信したときの通番管理テーブル601の状態は、状態AC102と同じ状態AC103である。
【0164】
そして、図8のステップS301の判定が「YES」となるため、図6のステップS106〜S109が実行される。その際の通番管理テーブル601の状態は状態AC103と同じ状態AC104であるから、ステップS107とS109で送信される共有メモリデータパケット504の通番フィールドの値は1、リフレッシュIDフィールドの値はAである。
【0165】
この共有メモリデータパケット504をスタンバイ装置202が受信したときの通番管理テーブル602の状態は状態ST103と同じ状態ST104である。この場合、図9のステップS403でp=tと判定されるので、ステップS406でACKパケット505がアクティブ装置201に送信され、ステップS407で受信通番が2に更新されて、通番管理テーブル602が状態ST105のようになる。
【0166】
ステップS406で送信されるACKパケット505のリフレッシュIDフィールドと通番フィールドの値はAと1である。アクティブ装置201がACKパケット505を受信するときの通番管理テーブル601の状態は、状態AC104と同じ状態AC105であるから、受信したACKパケット505のリフレッシュIDフィールドの値と通番管理テーブル601のリフレッシュIDは等しく、かつ、受信したACKパケット505の通番フィールドの値と通番管理テーブル601の送信通番は等しい。
【0167】
よって、共有メモリ制御部213のデータ受信スレッド405は、直前に送信した共有メモリデータパケット504に対応するACKパケット505が正常に返信されたことを検知することができる。正常にACKパケット505が返信されたことを検知すると、共有メモリ制御部213はその旨をユーザアプリケーション207に通知する。また、ACKパケット505の正常な受信を契機として、共有メモリ制御部213は、ユーザアプリケーション207からの次のデータ送信の要求を受け付けることが可能になる。
【0168】
そこで、共有メモリ206にデータを反映するためのデータ送信を次にユーザアプリケーション207が共有メモリ制御部213に要求すると、図6のステップS101により通番管理テーブル601の送信通番が2に更新され、更新後の状態は状態AC106となる。そして、この状態AC106でステップS102の判定は「NO」となり、ステップS106〜S109が実行される。それにより送信される共有メモリデータパケット504の通番フィールドの値は2、リフレッシュIDフィールドの値はAである。
【0169】
この共有メモリデータパケット504をスタンバイ装置202が受信したときの通番管理テーブル602の状態は状態ST105のままである。この場合も図9のステップS4
03でp=tと判定されるので、ステップS406でACKパケット505がアクティブ装置201に送信される。また、ステップS407で受信通番が3に更新されて通番管理テーブル602は状態ST106のようになる。
【0170】
ステップS406で送信されるACKパケット505のリフレッシュIDフィールドと通番フィールドの値はAと2である。アクティブ装置201がACKパケット505を受信するときの通番管理テーブル601の状態は、状態AC106と同じ状態AC107なので、受信したACKパケット505のリフレッシュIDフィールドの値と通番管理テーブル601のリフレッシュIDはともにAであり、かつ、受信したACKパケット505の通番フィールドの値と通番管理テーブル601の送信通番はともに2である。
【0171】
よって、共有メモリ制御部213のデータ受信スレッド405は、直前に送信した共有メモリデータパケット504に対応するACKパケット505が正常に返信されたことを検知することができる。
【0172】
次に、図11を参照して、共有メモリデータパケット504が消失する場合の例を説明する。
図11のうち、状態AC201、状態ST201、状態AC202からなる部分と、状態ST201から状態ST202への更新を表す部分は、正常な送信に対応する部分である。すなわち、通番フィールドの値が1の共有メモリデータパケット504が問題なくアクティブ装置201から送信されてスタンバイ装置202で受信され、対応するACKパケット505が問題なくスタンバイ装置202からアクティブ装置201へ返信され、通番管理テーブル602の受信通番が1から2に更新されるまでの過程は正常である。状態AC201、状態ST201、状態AC202、状態ST202はそれぞれ図10の状態AC104、状態ST104、状態AC105、状態ST105と同様である。
【0173】
通番管理テーブル601が状態AC202のとき、共有メモリ206へのデータ209の反映を、ユーザアプリケーション207が共有メモリ制御部213に要求する。すると、図6のステップS101により通番管理テーブル601の送信通番が2に更新され、更新後の状態は状態AC203となる。この状態AC203でステップS102の判定は「NO」となり、ステップS106〜S109が実行される。それにより送信される共有メモリデータパケット504の通番フィールドの値は2、リフレッシュIDフィールドの値はAである。
【0174】
図11では、第一経路215と第二経路216を介して送信された二つの共有メモリデータパケット504がともに消失したと仮定する。よって、通番フィールドの値が2で、リフレッシュIDフィールドの値がAの共有メモリデータパケット504は、スタンバイ装置202には届かない。当然、この共有メモリデータパケット504に対応するACKパケット505はアクティブ装置201に返信されない。よって、アクティブ装置201の共有メモリ制御部213は、共有メモリデータパケット504の送信から所定の時間内に適切なACKパケット505を受信することができないため、タイムアウトする。
【0175】
共有メモリ制御部213は、ユーザアプリケーション207に共有メモリデータパケット504の送信が失敗したことを通知する。その通知によりユーザアプリケーション207は、データ209の反映が失敗したことを認識する。その後、ユーザアプリケーション207は、データ209を共有メモリ206に反映するよう、再度共有メモリ制御部213に要求してもよい。本実施形態における再送制御は、共有メモリ制御部213ではなくユーザアプリケーション207の責任において行われる。もちろん、他の実施形態では共有メモリ制御部213がタイムアウト後に再送を試みてもよい。
【0176】
一方、共有メモリ制御部213は、タイムアウトすることにより、ユーザアプリケーション207からのデータ送信の要求を受け付けることが可能になる。
そこで、次にユーザアプリケーション207が共有メモリ206へのデータ209の反映を共有メモリ制御部213に要求すると、図6のステップS101により通番管理テーブル601の送信通番が3に更新され、更新後の状態は状態AC204となる。そして、この状態AC204でステップS102の判定は「NO」となり、ステップS106〜S109が実行される。それにより送信される共有メモリデータパケット504の通番フィールドの値は3、リフレッシュIDフィールドの値はAである。
【0177】
この共有メモリデータパケット504をスタンバイ装置202が受信したときの通番管理テーブル602の状態は、状態ST202と同じ状態ST203である。この場合、図9のステップS403でp>tと判定される。よって、ステップS404で受信通番が3に更新されて、通番管理テーブル602が状態ST204のようになり、ステップS405で共有メモリデータフィールドの内容が共有メモリ206に反映され、ステップS406でACKパケット505がアクティブ装置201に送信される。また、ステップS407で受信通番が4に更新されて通番管理テーブル602は状態ST205のようになる。
【0178】
ここで送信されるACKパケット505のリフレッシュIDフィールドと通番フィールドの値はAと3である。アクティブ装置201がACKパケット505を受信するときの通番管理テーブル601の状態は、状態AC204と同じ状態AC205なので、受信したACKパケット505のリフレッシュIDフィールドの値と通番管理テーブル601のリフレッシュIDはともにAであり、かつ、受信したACKパケット505の通番フィールドの値と通番管理テーブル601の送信通番はともに3である。
【0179】
よって、共有メモリ制御部213のデータ受信スレッド405は、直前に送信した共有メモリデータパケット504に対応するACKパケット505が正常に返信されたことを検知することができる。
【0180】
なお、図11では、共有メモリデータパケット504が二つとも経路上で消失したと仮定したが、共有メモリデータパケット504が二つとも大幅に遅延してスタンバイ装置202に届いた場合も図11のように処理される。なぜなら、共有メモリ制御部213は、所定の時間が過ぎても適切なACKパケット505を受信することができないとき、消失と遅延を区別することができないからである。
【0181】
さらに、図6のステップS106とS108の両方で「NO」と判定されて、共有メモリデータパケット504の送信が省略された場合も、図11と同様である。
図11のとおり、通番フィールドの値が1の共有メモリデータパケット504を受信することにより、通番管理テーブル602は状態ST202の状態となる。つまり、スタンバイ装置202は次に処理すべき共有メモリデータパケット504として、通番フィールドの値が2のものを期待している状態になる。
【0182】
一方で、図6のステップS101で送信通番が1から2に更新されて通番管理テーブル601が状態AC203となった後、ステップS106とS108の両方で「NO」と判定されると、通番フィールドの値が2の共有メモリデータパケット504は送信されない。この場合、共有メモリ制御部213は、ACKパケット505が返信されるはずがないことを認識可能である。よって、共有メモリ制御部213は、即座にユーザアプリケーション207からの次の要求を受け付けてもよい。すると、次の要求を受け付けることにより、ステップS101で送信通番が2から3に更新されて通番管理テーブル601が状態AC204となる。この時点で少なくとも一方の経路が正常なら、図11の処理の流れとまったく同様に、通番フィールドの値が3の共有メモリデータパケット504が送信され
る。
【0183】
以上のとおり、実際に起きた現象が消失、遅延、送信の省略のいずれであっても、同様の方法によって通番管理テーブル601と602は適切に更新される。
次に、図12を参照して、アクティブ装置201を再起動した場合の例を説明する。図12の状態AC301、状態ST301、状態AC302、状態ST302からなる部分は、リフレッシュIDがAの状態で、通番フィールドの値が20の共有メモリデータパケット504が正常に送信されて受信され、対応するACKパケット505が正常に送信されて受信されることを表している。この部分は、具体的な数値以外は、図10の状態AC104、状態ST104、状態AC105、状態ST105からなる部分と同様である。
【0184】
通番管理テーブル601が状態AC302のときにアクティブ装置201が再起動されると、通番管理テーブル601の送信通番、受信通番、リフレッシュIDはいずれも0という例外的な初期値に変化してしまう。
【0185】
図10に示すとおり、共有メモリデータパケット504とACKパケット505を適切に送受信するには、通番管理テーブル601と602が同じ値のリフレッシュIDを保持している状態でなくてはならない。しかし、アクティブ装置201の再起動によって、通番管理テーブル601から「A」というリフレッシュIDの値が消えてしまう。そこで、図6にしたがってアクティブ装置201が動作することにより、下記のごとく、再び通番管理テーブル601と602が同じ値のリフレッシュIDを保持している状態とする。その結果、共有メモリデータパケット504とACKパケット505を適切に送受信することが可能になる。
【0186】
すると、再起動後初めてユーザアプリケーション207がデータ209をスタンバイ装置202の共有メモリ206に反映するよう共有メモリ制御部213に要求したとき、通番管理テーブル601は図6のステップS101〜S103により初期化されて状態AC303になる。ここで、送信通番が1、リフレッシュIDがBである。
【0187】
次に、図6のステップS104でリフレッシュ要求パケット502がスタンバイ装置202に送信される。スタンバイ装置202がリフレッシュ要求パケット502を受信したときの通番管理テーブル602の状態は、状態ST302と同じ状態ST303なので、通番管理テーブル602における受信通番は21、リフレッシュIDはAである。
【0188】
よって、図7のステップS201の判定が「NO」となるので、ステップS202とS203により通番管理テーブル602が更新されて状態ST303から状態ST304へと変わる。ここで、受信通番が1、リフレッシュIDがBであり、状態ST304は初期化された状態である。
【0189】
以降の処理は、リフレッシュIDの値が異なる以外は、図10と同様である。すなわち、図12の状態AC304、状態AC305、状態ST305、状態AC306、状態ST306が、それぞれ、図10の状態AC103、状態AC104、状態ST104、状態AC105、状態ST105に対応する。
【0190】
次に、図13を参照して、送信通番および受信通番のオーバーフローについて説明する。図13は、リフレッシュIDの必要性を示す例でもある。また、たとえ送信通番と受信通番のオーバーフローが起こる直前で共有メモリデータパケット504が消失しても、図6〜図9に示した処理により共有メモリデータパケット504同士の前後関係を正しく共有メモリ制御部214が把握することができることを、図13の例は示している。
【0191】
図13の状態AC401、状態ST401、状態AC402、状態AC403、および状態ST402からなる部分は、具体的な数値が1と2ではなく254と255である点以外は、図11の状態AC201、状態ST201、状態AC202、状態AC203、および状態ST202からなる部分と同様である。つまり、図13は、通番フィールドの値が254の共有メモリデータパケット504は正常に送信および受信され、対応するACKパケット505も正常に送信および受信された後、通番フィールドの値が255の共有メモリデータパケット504が消失したことを表している。
【0192】
この時点の通番管理テーブル602は状態ST402なので、スタンバイ装置202の共有メモリ制御部214は、次に処理すべき共有メモリデータパケット504として、リフレッシュIDフィールドの値がAで、通番フィールドの値が255の共有メモリデータパケット504を期待して待っている状態である。
【0193】
一方で、アクティブ装置201の共有メモリ制御部213は、通番フィールドの値が255の共有メモリデータパケット504に対応する適切なACKパケット505を所定の時間内に受信することができないので、タイムアウトし、ユーザアプリケーション207からの次の要求を受け付ける。
【0194】
その結果、図6のステップS101で、共有メモリ制御部213のデータ送信スレッド403は、255に1を足してオーバーフローした値である0を算出し、算出した0に再度1を足して1を算出し、こうして得られた1を通番管理テーブル601の送信通番に設定する。また、ステップS102の判定が「YES」となるため、ステップS103で通番管理テーブル602のリフレッシュIDフィールドには「B」なる新たな値が設定される。その結果、通番管理テーブル602は状態AC404のようになる。
【0195】
そして、ステップS104でリフレッシュ要求パケット502がスタンバイ装置202に送信される。スタンバイ装置202がリフレッシュ要求パケット502を受信したときの通番管理テーブル602の状態は、状態ST402と同じ状態ST403である。よって、図7のステップS201の判定が「NO」となるので、ステップS202とS203により通番管理テーブル602が更新されて状態ST403から状態ST404へと変わる。ここで、受信通番が1、リフレッシュIDがBであり、状態ST404は初期化された状態である。
【0196】
そして、スタンバイ装置202から図7のステップS204でリフレッシュ応答パケット503がアクティブ装置201へ送信される。アクティブ装置201がリフレッシュ応答パケット503を受信したときの通番管理テーブル601の状態は、状態AC404と同じ状態AC405である。
【0197】
以降の処理は、リフレッシュIDの具体的な値が異なる以外は図10と同様であり、正常な共有メモリデータパケット504の送受信に関する処理である。つまり、オーバーフローの直前に消失した共有メモリデータパケット504があっても、オーバーフロー後の値を通番フィールドにもつ共有メモリデータパケット504は適切に処理される。具体的には、図13の状態AC406、状態ST405、状態AC407、状態ST406からなる部分は、図10の状態AC104、状態ST104、状態AC105、状態ST105からなる部分と同様である。
【0198】
もし、リフレッシュIDおよびそれに関する種々の処理がなければ、送信通番のオーバーフロー後に共有メモリデータパケット504を受信したとき、スタンバイ装置202の共有メモリ制御部214は判断を誤る。つまり、共有メモリ制御部214は、実際には重複していないパケットを、過去に受信した別のパケットと重複していると誤認する。リフ
レッシュIDは同じ値の通番同士を識別する値であり、この誤認を防ぐために利用される。なお、リフレッシュIDが識別する「通番」は、送信通番と受信通番の双方である。
【0199】
もし、リフレッシュIDおよびそれに関する種々の処理がなければ、スタンバイ装置202は、通番管理テーブル602の受信通番が255の状態のまま、通番フィールドの値が1の共有メモリデータパケット504を受信してしまう。この場合、図9のステップS402はリフレッシュIDに関する処理なので存在しない。よって、ステップS401の直後にステップS403が実行され、1<255なのでステップS401に戻ってしまう。しかし、これは誤った処理である。
【0200】
この誤認を防ぐためにリフレッシュIDが使われ、共有メモリデータパケット504に含まれる送信通番とリフレッシュIDの組み合わせが表す順序と、通番管理テーブル602に含まれる受信通番とリフレッシュIDの組み合わせが表す順序とが比較される。リフレッシュIDおよびそれに関する種々の処理により、オーバーフローをはさんでも共有メモリ制御部214が正しく共有メモリデータパケット504の順序を判定することができ、さらに、オーバーフローの前後に共有メモリデータパケット504が消失してさえ、正しい判定が可能となる。
【0201】
次に、本発明のプログラムを実行するコンピュータのブロック図である図14について説明する。本発明のプログラムには送信プログラムと受信プログラムがある。図1の送信元コンピュータ101は送信プログラムを実行し、送信先コンピュータ102は受信プログラムを実行し、図2のコンピュータ201および202は送信プログラムと受信プログラムの双方を実行する。送信元コンピュータ101、送信先コンピュータ102、コンピュータ201、およびコンピュータ202はいずれも、図14のコンピュータ700のような一般的なハードウェア構成を備える。
【0202】
図14のコンピュータ700は、CPU701、ROM(Read Only Memory)702、RAM703、通信インターフェイス704、入力装置705、出力装置706、記憶装置707、可搬型記憶媒体710の駆動装置708を備え、これらのすべてがバス709によって接続されている。
【0203】
また、コンピュータ700は、通信インターフェイス704を介してネットワーク711に接続されており、ネットワーク711を介して通信相手のコンピュータ713と通信を行うことができる。つまり、図1の例ではネットワーク711が経路107と経路108を含み、図2の例ではネットワーク711が第一経路215と第二経路216を含む。通信インターフェイス704は、コンピュータ700に元から組み込まれていてもよく、後からコンピュータ700に取り付けられたNICでもよい。また、図14には通信インターフェイス704として一つのブロックのみを示したが、通信インターフェイス704が物理的には2枚のNICであり、二つの経路のそれぞれに対応していてもよい。
【0204】
コンピュータ700が送信元コンピュータ101の場合は通信相手のコンピュータ713が送信先コンピュータ102であり、コンピュータ700が送信先コンピュータ102の場合は通信相手のコンピュータ713が送信元コンピュータ101である。同様に、コンピュータ700がコンピュータ201の場合は通信相手のコンピュータ713がコンピュータ202であり、コンピュータ700がコンピュータ202の場合は通信相手のコンピュータ713がコンピュータ201である。
【0205】
コンピュータ700と通信相手のコンピュータ713は、例えば、LAN(Local Area
Network)内の同じセグメントに含まれるなど、ネットワーク上の位置が近いことが好ましい。なぜなら、ルータによるルーティングを必要とするような、ネットワーク上で離れ
た位置にコンピュータ700と通信相手のコンピュータ713があると、複数の経路が重なってしまうことが多く、経路を多重化する効果が薄れるからである。例えば、複数の経路のすべてが特定のルータを経由する場合、そのルータの不具合が全経路に影響する。また、一般的に、コンピュータ700と通信相手のコンピュータ713のネットワーク上の位置が遠いほど、パケットの消失も起こりがちである。パケットの消失が多いほど、本発明を適用したシステム全体の性能も低下する。
【0206】
図2の共有メモリ205や206は、例えばRAM703の所定の領域である。RAM703の残りの領域は、図1の送信順序情報104または受信順序情報111、より具体的には通番管理テーブル601または602を格納するための制御用データ領域として利用される。図3のデータ転送制御表301または302も、制御用データ領域に格納される。
【0207】
入力装置705は、マウスなどのポインティングデバイスやキーボードである。出力装置706は例えば液晶ディスプレイなどの表示装置である。記憶装置707はハードディスクなどの磁気ディスク装置でもよく、他の種類の記憶装置でもよい。
【0208】
記憶装置707またはROM702には、本発明によるプログラムが格納されている。本発明によるプログラムの具体例は、図2の共有メモリ制御部213または214を実現するミドルウェアのプログラムである。本発明によるプログラムをCPU701が実行することにより、図6〜図9の処理が行われる。
【0209】
本発明によるプログラムは、LANまたはインターネットなどのネットワーク711を介して、プログラム提供者712から提供され、記憶装置707に記憶され、CPU701によって実行されてもよい、また、本発明によるプログラムを格納した可搬型記憶媒体710が駆動装置708にセットされて、格納されたプログラムがRAM703にロードされてCPU701により実行されてもよい。可搬型記憶媒体710の例は、CD(Compact Disc)やDVD(Digital Versatile Disk)などの光ディスク、光磁気ディスク、フレキシブルディスクなどである。
【0210】
なお、本発明は上記の実施形態に限られるものではなく、様々に変形可能である。以下にその例をいくつか述べる。
上記では主に、2台の装置間のデータの同期化のためのデータ送信に本発明を利用する場合について説明したが、当然その他の目的のデータ送信にも本発明は適用可能である。データ送信の目的によって、受信したパケットの内容を使って具体的にどのような処理を行うかも異なる。
【0211】
図2〜図13の実施形態におけるデータ送信の目的は、データの同期化である。よって、図2のコンピュータ202がスタンバイ装置として運用されているとき、共有メモリ制御部214は、図9のステップS405において、受信した共有メモリデータパケット504の共有メモリデータフィールドの内容を共有メモリ206に反映する。
【0212】
しかし、受信したパケットの内容を使うこのような処理は、実施形態に固有のものである。例えば、一般に、UDPはマルチキャストやブロードキャストにも利用され、リアルタイム性が重視されるストリーミングデータの送信にも利用される。UDPによるストリーミングデータの送信に本発明を適用する場合は、データ送信の目的はストリーミングデータの再生であろう。その場合、「共有メモリデータパケット」や「共有メモリデータフィールド」という名称は適切ではないものの、共有メモリデータパケット504と類似の形式のパケットが送信され、図9のステップS405は、送信されたパケットに含まれるストリーミングデータを再生する処理、またはストリーミングデータの再生を再生用アプ
リケーションに要求する処理に置き換えられる。
【0213】
本発明の適用対象は、ステップS405以外にも影響することがある。例えば、ある別の実施形態では、パケットの消失が生じた場合に、消失したパケットより後の順序に対応するパケットに関する処理を行わない。例えば、送信通番が「3」のパケットが消失したら、送信通番が「4」のパケットは受信されても破棄される。そのような実施形態では、図9のステップS404の実行後、ステップS405は実行されず、処理がステップS406に進む。
【0214】
パケットが消失したときの動作には、共有メモリ制御部213を呼び出すユーザアプリケーションの数も影響する。図2には一つのユーザアプリケーション207のみを示したが、一般には、複数のユーザアプリケーションが共有メモリ制御部213にデータ209の反映を要求する。
【0215】
例えば、共有メモリ制御部213は、ユーザアプリケーションA1からの要求を「4」なる送信通番で処理し、ユーザアプリケーションA2からの要求を「5」なる送信通番で処理するかもしれない。この場合、「4」なる送信通番に対応する共有メモリデータパケット504が消失しても、ユーザアプリケーションA2には関係がない。よって、「5」なる送信通番に対応する共有メモリデータパケット504は、もし正常にスタンバイ装置202で受信されたならば、破棄されるべきではない。その共有メモリデータパケット504の共有メモリデータフィールドの内容は、共有メモリ206に反映されるべきである。
【0216】
一方で、一つのユーザアプリケーションA1からのみ共有メモリ制御部213が要求を受け付ける実施形態においては、消失したパケットP1と、その次のパケットP2は必ず同じユーザアプリケーションA1のデータを含む。よって、データの整合性を保つために、共有メモリ制御部214は、パケットP1の消失を検知したらパケットP2を破棄したほうがよい場合もある。
【0217】
また、データの一部が欠損することを許容するある種のアプリケーションは、パケットが消失してもパケットを再送しない。そのようなユーザアプリケーションと組み合わせて本発明を利用する場合、共有メモリ制御部213は、共有メモリデータパケット504の送信後、一定時間内にACKパケット505を受信することができずにタイムアウトしたとき、送信が失敗したことをユーザアプリケーションに通知しなくてもよい。
【0218】
図9の実施形態では、パケットが消失した場合もステップS406でACKパケット505を返信している。しかし、消失を示す別種のパケットである「ACK‐NGパケット」を定義し、ACK‐NGパケットを返信するように図9の処理を変形してもよい。
【0219】
もちろん、図9の処理であっても、図11のシーケンス図から分かるように、送信側の共有メモリ制御部213が消失を検知することは可能である。すなわち、連続する二つのACKパケット505の通番フィールドとリフレッシュIDフィールドが、連続する順序を表していなければ、共有メモリ制御部213は、その不連続の部分でパケットが消失したことを検知することができる。つまり、あるパケットの消失後に正常に受信された別のパケットに対するACKパケット505は、消失を通知する役割も兼ねている。しかし、ACK‐NGパケットを適切に定義すれば、共有メモリ制御部213は、単にTYPE2フィールドの値を読み取るだけで、パケットが生じたか否かを検知することができる。
【0220】
なお、リフレッシュ応答パケット503などの制御用パケットは、実施形態によっては、一つの経路のみを介して送信してもよい。仮にその一つの経路が異常で、リフレッシュ
応答パケット503が正常に受信されなくても、通番管理テーブル601と602のリフレッシュIDを適切に同期させることは可能である。そのためには、例えば、アクティブ装置201の共有メモリ制御部213がタイムアウトして、再度リフレッシュ要求パケット502の送信からやり直せばよい。リフレッシュ要求パケット502やACKパケット505も同様に、少なくとも一つの経路を介して送信すればよく、すべての経路を介して送信しなくてもよい。
【0221】
また、図2の例では、アクティブ装置とスタンバイ装置が交互に切り換えられるという前提があるので、共有メモリ制御部213と214はともに、データを送信するための機能と受信するための機能の双方を備えている。しかし、実施形態によっては、一方の装置にはデータを送信する機能のみが組み込まれており、他方の装置にはデータを受信する機能のみが組み込まれていてもよい。
【0222】
なお、データを送信するための機能と受信するための機能の双方を備えた二つの装置を組にする例は、図2の例に限らない。図2では、共有メモリデータパケット504は必ずアクティブ装置201からスタンバイ装置202へ送信される。しかし、データの同期化以外の目的で、二つの装置XとYの間でデータをやりとりする通信の場合、装置Xから装置Yへの送信と、装置Yから装置Xへの送信の両方が、予測不可能な順序でランダムに生じることがある。そのような場合にも、本発明を適用することは可能である。その場合、リフレッシュIDを更新するタイミングが、図2の実施形態とは異なっていてもよい。
【0223】
図2の実施形態では、アクティブ装置とスタンバイ装置が切り換えられるたびに、リフレッシュ要求パケット502とリフレッシュ応答パケット503が送受信され、通番管理テーブル601と602のリフレッシュIDが更新されることを前提としている。この前提は、必須の前提条件ではないものの、管理の簡潔さなどの面から、切り換えをまたいで同じ値のリフレッシュIDを使い続けるよりも好ましい。
【0224】
一方で、装置Xから装置Yへの送信と、装置Yから装置Xへの送信の両方がランダムに生じる場合には、例えば装置Xから装置Yへの送信があった後で装置Yが装置Xにパケットを送信しようとするたびにリフレッシュIDを更新すると、リフレッシュIDの更新が頻繁になりすぎることがある。よって、この場合、送信順序情報のオーバーフロー時と装置の再起動時にのみリフレッシュIDを更新するように装置XとYを構成してもよい。
【0225】
図2では、共有メモリ制御部213と214を実現するミドルウェアとして本発明を実施する例を示した。しかし、本発明によるプログラムは、OSに組み込まれていてもよく、アプリケーションプログラムであってもよい。また、本発明によるプログラムは、マルチスレッド・プログラムでなくてもよい。また、本発明は、ソフトウェアすなわちプログラムにより実現されるだけでなく、ハードウェア、ファームウェア、またはこれらの任意の組み合わせにより実現することも可能である。
【0226】
上記では、経路の数が2の場合の例について説明したが、三つ以上の経路を用いて本発明を実施することもできる。例えば、三つの経路を用いる場合、図4には、第一経路受信スレッドと第二経路受信スレッド407〜410のほかに、第三経路受信スレッドを共有メモリ制御部213と214にそれぞれ追加する必要があり、図3のデータ転送制御表301と302には、第三経路に関するレコードを追加する必要がある。しかし、三つ以上の経路を用いる場合でも、フローチャートに示した処理の流れは二つの経路を用いる場合と同様である。ただし、実用上は、次のような理由から、二つの経路を利用することが最適である場合が多い。
【0227】
・経路の数を増やすことはケーブルなどのハードウェアの増設をともない、費用がかか
る。
・ハードウェアの増設を避けるために、複数の経路がハードウェアを共有することは可能である。しかし、同じハードウェアを共有する経路の数が増えるほど、そのハードウェアでエラーが発生しやすくなる。例えば、同一のケーブルを共有する経路の数を増やすほど、そのケーブル上のトラフィック量が増加し、そのケーブル内で衝突などのエラーが発生しやすくなる。
【0228】
・ハードウェアを共有しない二つの経路に故障が同時に発生することは、事実上ほとんどないので、二つの経路だけで実用上十分な信頼性を得ることができる。
また、図5に示したパケットの形式も、実施形態に応じて変形することができる。各フィールドの長さやフィールドの並び順は実施形態によって任意である。また、パケットの種別をTYPE1とTYPE2により階層的に分類せず、一つのフィールドだけでパケットの種別を示してもよいことは当然である。また、実施形態によってはリフレッシュIDフィールドが不要なこともある。
【0229】
つまり、送信通番と受信通番の桁数が、実用上、同じ番号を再利用する可能性がないと見なせる程度に十分多い場合などには、リフレッシュIDを使う必要がない。このとき、各種パケットにはリフレッシュIDフィールドが不要であり、通番管理テーブル601と602にもリフレッシュIDフィールドは不要である。
【0230】
例えば、装置を一定の間隔で再起動させるという規則にしたがってシステムが運用される場合、送信通番と受信通番の桁数と、再起動の間隔との関係によっては、リフレッシュIDフィールドが不要となる場合がありうる。
【0231】
また、上記実施形態の送信通番と受信通番の値は、順序が前であるほど小さい値である。しかし、別の実施形態では、順序が前であるほど大きい値であってもよい。当然その場合は、図6のステップS102の加算を減算に変え、図9のステップS403の判定で「より大きい」と「未満」を逆転させる、などの変更をあわせて行う必要がある。
【0232】
さらに、送信順序情報と受信順序情報は、順序の前後関係を比較することが可能な情報でさえあれば、上記の実施形態以外の任意の形式でよい。例えば、上記の例の受信通番は、次に受信されると期待されるパケットの送信通番そのものの値である。しかし、別の実施形態では、最後に受信したパケットの送信通番を通番管理テーブル601や602に受信通番として格納し、格納された受信通番に1を足した値を、受信した共有メモリデータパケット504の通番フィールドの値と比較することによって、順序の前後を判定してもよい。この場合、具体的に使われる値が最後に受信したパケットの送信通番であるという点が図6などの例とは異なる。しかし、受信通番が、次に受信されると期待されるパケットの順序を示すための値であることに変わりはない。同様に、送信順序情報と受信順序情報の一部である識別情報も、上記のようなリフレッシュID以外の任意の形式の情報であってよい。
【0233】
以上説明したことを概観すれば本発明は以下のような構成を備えるものである。
(付記1)
データの到達を保証しないプロトコルにより送信元コンピュータから複数の経路のそれぞれを介して、異なるパケット間の送信順序を示す送信順序情報を含めて送信された同内容のパケットを受信して、パケットの重複および消失を判別する処理を送信先コンピュータに制御させる受信プログラムであって、
前記複数の経路のいずれを介して送信された前記パケットでも受信する受信ステップと、
受信した前記パケットから、前記送信順序情報を取得する送信順序情報取得ステップと

過去に受信した前記パケットの前記送信順序情報にもとづいて管理され、次に受信されると期待されるパケットに対応する順序を表す受信順序情報を、格納手段から取得する受信順序情報取得ステップと、
前記送信順序情報が表す第一の順序と前記受信順序情報が表す第二の順序を比較する比較ステップと、
前記第一の順序が前記第二の順序よりも前の場合に、前記受信ステップで受信した前記パケットが、過去に受信した他のパケットと重複すると判断する重複判断ステップと、
前記第一の順序と前記第二の順序が等しい場合に、前記格納手段に格納された前記受信順序情報が表す順序が前記第二の順序の次の順序になるよう前記格納手段を更新する正常処理ステップと、
前記第一の順序が前記第二の順序よりも後の場合に、パケットの消失が生じたと判断する消失判断ステップと、
を前記送信先コンピュータに実行させることを特徴とする受信プログラム。
(付記2)
前記受信順序情報は番号を含み、
前記正常処理ステップでは、前記受信順序情報に含まれる前記番号に1を加算または減算することにより、前記受信順序情報が更新される、
ことを特徴とする付記1に記載の受信プログラム。
(付記3)
前記正常処理ステップでさらに前記送信先コンピュータに、前記パケットの送達確認を前記送信元コンピュータへ送信させることを特徴とする付記1に記載の受信プログラム。(付記4)
前記消失判断ステップでさらに前記送信先コンピュータに、前記送信順序情報にもとづいて前記格納手段を更新させることを特徴とする付記1に記載の受信プログラム。
(付記5)
前記消失判断ステップでさらに前記送信先コンピュータに、パケットの消失を前記送信元コンピュータに通知させることを特徴とする付記1に記載の受信プログラム。
(付記6)
前記送信順序情報と前記受信順序情報はいずれも、有限の桁数の番号と、同じ値の前記番号同士を識別するための識別情報の双方を含み、
前記送信元コンピュータから送信された、前記識別情報の更新を要求するリフレッシュ要求パケットを受信した場合は、
前記受信順序情報に含まれる前記識別情報が、前記リフレッシュ要求パケットが指定する値になるよう前記格納手段を更新する識別情報更新ステップと、
前記リフレッシュ要求パケットの送達確認を前記送信元コンピュータへ送信する送達確認ステップと、
をさらに前記送信先コンピュータに実行させることを特徴とする付記1に記載の受信プログラム。
(付記7)
前記比較ステップでは、前記受信ステップで受信した前記パケットに含まれる前記識別情報と、前記受信順序情報に含まれる前記識別情報が等しくなければ、前記第一の順序が前記第二の順序よりも前だと判断される、
ことを特徴とする付記6に記載の受信プログラム。
(付記8)
前記識別情報は、日付または時刻の少なくとも一方にもとづく情報であることを特徴とする付記6に記載の受信プログラム。
(付記9)
前記プロトコルはUDPであることを特徴とする付記1に記載の受信プログラム。
(付記10)
データの到達を保証しないプロトコルによる送信先コンピュータへのデータの送信処理を送信元コンピュータに制御させる送信プログラムであって、
異なるパケット間の送信順序を示す送信順序情報を格納手段から取得する送信順序情報取得ステップと、
前記格納手段に格納されている前記送信順序情報を更新する送信順序情報更新ステップと、
同じ前記送信順序情報および同じ送信対象のデータを含む、複数の経路のそれぞれに対応する複数のパケットを作成するパケット作成ステップと、
前記複数の経路のそれぞれを介して前記プロトコルにより前記複数のパケットを前記送信先コンピュータに送信する送信ステップと、
を前記送信元コンピュータに実行させることを特徴とする送信プログラム。
(付記11)
前記送信順序情報は番号を含み、
前記送信順序情報更新ステップでは、前記送信順序情報に含まれる前記番号に1を加算または減算することにより、前記送信順序情報が更新される、
ことを特徴とする付記10に記載の送信プログラム。
(付記12)
前記送信順序情報は、有限の桁数の番号と、同じ値の前記番号同士を識別するための識別情報とを含み、
前記番号が所定の値に等しい場合に、前記送信プログラムは、前記送信ステップよりも前に、
前記識別情報を更新する識別情報更新ステップと、
更新された前記識別情報を前記送信先コンピュータに設定するよう要求するリフレッシュ要求パケットを前記送信先コンピュータに送信するリフレッシュ要求ステップと、
前記リフレッシュ要求パケットの送達確認が前記送信先コンピュータから送信されるのを待つ送達確認待ちステップと、
を前記送信元コンピュータに実行させる、
ことを特徴とする付記10に記載の送信プログラム。
(付記13)
前記識別情報更新ステップにおいて前記識別情報は、該識別情報更新ステップが実行される日付または時刻の少なくとも一方にもとづいて更新されることを特徴とする付記12に記載の送信プログラム。
(付記14)
前記複数の経路のそれぞれの状態を監視する監視ステップをさらに前記送信元コンピュータに実行させ、
前記送信ステップにおいて、前記送信元コンピュータに、前記監視ステップにより前記状態が悪いと判断された前記経路を介した送信を省略させる、
ことを特徴とする付記10に記載の送信プログラム。
(付記15)
前記監視ステップは、所定の間隔で前記送信先コンピュータが前記複数の経路のそれぞれを介して前記送信元コンピュータに送信する監視用パケットを受信し、前記監視用パケットの受信間隔にもとづいて前記複数の経路のそれぞれの前記状態を判断するステップであることを特徴とする付記14に記載の送信プログラム。
(付記16)
データの到達を保証しないプロトコルにより複数の経路のそれぞれを介して第一のコンピュータが第二のコンピュータにパケットを送信するシステムであって、
前記第一のコンピュータが、
異なるパケット間の送信順序を示す送信順序情報を格納する送信順序情報格納手段と、
前記送信順序情報を取得してから、前記送信順序情報格納手段に格納された前記送信順序情報を更新する送信順序情報更新手段と、
取得された同じ前記送信順序情報および同じ送信対象のデータを含む、前記複数の経路のそれぞれに対応する複数のパケットを作成するパケット作成手段と、
前記複数の経路のそれぞれを介して前記プロトコルにより前記複数のパケットを前記第二のコンピュータに送信する送信手段とを備え、
前記第二のコンピュータが、
前記複数の経路のいずれを介して送信された前記パケットでも受信する受信手段と、
過去に受信した前記パケットの前記送信順序情報にもとづいて管理され、次に受信されると期待されるパケットに対応する順序を表す受信順序情報を格納する受信順序情報格納手段と、
受信した前記パケットに含まれる前記送信順序情報が表す第一の順序と、前記受信順序情報が表す第二の順序を比較して、前記第一の順序が前記第二の順序よりも前の場合は受信した前記パケットが過去に受信した他の前記パケットと重複すると判断し、前記第一の順序が前記第二の順序よりも後の場合はパケットの消失が生じたと判断する比較判断手段と、
前記第一の順序と前記第二の順序が等しい場合に、前記受信順序情報が表す順序が前記第二の順序の次の順序になるよう前記受信順序情報格納手段を更新する正常処理手段と、
を備えることを特徴とするシステム。
(付記17)
前記第一のコンピュータが、前記第二のコンピュータと同様の受信手段、受信順序情報格納手段、比較判断手段、および正常処理手段を備え、
前記第二のコンピュータが、前記第一のコンピュータと同様の送信順序情報格納手段、送信順序情報更新手段、パケット作成手段、および送信手段を備え、
前記第一のコンピュータから前記第二のコンピュータへの前記パケットの送信と、前記第二のコンピュータから前記第一のコンピュータへの前記パケットの送信の双方が行われる、
ことを特徴とする付記16のシステム。
(付記18)
前記第一のコンピュータが第一の記憶装置を備え、
前記第二のコンピュータが第二の記憶装置を備え、
前記第一のコンピュータと前記第二のコンピュータが、それぞれ現用装置と該現用装置に対応する待機装置として機能し、
前記第一の記憶装置に格納されたデータを前記第一のコンピュータが前記第二のコンピュータに送信し、受信したデータを前記第二のコンピュータが前記第二の記憶装置に上書きすることにより、前記第一の記憶装置と前記第二の記憶装置がそれぞれ格納するデータが同期化される、
ことを特徴とする付記16に記載のシステム。
(付記19)
データの到達を保証しないプロトコルにより複数の経路のそれぞれを介して、第一の装置が第二の装置に、異なるパケット間の送信順序を示す送信順序情報を含めてパケットを送信する方法であって、
前記第一の装置において、
同じ前記送信順序情報および同じ送信対象のデータを含む、前記複数の経路に対応する複数のパケットを作成し、
前記複数の経路のそれぞれを介して前記プロトコルにより前記複数のパケットを前記第二の装置に送信し、
前記第二の装置において、
前記複数の経路の一つから受信した前記パケットの前記送信順序情報が、過去に受信したパケットの前記送信順序情報と重複する場合は、前記パケットを破棄する、
ことを特徴とする方法。
(付記20)
前記第二の装置において、
次に受信されると期待されるパケットに対応する順序を表す情報を、過去に受信した前記パケットの前記送信順序情報にもとづいて、受信順序情報として管理し、
受信した前記パケットの前記送信順序情報と前記受信順序情報が表す順序が等しければ、受信した前記パケットを処理する、
ことを特徴とする付記19に記載の方法。
【図面の簡単な説明】
【0234】
【図1】本発明の原理を示す図である。
【図2】本発明を利用してデータの同期化を行う二重化システムの構成図である。
【図3】データ転送制御表の例である。
【図4】共有メモリ制御部を実現するミドルウェアを構成するスレッドのブロック図である。
【図5】各種パケットの形式を説明する図である。
【図6】共有メモリデータ送信処理のフローチャートである。
【図7】リフレッシュ要求受信処理のフローチャートである。
【図8】リフレッシュ応答受信処理のフローチャートである。
【図9】共有メモリデータ受信処理のフローチャートである。
【図10】初期状態と、その後に続く正常な処理の結果を示す処理シーケンス図である。
【図11】共有メモリデータパケットが消失する場合の処理シーケンス図である。
【図12】アクティブ装置を再起動した場合の処理シーケンス図である。
【図13】送信通番および受信通番のオーバーフローを説明する処理シーケンス図である。
【図14】本発明のプログラムを実行するコンピュータのブロック図である。
【符号の説明】
【0235】
101 送信元コンピュータ
102 送信先コンピュータ
103 送信対象データ
104、109、110 送信順序情報
105、106 パケット
107、108 経路
111 受信順序情報
201 コンピュータ、アクティブ装置
202 コンピュータ、スタンバイ装置
203 仮想共有メモリ
205、206 共有メモリ
207 ユーザアプリケーション
209、210 データ
210 データ
211、212 ミドルウェア群
213、214 共有メモリ制御部
215 第一経路
216 第二経路
301、302 データ転送制御表
401、402 ヘルスチェックスレッド
403、404 データ送信スレッド
405、406 データ受信スレッド
407、408 第一経路受信スレッド
409、410 第二経路受信スレッド
411〜414 UDPポート
501 ヘルスチェックパケット
502 リフレッシュ要求パケット
503 リフレッシュ応答パケット
504 共有メモリデータパケット
505 ACKパケット
601a、601b、602a、602b 通番管理テーブル
700 コンピュータ
701 CPU
702 ROM
703 RAM
704 通信インターフェイス
705 入力装置
706 出力装置
707 記憶装置
708 駆動装置
709 バス
710 可搬型記憶媒体
711 ネットワーク
712 プログラム提供者
713 通信相手のコンピュータ

【特許請求の範囲】
【請求項1】
データの到達を保証しないプロトコルにより送信元コンピュータから複数の経路のそれぞれを介して、異なるパケット間の送信順序を示す送信順序情報を含めて送信された同内容のパケットを受信して、パケットの重複および消失を判別する処理を送信先コンピュータに制御させる受信プログラムであって、
前記複数の経路のいずれを介して送信された前記パケットでも受信する受信ステップと、
受信した前記パケットから、前記送信順序情報を取得する送信順序情報取得ステップと、
過去に受信した前記パケットの前記送信順序情報にもとづいて管理され、次に受信されると期待されるパケットに対応する順序を表す受信順序情報を、格納手段から取得する受信順序情報取得ステップと、
前記送信順序情報が表す第一の順序と前記受信順序情報が表す第二の順序を比較する比較ステップと、
前記第一の順序が前記第二の順序よりも前の場合に、前記受信ステップで受信した前記パケットが、過去に受信した他のパケットと重複すると判断する重複判断ステップと、
前記第一の順序と前記第二の順序が等しい場合に、前記格納手段に格納された前記受信順序情報が表す順序が前記第二の順序の次の順序になるよう前記格納手段を更新する正常処理ステップと、
前記第一の順序が前記第二の順序よりも後の場合に、パケットの消失が生じたと判断する消失判断ステップと、
を前記送信先コンピュータに実行させることを特徴とする受信プログラム。
【請求項2】
前記正常処理ステップでさらに前記送信先コンピュータに、前記パケットの送達確認を前記送信元コンピュータへ送信させることを特徴とする請求項1に記載の受信プログラム。
【請求項3】
前記消失判断ステップでさらに前記送信先コンピュータに、前記送信順序情報にもとづいて前記格納手段を更新させることを特徴とする請求項1に記載の受信プログラム。
【請求項4】
前記送信順序情報と前記受信順序情報はいずれも、有限の桁数の番号と、同じ値の前記番号同士を識別するための識別情報の双方を含み、
前記送信元コンピュータから送信された、前記識別情報の更新を要求するリフレッシュ要求パケットを受信した場合は、
前記受信順序情報に含まれる前記識別情報が、前記リフレッシュ要求パケットが指定する値になるよう前記格納手段を更新する識別情報更新ステップと、
前記リフレッシュ要求パケットの送達確認を前記送信元コンピュータへ送信する送達確認ステップと、
をさらに前記送信先コンピュータに実行させることを特徴とする請求項1に記載の受信プログラム。
【請求項5】
データの到達を保証しないプロトコルによる送信先コンピュータへのデータの送信処理を送信元コンピュータに制御させる送信プログラムであって、
異なるパケット間の送信順序を示す送信順序情報を格納手段から取得する送信順序情報取得ステップと、
前記格納手段に格納されている前記送信順序情報を更新する送信順序情報更新ステップと、
同じ前記送信順序情報および同じ送信対象のデータを含む、複数の経路のそれぞれに対応する複数のパケットを作成するパケット作成ステップと、
前記複数の経路のそれぞれを介して前記プロトコルにより前記複数のパケットを前記送信先コンピュータに送信する送信ステップと、
を前記送信元コンピュータに実行させることを特徴とする送信プログラム。
【請求項6】
前記送信順序情報は、有限の桁数の番号と、同じ値の前記番号同士を識別するための識別情報とを含み、
前記番号が所定の値に等しい場合に、前記送信プログラムは、前記送信ステップよりも前に、
前記識別情報を更新する識別情報更新ステップと、
更新された前記識別情報を前記送信先コンピュータに設定するよう要求するリフレッシュ要求パケットを前記送信先コンピュータに送信するリフレッシュ要求ステップと、
前記リフレッシュ要求パケットの送達確認が前記送信先コンピュータから送信されるのを待つ送達確認待ちステップと、
を前記送信元コンピュータに実行させる、
ことを特徴とする請求項5に記載の送信プログラム。
【請求項7】
データの到達を保証しないプロトコルにより複数の経路のそれぞれを介して第一のコンピュータが第二のコンピュータにパケットを送信するシステムであって、
前記第一のコンピュータが、
異なるパケット間の送信順序を示す送信順序情報を格納する送信順序情報格納手段と、
前記送信順序情報を取得してから、前記送信順序情報格納手段に格納された前記送信順序情報を更新する送信順序情報更新手段と、
取得された同じ前記送信順序情報および同じ送信対象のデータを含む、前記複数の経路のそれぞれに対応する複数のパケットを作成するパケット作成手段と、
前記複数の経路のそれぞれを介して前記プロトコルにより前記複数のパケットを前記第二のコンピュータに送信する送信手段とを備え、
前記第二のコンピュータが、
前記複数の経路のいずれを介して送信された前記パケットでも受信する受信手段と、
過去に受信した前記パケットの前記送信順序情報にもとづいて管理され、次に受信されると期待されるパケットに対応する順序を表す受信順序情報を格納する受信順序情報格納手段と、
受信した前記パケットに含まれる前記送信順序情報が表す第一の順序と、前記受信順序情報が表す第二の順序を比較して、前記第一の順序が前記第二の順序よりも前の場合は受信した前記パケットが過去に受信した他の前記パケットと重複すると判断し、前記第一の順序が前記第二の順序よりも後の場合はパケットの消失が生じたと判断する比較判断手段と、
前記第一の順序と前記第二の順序が等しい場合に、前記受信順序情報が表す順序が前記第二の順序の次の順序になるよう前記受信順序情報格納手段を更新する正常処理手段と、
を備えることを特徴とするシステム。
【請求項8】
データの到達を保証しないプロトコルにより複数の経路のそれぞれを介して、第一の装置が第二の装置に、異なるパケット間の送信順序を示す送信順序情報を含めてパケットを送信する方法であって、
前記第一の装置において、
同じ前記送信順序情報および同じ送信対象のデータを含む、前記複数の経路に対応する複数のパケットを作成し、
前記複数の経路のそれぞれを介して前記プロトコルにより前記複数のパケットを前記第二の装置に送信し、
前記第二の装置において、
前記複数の経路の一つから受信した前記パケットの前記送信順序情報が、過去に受信し
たパケットの前記送信順序情報と重複する場合は、前記パケットを破棄する、
ことを特徴とする方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate


【公開番号】特開2008−211682(P2008−211682A)
【公開日】平成20年9月11日(2008.9.11)
【国際特許分類】
【出願番号】特願2007−48143(P2007−48143)
【出願日】平成19年2月27日(2007.2.27)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】