図1は、実施形態にかかる通信方法の例を説明する図である。通信装置10aと通信装置10bは、いずれも、端末からフレームを受信し、受信フレームの宛先に向けて、受信フレームを転送する。通信装置10aと通信装置10bは、リンク0〜リンク9までの10本の物理リンクで接続されており、リンク0〜リンク9については、リンクアグリゲーションにより、論理的な1本のリンクとして取り扱われるものとする。さらに、通信装置10aと通信装置10bの間の通信に使用されるポートの番号は、そのポートに接続されているリンクの番号と一致しているものとする。図1において、通信装置10aは、端末Xおよび端末Mと通信し、通信装置10bは、端末Yおよび端末Nと通信するものとする。図1では、各フレームの送信元と宛先の組み合わせを分かりやすくするために、端末Xから端末Y宛に送信されるフレームを、白抜きの四角で表し、端末Mから端末N宛に送信されるフレームを、点描を含む角が丸い四角で表す。
通信装置10aは、送信元と宛先の組み合わせごとに、巡回番号(シーケンス番号、sequence number、SN)を生成する。このため、図1に示すように、端末Xから端末Yに送信されるフレームと端末Mから端末Nに送信されるフレームとでは、別々にシーケンス番号が割り当てられる。ここで、シーケンス番号は、予め決められた特定の値の範囲を巡回するように決められる。図1の例では、送信元と宛先の各組み合わせに対し、0〜3の値のいずれかがシーケンス番号として割り当てられている。通信装置10aは、フレーム毎に、送信元アドレス、宛先アドレス、および、シーケンス番号の組み合わせをキーとして、ハッシュ関数を用いて、物理リンクの番号を求める。通信装置10aは、ハッシュ関数を用いて求められた番号に対応する物理リンクから、フレームを、通信装置10bに向けて出力する。ここでは、端末Xから端末Y宛のフレームは、SN=0ならリンク8、SN=1ならリンク2、SN=2ならリンク4、SN=3ならリンク5を介して通信装置10bに送信されるものとする。また、端末Mから端末N宛のフレームは、SN=0ならリンク7、SN=1ならリンク0、SN=2ならリンク9、SN=3ならリンク1を介して通信装置10bに送信されるものとする。
通信装置10bは、通信装置10aが物理リンクの計算に使用するハッシュ関数を予め保持しており、図1に示すように、フレームの送信元、宛先、および、シーケンス番号の組み合わせごとに、通信に使用される物理リンクや受信ポートの番号を特定できる。そこで、通信装置10bは、フレームの送信元と宛先の組み合わせごとに、フレームが入力されたポートの番号を特定し、フレームを送信された順序に並べ替える。例えば、通信装置10bは、テーブル5aに示す計算結果より、端末Xから端末Yに送信されるフレームは、シーケンス番号が0から3の順に、リンク8、リンク2、リンク4、リンク5から入力されてくると認識する。そこで、通信装置10bは、端末Xから端末Y宛のフレームを、リンク8からの受信フレーム、リンク2からの受信フレーム、リンク4からの受信フレーム、リンク5からの受信フレームの順に送信されたものとして、端末Yに送信する。同様に、通信装置10bは、端末Mから端末N宛のフレームを、テーブル5bを用いて、リンク7からの受信フレーム、リンク0からの受信フレーム、リンク9からの受信フレーム、リンク1からの受信フレームの順に送信されたものとして、端末Nに送信する。
このように、実施形態に係る通信装置10は、複数の物理リンクに分けて送信されたフレームについて、送信元、宛先、フレームの入力ポート番号を用いて、送信された順序を特定することができる。このため、実施形態に係る通信装置10は、複数の物理リンクを用いてフレームを送受信しても、フレームの順序逆転の発生を防ぐことができる。従って、通信装置10は、個々の物理リンクの帯域を超えた帯域幅で行われる通信も中継することができる。さらに、実施形態にかかる方法では、フレームにシーケンス番号が含まれていない。このため、端末間で送受信に使用するフレームのフォーマットを変更しなくても、物理リンク以上の帯域幅の通信の中継が可能である。
<装置構成>
図2は、ネットワークの例を示す図である。通信システムは、通信装置10a、通信装置10b、端末を含む。図2では、端末X、端末Y、端末M、端末Nの4台が明記されているが、ネットワーク中に含まれる端末の数は任意である。通信装置10aと通信装置10bは、物理リンク11(11a〜11c)を介して直接接続されている。また、物理リンク11a〜11cは、リンクアグリゲーションにより、論理的に1本のリンクとして扱われるものとする。なお、物理リンク11の数は、任意の2以上の数から実装に応じて選択されるものとする。
図3は、通信装置10の構成の例を示す。通信装置10は、インタフェース回路(IF)20(20a〜20d)、プロセッサ30、バス35(35a、35b)、スイッチ40、受信処理回路50、インタフェース回路90(90a〜90c)を備える。なお、図3では、インタフェース回路20とインタフェース回路90の区別を容易にするために、ネットワーク側のインタフェース回路90は、IF(NW)としている。スイッチ40は、端末側のポート(c0〜cy)とネットワーク側のポート(n0〜nx)を備えている。以下、端末側のポートを表す場合は、アルファベットのcに続けて、そのポートに割り当てられているポート番号を記載する。例えば、端末側の2番ポートはc2と表記する。同様に、ネットワーク側のポートを表す場合は、アルファベットのnに続けて、そのポートに割り当てられているポート番号を記載する。例えば、ネットワーク側の3番ポートはn3と表記する。ここで、ネットワーク側のポートの数は、物理リンク11の数と等しいものとする。また、以下の説明では、物理リンク11のリンクの番号と、物理リンク11への出入力に用いられるポートの番号は等しいものとする。例えば、通信装置10aがネットワーク側の2番のポート(n2)に出力したフレームは、リンク2を介して通信装置10bに送信される。
インタフェース回路20は、端末との間でフレームを送受信する。また、インタフェース回路20は、端末から受信したフレームを、ネットワーク側のどのポートから出力するかを決定する。インタフェース回路20は、フレームの出力ポートを識別する情報とともに、フレームをスイッチ40に出力する。スイッチ40は、インタフェース回路20から通知された情報に従って、フレームをネットワーク側のポートから出力する。その結果、フレームは、送信側の通信装置10のネットワーク側の出力ポートに接続されているインタフェース回路90を介して、受信側の通信装置10に送信される。
プロセッサ30は、通信装置10の管理や運用に関する処理を行う。インタフェース回路90は、物理リンク11を介してフレームを送受信する。インタフェース回路90は、受信したフレームを受信処理回路50に出力する。受信処理回路50は、受信したフレームを、送信された順番に並べ替える。また、受信処理回路50は、送信側の通信装置10と受信側の通信装置10の間で同期が取れているかを判定する。さらに、受信処理回路50は、フレームの宛先に応じて、フレームの出力先となる端末側のポートの情報を、受信フレームとともに、スイッチ40に出力する。スイッチ40は、受信処理回路50から通知された情報に従って、受信フレームを端末側のポートからインタフェース回路20に出力する。
インタフェース回路20、スイッチ40、受信処理回路50において行われる処理については、後述する。バス35aは、インタフェース回路20、スイッチ40、プロセッサ30を、相互にデータの受け渡しが行えるように接続する。また、バス35bは、インタフェース回路90、受信処理回路50、プロセッサ30を、相互にデータの受け渡しが行えるように接続する。
<送信処理>
以下、通信装置10aが端末から受信したフレームを、通信装置10bに送信する場合を例として、通信装置10で行われる送信処理について詳しく説明する。
図4は、インタフェース回路20の構成の例を示す。インタフェース回路20は、送受信部21、フレーム先頭検出部22、遅延生成部23、タイミング生成部24、メモリ25、抽出部26、ポート番号演算部27、出力部28を備える。送受信部21、フレーム先頭検出部22、遅延生成部23、タイミング生成部24、メモリ25、抽出部26、ポート番号演算部27、出力部28は、それぞれ、ハードウェアで形成されても良い。また、インタフェース回路20が、プロセッサを備えている場合は、プロセッサが、フレーム先頭検出部22、遅延生成部23、タイミング生成部24、抽出部26、ポート番号演算部27として動作しても良い。
送受信部21は、端末と通信装置10の間の回線を終端し、端末との間でフレームを送受信する。送受信部21は、端末から受信したフレームをフレーム先頭検出部22と遅延生成部23に出力する。フレーム先頭検出部22は、フレームの先頭を検出すると、フレームの先頭を検出したことをタイミング生成部24に通知する。タイミング生成部24は、内部にカウンタを保持しており、カウンタを用いて、メモリ25、抽出部26、出力部28にフレームや情報が入力されるタイミングを計測する。タイミング生成部24は、フレーム先頭検出部22からの通知を受けた時刻を、タイミングの計測の基準とする。タイミング生成部24が出力する信号とタイミングの例については、後述する。
遅延生成部23は、送受信部21から入力されたフレームについて、所定の遅延を加えて、メモリ25と抽出部26に出力する。メモリ25は、遅延生成部23から入力されたフレームを保持し、タイミング生成部24から通知されたタイミングで、保持しているフレームを、出力部28に出力する。このため、メモリ25はデュアルポートメモリで実現されてもよい。抽出部26は、遅延生成部23から入力されたフレームから、送信元アドレスと宛先アドレスを抽出して、ポート番号演算部27に出力する。また、抽出部26は、フレームの送信元アドレスと宛先アドレスに対応付けて、シーケンス番号を生成して、ポート番号演算部27に出力する。ポート番号演算部27は、ハッシュ関数を予め記憶しており、送信元アドレス、宛先アドレス、および、シーケンス番号の組み合わせをキーとして、ハッシュ関数を用いて、出力先のネットワーク側のポート番号を計算する。従って、ポート番号演算部27は、フレームの出力ポートを、ネットワーク側のポートの中から選択しているといえる。ポート番号の求め方については後述する。ポート番号演算部27は、得られた計算結果を、出力部28に出力する。出力部28は、入力された情報とフレームを、スイッチ40に出力する。
図5は、フレームのフォーマットの例を示す。図6は、インタフェース回路20で行われる処理の例を説明するタイミングチャートである。以下、図5(a)に示すフレームが端末Xから通信装置10aに送信された場合を例として、送信側の通信装置10aの動作の例を説明する。なお、以下の手順の番号は、図6に付した番号と対応している。
(1)通信装置10aの送受信部21は、図5(a)に示すフォーマットのフレームを受信する。図5(a)に示すフレームは、先頭から、プリアンブル、送信元アドレス(source address、SA)、宛先アドレス(destination address、DA)、タイプ、データ、Frame Check Sequence(FCS)を含む。図5において括弧の中に書かれた数字は、各情報の長さをバイト単位で示している。送受信部21は、受信したフレームを、遅延生成部23とフレーム先頭検出部22に出力する。フレーム先頭検出部22と遅延生成部23には、図6の(1)に示すタイミングでフレームが入力される。
(2)遅延生成部23は、フレーム先頭検出部22から入力されたフレームのタイミングを、予め決められた所定の時間分だけ遅らせる。以下の説明では、遅延生成部23は、入力されたフレームについて、1バイト分の遅延を発生させるものとする。遅延生成部23は、遅延を加えた後のフレームを、メモリ25と抽出部26に出力する。従って、メモリ25と抽出部26には、図6の(2)に示すタイミングでフレームが入力される。
(3)フレーム先頭検出部22は、送受信部21から入力されたフレームの先頭を検出する。フレーム先頭検出部22は、フレームの先頭を検出すると、フレームのプリアンブルの先頭の1バイトが入力されるタイミングで、パルス信号(フレーム先頭表示パルス)を発生させる。フレーム先頭検出部22は、フレーム先頭表示パルスを、タイミング生成部24に出力する。
(4)タイミング生成部24は、フレーム先頭検出部22からフレーム先頭表示パルスが入力されるまで、カウンタのカウント値を初期化(カウント値=0)して待機する。タイミング生成部24は、フレーム先頭表示パルスが入力されると、カウンタ値のカウントアップを開始する。タイミング生成部24は、フレーム先頭表示パルスの立下りのタイミングで、カウント値を1つインクリメントし、その後もフレームが1バイト読み込まれるタイミングでカウント値をインクリメントする。従って、タイミング生成部24でのカウント値は、メモリ25や抽出部26に読み込まれているフレームのバイト数と一致する。タイミング生成部24は、フレームの先頭が検出されたときから、メモリ25がフレームを出力部28に出力し始めるまで、カウントアップを継続する。
(5)タイミング生成部24は、カウント値が8になると、抽出部26でのプリアンブルの読み込みが終わったと判定する。そこで、タイミング生成部24は、カウント値が9〜14の間、抽出部26に、送信元アドレスが入力されていることを示すパルスを出力する。以下、送信元アドレスが入力されていることを示すパルスのことを、「SAタイミングパルス」と記載することがある。抽出部26は、SAタイミングパルスの立ち上がりから立下りまでの間に入力された値を、フレームの送信元アドレスとして抽出する。
(6)タイミング生成部24は、カウント値が14になると、抽出部26での送信元アドレスの読み込みが終わったと判定する。そこで、タイミング生成部24は、カウント値が15〜20の間、抽出部26に、宛先アドレスが入力されていることを示すパルスを出力する。以下、宛先アドレスが入力されていることを示すパルスのことを、「DAタイミングパルス」と記載することがある。抽出部26は、DAタイミングパルスの立ち上がりから立下りまでの間に入力された値を、フレームの宛先アドレスとして抽出する。
(7)抽出部26は、送信元アドレスと宛先アドレスの組み合わせに対応付けて、送信されたフレーム数をカウントする。図7は、シーケンス番号カウンタの例を示す。抽出部26は、予め、シーケンス番号の最小値と最大値を保持しており、フレームを受信すると、受信フレームの送信元アドレスと宛先アドレスに対応付けられたカウンタ値を1つインクリメントする。また、カウント値がシーケンス番号の最大値になっている送信元アドレスと宛先アドレスの組み合わせについては、送信元アドレスと宛先アドレスが同じフレームを次に受信すると、抽出部26は、シーケンス番号を最小値に変更する。例えば、図7に示すカウンタを保持している場合であり、かつ、シーケンス番号が0〜3である場合、抽出部26は、送信元アドレス=xxxxxxxxxxxxxxxx、宛先アドレス=yyyyyyyyyyyyのフレームが入力されると、対応するカウント値を0にする。抽出部26は、シーケンス番号カウンタで示されているカウント値を、シーケンス番号として使用する。
抽出部26は、送信元アドレスと宛先アドレスの抽出が終わると、送信元アドレス、宛先アドレス、および、シーケンス番号を用いて、ハッシュキーを生成する。ハッシュキーは、例えば、宛先アドレスの次に、送信元アドレスを続け、最後にシーケンス番号をつなげた数列として求められる。
送信元アドレス :0x112233445566、
宛先アドレス :0x0A0B0C0D0E0F、
シーケンス番号の範囲 :00〜03
の場合のハッシュキーの生成例を図8(a)の左の列に示す。図8(a)の左の列では、上から、シーケンス番号が00、01、02、03の順にハッシュキーを示している。抽出部26は、得られたハッシュキーをポート番号演算部27に出力する。抽出部26がハッシュキーをポート番号演算部27に出力するタイミングは、図6に示すように、宛先アドレスの最後の1バイトの読み込みと並行したタイミングとすることができる。
(8)ポート番号演算部27は、予め記憶しているハッシュ関数でハッシュキーを処理する。以下の例では、ポート番号演算部27は、Message Digest Algorithm 5(MD5)を用いた演算を行うものとする。ポート番号演算部27は、ハッシュキーに対してMD5演算を行うことにより、128ビットのダイジェストを生成する。図8(a)の右の列は、図8(a)の左の列のハッシュキーを用いたときに得られるダイジェスト(MD5値)の例である。
次に、ポート番号演算部27は、得られたダイジェストを、スイッチ40に含まれているネットワーク側のポート数で割ったときの余りを求める。シーケンス番号=xに対応するMD5値をMx、出力ポートが0からn−1のn本であるとき、シーケンス番号=xである入力フレームを出力するポートの番号Poutxは、以下の式から求められる。
Poutx = Mx mod n
ここで、modは、剰余関数である。図8(b)は、図8(a)に示す値に対して、出力ポートの総数nが10である場合に得られる出力ポートの番号を示す。
ポート番号演算部27は、出力ポート番号の計算が終わると、予め、ハッシュキーが入力された時刻を基準として決められたタイミングで出力部28に、演算結果を出力する。図6の例では、ポート番号演算部27は、タイミング生成部24でのカウント値=20でハッシュキーを取得し、カウント値=21で出力ポートを出力部28に出力する。
(9)タイミング生成部24は、ポート番号演算部27が演算結果を出力部28に出力するタイミングを、出力部28に通知する。出力部28は内部にセレクタを備えている。出力部28は、タイミング生成部24から通知されるタイミングで、ポート番号演算部27からの出力を出力部28に入力できるように、出力部28内のセレクタを調整する。さらに、ポート番号演算部27からのポート番号の入力が終わると、出力部28は、メモリ25からの出力を出力部28に入力できるように、セレクタを再度調整する。図6の例では、ポート番号演算部27は、ポート番号を1バイトの情報として出力部28に出力するものとする。従って、タイミング生成部24のカウンタ値=21の間、出力部28は、ポート番号演算部27からの入力を受け付ける。タイミング生成部24のカウンタ値が22になると、出力部28は、メモリ25からの入力を受け付ける。
(10)タイミング生成部24は、ポート番号演算部27が演算によって得たポート番号を出力部28に出力し終わるタイミングを、メモリ25に通知し、フレームの出力を促す。このため、出力部28からスイッチ40に出力されるフレームは、最初の1バイトが、フレームの出力ポート番号(Pout)であり、2バイト目以降は通信装置10が端末から受信したフレームとなる。出力部28で得られるフレームのフォーマットの例を、図5(b)に示す。
(11)出力部28は、得られたフレームを、スイッチ40に出力する。例えば、手順(1)〜(10)の処理がインタフェース回路20aで行われているとして、図3を参照しながら説明する。この場合、フレームはスイッチ40のc0のポートに出力される。スイッチ40は、インタフェース回路20からフレームを取得すると、フレームの先頭の1バイトで表された値と同じ番号が割り当てられているネットワーク側のポートに、フレームを出力する。例えば、図8(b)に示すテーブルでは、シーケンス番号=0のフレームの出力ポート番号はPout=1であるので、フレームの1バイト目は1を示す。そこでスイッチ40は、シーケンス番号=0のフレームをn1のポートに出力する。
(12)インタフェース回路90bは、スイッチ40からフレームを取得する。すると、インタフェース回路90bは、先頭の1バイトを削除した上で、物理リンク11bを介して、フレームを通信装置10bに送信する。
図9は、シーケンス番号と出力ポートの対応テーブルの例を示す。ポート番号演算部27は、演算で得られた結果を対応テーブルとして記憶することができる。なお、手順(1)〜(12)では、理解しやすくするために、送信元アドレスと宛先アドレスの組み合わせのうちの1セットについての処理を説明したが、並行して複数のアドレスの組み合わせについて、出力ポートが計算されることもある。そこで、ポート番号演算部27は、図9に示すように、送信元アドレスと宛先アドレスの組み合わせに対応付けて、シーケンス番号と出力ポートの対応を記憶することができる。
図10は、インタフェース回路20での処理の例を説明するフローチャートである。送受信部21は、フレームを受信する(ステップS1)。次に、タイミング生成部24から通知されるタイミングに従って、抽出部26は、フレームの送信元アドレスと宛先アドレスを抽出する(ステップS2)。抽出部26は、送信元アドレスと宛先アドレスに、シーケンス番号を組み合わせてハッシュキーを生成する(ステップS3)。抽出部26は、ハッシュキーをポート番号演算部27に出力する。ポート番号演算部27はハッシュ関数を用いて、出力ポートの番号(Pout)を計算し、得られたPoutを出力部28に出力する(ステップS4)。メモリ25は、タイミング生成部24から指定されたタイミングでフレームを出力部28に出力する(ステップS5)。図10に示す処理により、図5(b)に示すように、先頭の1バイトにPoutを保持したフレームがスイッチ40に出力される。
<受信処理>
以下、通信装置10bが通信装置10aからフレームを受信する場合の処理を例として、通信装置10で行われる受信処理について詳しく説明する。通信装置10bは、通信装置10aからのフレームを、インタフェース回路90のポートから受信する。なお、通信装置10には、通信装置10に備えられているネットワーク側のポートごとに1つのインタフェース回路90が設置されているものとする。ここで、各インタフェース回路90が接続されているポートには、ポート番号が割り当てられている。以下の説明では、インタフェース回路90が接続されているポートのポート番号は、そのポートに接続されている物理リンク11の番号と同じ値であるものとする。
通信装置10bのインタフェース回路90は、回線を終端し、通信装置10aから受信したフレームを取得する。このとき、インタフェース回路90が受信するフレームは、送信側の通信装置10aから送信されてくるフレームであるので、フォーマットは図5(a)の通りである。インタフェース回路90は、受信したフレームの先頭に、インタフェース回路90のポート番号を付加する。以下、フレームを受信したネットワーク側のポート番号のことを「Pin」と記載することがある。インタフェース回路90で行われるポート番号の付加方法は、送信処理の際にインタフェース回路20でPoutを付加するために行われる処理と同様である。また、ポート番号は、1バイトで表現されるものとする。インタフェース回路90においてポート番号Pinが付加されたときのフレームのフォーマットを図5(c)に示す。インタフェース回路90は、ポート番号Pinを付したフレームを、受信処理回路50に出力する。
図11は、フレームを受信した受信処理回路50の動作の例を説明するフローチャートである。まず、通信装置10bの受信処理回路50は、通信装置10aと通信装置10bの間での同期が取れているかを判定するために、フレームを受信するポート番号を正しく予測できた回数をカウントする(ステップS11)。次に、受信処理回路50は、フレームを受信するポート番号を正しく予測できた回数が閾値を超えたかを判定することにより、通信装置10aと通信装置10bが同期しているかを判定する(ステップS12)。受信処理回路50は、通信装置10aと通信装置10bの間で同期が取れている場合は、受信フレームを、スイッチ40に出力する。このとき、受信処理回路50は、フレームの順序逆転が起こっていれば、フレームの順序を正しい順序に補正してから、スイッチ40に出力する(ステップS13)。
図12は、受信処理回路50の構成の例を示す。受信処理回路50は、振り分け部51(51a〜51c)と順序補正部52(52a〜52e)を有する。図12の例では、振り分け部51は51a〜51cの3つが記載されているが、通信装置10は、ネットワーク側のポート数と同数の振り分け部51を備えているものとする。また、順序補正部52は、通信装置10bが処理するフレームについての、送信元アドレスと宛先アドレスの組合せの数と同数あるものとする。
各振り分け部51は、1つのインタフェース回路90から、ポート番号Pinを含むフレームを取得する。振り分け部51は、取得したフレームの送信元アドレスと宛先アドレスを取得し、送信元アドレスと宛先アドレスの組合せに応じた順序補正部52に出力する。振り分け部51から出力されたフレームは、送信元アドレスと宛先アドレスの組合せごとに1つの順序補正部52で処理される。
図13は、順序補正部52の構成の例を示す。順序補正部52は、同期判定部60、補正部70、フレームバッファ80、ポート指定部85を備える。振り分け部51から出力されたフレームは、同期判定部60とフレームバッファ80に入力される。なお、同期判定部60、補正部70、フレームバッファ80、ポート指定部85は、それぞれ、ハードウェアで形成されても良い。また、受信処理回路50にプロセッサが含まれている場合、プロセッサが、振り分け部51、同期判定部60、補正部70、ポート指定部85を実現しても良い。
同期判定部60は、処理対象の送信元アドレスと宛先アドレスの組合せについて、通信装置10aから送信されたフレームの順番を、通信装置10bが正しく予測できる状態かを判定する。以下の説明では、送信側の通信装置10aから送信されたフレームの順番を、受信側の通信装置10bが正しく予測できる状態にあることを、通信装置10aと通信装置10bが同期していると記載することがある。また、同期状態を「IS」(in sync)と記載することがある。さらに、同期はずれ状態を「OOS」(Out Of sync)と記載することがある。同期しているかの判定方法については後述する。
同期判定部60は、通信装置10aと通信装置10bが同期しているかの判定結果を、補正部70に通知する。補正部70は、通信装置10aと通信装置10bが同期している場合、フレームを端末から送信された順序に補正する処理を行う。補正部70は、フレームの先頭に付されているポート番号Pinを用いてフレームを送信順序どおりに補正する。従って、補正部70は、フレームの順序逆転が起こっている場合にフレームの順序を補正する。補正部70は、フレームバッファ80に、入力されたフレームの2バイト目以降を格納するように制御信号を出力する。フレームバッファ80は、補正部70からの信号に従って、フレームの2バイト目以降を格納し、さらに、補正部70からの信号に従って、格納しているフレームをスイッチ40に出力する。補正部70は、ポート指定部85にも、出力のタイミングを指定する。
補正部70は、ポート指定部85に、フレームバッファ80から出力されるフレームの先頭に1バイト分の情報を付加できるようにタイミングを調整して、制御信号を出力する。ここでのタイミングの制御方法は、送信の際にPoutをフレームの先頭に付加する場合と同様に行われる。ポート指定部85は、宛先アドレスに応じたフレームの出力先のポートの番号(Ptr)を保持している。ポート指定部85は、補正部70からの制御信号に応じて、フレームの出力先となるポートの番号を1バイトの情報としてスイッチ40に出力する。ポート指定部85から出力された情報に続けて、フレームバッファ80から読み出されるフレームがスイッチ40に出力される。このため、補正部70、フレームバッファ80、およびポート指定部85の処理により、図5(c)に示す入力フレームは、図5(d)に示すフレームに変換される。補正部70などの処理については、後で詳しく説明する。
図14は、同期判定部60の例を示す図である。同期判定部60は、入力ポート特定部61、比較部62、予測部63、比較部64、同期監視部65、判定部66を備える。図14は、2つの連続したフレームの順序の入れ替えを修正できる通信装置10に備えられている同期判定部60の例である。
入力ポート特定部61は、同期判定部60に入力されたフレームの先頭の1バイトを取得し、得られた値を比較部62、予測部63、および、比較部64に出力する。すなわち、入力ポート特定部61は、入力されたフレームを受信したネットワーク側のポート番号(Pin)を比較部62、予測部63、および、比較部64に出力する。
予測部63は、送信側の通信装置10aで使用されているハッシュ関数を記憶している。予測部63は、送信元アドレス、宛先アドレス、および、通信に使用される可能性のあるシーケンス番号を用いて、ハッシュキーを生成する。予測部63は、ハッシュキーとハッシュ関数を用いて演算を行い、さらに、得られた結果の値に送信側の通信装置10aと同じ演算処理をすることにより、シーケンス番号ごとに受信ポート(Pin)の予測値を求める。図15は、フレームのシーケンス番号と受信ポート(Pin)の関係の例を示す。図15は、送信元アドレス=0x112233445566、宛先アドレス=0x0A0B0C0D0E0Fであって、シーケンス番号の範囲が00〜03の場合についての、フレームのシーケンス番号と受信ポート(Pin)の関係の例である。予測部63は、入力ポート特定部61から通知された値から、現在入力されたフレームのシーケンス番号を特定する。予測部63は、特定したシーケンス番号よりも1つ大きいシーケンス番号のフレームを受信すると予測するポートの番号(Pnx1)を比較部62に出力する。また、予測部63は、特定したシーケンス番号よりも2つ大きいシーケンス番号のフレームを受信すると予測するポートの番号(Pnx2)を比較部64に出力する。なお、予測部63は、比較部64において比較結果が一致した場合は、Pnx1とPnx2の値を更新しない。ここで、予測部63は、順序逆転フラグを保持するものとする。順序逆転フラグ=1の場合、受信フレームの順序の逆転により、予測部63が新たなポート番号を比較部62および比較部64に出力していないことを示す。順序逆転フラグ=0は、受信フレームの逆転が発生していないため、Pnx1とPnx2の値を更新していることを示す。
比較部62および比較部64は、予測部63から入力された値を保持する。比較部62は、入力ポート特定部61から、フレームの受信ポート番号(Pin)として通知された値を、前回のフレームの処理のときに予測部63から入力された値(Pnx1)と比較する。言い換えると、比較部62は、フレームの受信ポートの予測に成功しているかを判定する。比較部62でPin=Pnx1と判定されることは、フレームの受信ポートの予測が正しいことを示す。
一方、比較部64は、入力ポート特定部61から、フレームの受信ポート番号(Pin)として通知された値を、前回のフレームの処理のときに予測部63から入力された値(Pnx2)と比較する。言い換えると、比較部64は、受信したフレームと次に受信するフレームとの間で順序の逆転が発生しているかを判定する。比較部64でPin=Pnx2と判定されることは、フレームの順序逆転が起こっていることを示す。
なお、初期値としては、比較部62には、シーケンス番号=0のフレームを受信すると予測されるポート番号が予測部63から通知される。一方、比較部64には、シーケンス番号=1のフレームを受信すると推定されるポートの番号が通知されているものとする。比較部62は、比較結果を、同期監視部65と補正部70に出力する。比較部64は、比較結果を予測部63と補正部70に出力する。以下、比較部62で得られた比較結果をmatch_1、比較部64で得られた比較結果をmatch_2とする。また、比較結果が一致した場合は「OK」、不一致である場合は「NG」で表す。
例えば、予測部63は、図15を用いて、比較部62にPnx1=1、比較部64にPnx2=0を通知したとする。また、最初に同期判定部60に入力されたフレームは、Pin=1であるとする。すると、入力ポート特定部61は、比較部62、予測部63、比較部64の各々に、Pin=1を通知する。このため、比較部62は、最初のフレームについては、PinとPnx1がいずれも1なので、PinはPnx1と一致すると判定する。比較部62は、match_1=OKを同期監視部65と補正部70に出力する。一方、比較部64は、最初のフレームについて、Pin=1かつPnx2=0であるため、PinはPnx2と一致しないと判定する。比較部64は、match_2=NGを予測部63と補正部70に出力する。予測部63は、match_2=NGが得られたので、新たなPnx1とPnx2を予測する。予測部63は、Pin=1より入力されたフレームのシーケンス番号は0であると推定する。そこで、予測部63は、シーケンス番号=1に対応付けられているポート番号の値をPnx1とする。同様に、予測部63は、シーケンス番号=2に対応付けられているポート番号の値をPnx2とする。従って、図15の例では、Pnx1=0、Pnx2=3とする。予測部63は、比較部62にPnx1=0を通知し、比較部64にPnx2=3を通知する。
次に同期判定部60に入力されたフレームは、Pin=3であるとする。入力ポート特定部61は、比較部62、予測部63、比較部64の各々に、Pin=3を通知する。比較部62は、Pin=3かつPnx1=0であるため、PinとPnx1が一致しないと判定する。そこで、比較部62は、match_1=NGを同期監視部65と補正部70に出力する。一方、比較部64は、PinとPnx2がいずれも3なので、PinとPnx2が一致すると判定し、match_2=OKを、予測部63と補正部70に出力する。予測部63は、match_2=OKが通知されたため、新たなPnx1とPnx2を予測しない。このとき、予測部63は、順序逆転フラグ=1に設定する。
3番目に同期判定部60に入力されたフレームは、Pin=0であるとする。すると、入力ポート特定部61は、比較部62、予測部63、比較部64の各々に、Pin=0を通知する。すると、比較部62は、PinとPnx1のいずれも0であるので、Pin=Pnx1であると判定する。そこで、比較部62は、match_1=OKを同期監視部65と補正部70に出力する。一方、比較部64は、Pin=0、Pnx2=3なので、PinとPnx2が一致しないと判定し、match_2=NGを予測部63と補正部70に出力する。予測部63は、match_2=NGが得られたので、新たなPnx1とPnx2を予測する。このとき、予測部63は、順序逆転フラグ=1であるので、受信フレームの順序逆転により、前回のフレームの受信の際に、比較部62と比較部64にPnx1とPnx2の値を通知していないと判定する。順序逆転フラグ=1の場合、予測部63は、今回受信したフレームのシーケンス番号の2つ後のシーケンス番号に対応付けられた値を新たなPnx1とし、今回受信したフレームのシーケンス番号の3つ後のシーケンス番号に対応付けられた値を新たなPnx2とする。予測部63は、Pin=0より入力されたフレームのシーケンス番号は1であると推定する。そこで、予測部63は、Pnx1をシーケンス番号=3に対応付けられたポート番号であると推定するので、Pnx1=8を比較部62に通知する。同様に、予測部63は、Pnx2をシーケンス番号=0に対応付けられたポート番号であると推定するので、Pnx2=1を比較部64に通知する。さらに、予測部63は、順序逆転フラグを0に設定する。
4番目に同期判定部60に入力されたフレームは、Pin=8であるとする。すると、入力ポート特定部61は、比較部62、予測部63、比較部64の各々に、Pin=8を通知する。比較部62は、PinとPnx1のいずれも8であるので、Pin=Pnx1であると判定する。そこで、比較部62は、match_1=OKを同期監視部65と補正部70に出力する。一方、比較部64は、Pin=8、Pnx2=1なので、PinとPnx2が一致しないと判定し、match_2=NGを予測部63と補正部70に出力する。予測部63は、match_2=NGが得られたので、新たなPnx1とPnx2を予測する。なお、このときは、順序逆転フラグ=0であるので、予測部63は、今回受信したフレームのシーケンス番号の1つ後のシーケンス番号に対応付けられた値を新たなPnx1とする。さらに、予測部63は、今回受信したフレームのシーケンス番号の2つ後のシーケンス番号に対応付けられた値を新たなPnx2とする。
次に、比較部62から出力された判定結果を用いて、同期が取れているかを判定する方法について説明する。同期が取れているかの判定処理は、同期監視部65と判定部66で行われる。
同期監視部65は、判定部66での判定結果を取得する。同期監視部65は、判定部66での判定結果が同期はずれの場合は、比較部62から入力された比較結果から、正しく予測できた回数(IS_count)をカウントし、予測が誤っている回数(OOS_count)を0に設定する。同期判定部60の処理対象の送信アドレスと宛先アドレスの組み合わせについて、フレームの受信を開始するときは、初期値として、同期監視部65は同期はずれ状態に設定されているものとする。一方、同期が取れているときは、同期監視部65は、予測が誤っている回数(OOS_count)をカウントし、正しく予測できた回数(IS_count)を0に設定する。同期監視部65は、IS_countとOOS_countを、判定部66に出力する。
判定部66は、同期確立判定閾値Tisと同期はずれ判定閾値Toosを保持している。正しく予測できた回数のカウント値が閾値Tisを超えると、判定部66は、同期が取れていると判定する。つまり、判定部66は、同期はずれ状態において、同期確立判定閾値を超えるだけ連続して、フレームの受信ポート番号(Pin)とフレームを受信すると期待したポート番号(Pnx1)が一致すると、同期が確立したと判定している。一方、予測が誤った回数のカウント値が閾値Toosを超えると、判定部66は、同期が取れていないと判定する。すなわち、判定部66は、同期確立状態において、同期はずれ判定閾値を超えるだけ連続して、フレームの受信ポート番号(Pin)とフレームを受信すると期待ポート番号(Pnx1)が一致しないと、同期はずれになったと判定している。判定部66は、判定結果を同期監視部65と補正部70に通知する。
図16は、同期監視部65の動作の例を説明するフローチャートである。同期監視部65は、判定部66から同期が取れたことを通知されているかを判定する(ステップS21)。同期が取れていない場合、同期監視部65は、比較部62から、フレームの受信ポートの予測に成功したことが通知されたかを判定する(ステップS21でNo、ステップS22)。比較部62からフレームの受信ポートの予測に成功したことが通知された場合、同期監視部65は、IS_countを1つインクリメントするとともに、OOS_countを0に設定する(ステップS22でYes、ステップS23)。比較部62からフレームの受信ポートの予測に失敗したことが通知された場合、同期監視部65は、IS_countとOOS_countのいずれも0に設定する(ステップS22でNo、ステップS26)。同期が取れている場合、同期監視部65は、比較部62から、フレームの受信ポートの予測に失敗したことが通知されたかを判定する(ステップS21でYes、ステップS24)。比較部62からフレームの受信ポートの予測に失敗したことが通知された場合、同期監視部65は、OOS_countを1つインクリメントするとともに、IS_countを0に設定する(ステップS24でYes、ステップS25)。比較部62からフレームの受信ポートの予測に成功したことが通知された場合、同期監視部65は、IS_countとOOS_countのいずれも0に設定する(ステップS24でNo、ステップS26)。
図17は、同期が取れているかを判定する方法の例を説明するフローチャートである。図17は、判定部66での判定と予測部63での処理の例を示している。判定部66は、IS_countの値が閾値Tis以上であるかを判定する(ステップS31)。IS_countの値が閾値Tis以上である場合、受信ポート番号を連続して正しく予測した回数が閾値Tis以上であるので、判定部66は、送信側の通信装置10と受信側の通信装置10の間で同期が取れていると判定する(ステップS31でYes)。そこで、判定部66は、設定を同期状態に変更し、同期監視部65に通知する。(ステップS32)。次に、判定部66は、OOS_countの値が閾値Toos以上であるかを判定する(ステップS33)。OOS_countの値が閾値Toos以上である場合、受信ポート番号の予測に連続して失敗した回数が閾値Toos以上である。そこで、判定部66は、送信側の通信装置10と受信側の通信装置10の間で同期が取れていないと判定する(ステップS33でYes)。判定部66は、設定を同期はずれ状態に変更し、同期監視部65に通知する。(ステップS34)。
予測部63は、比較部64からPinとPnx2が等しいことが通知されたかを判定する(ステップS35)。ここで、PinとPnx2が等しいことは、順序の逆転の発生が観測されたことを示す。そこで、予測部63は、比較部64からPinとPnx2が等しいことが通知されていない場合は、Pnx1とPnx2の値を更新する(ステップS35でNo、ステップS36)。一方、予測部63は、比較部64からPinとPnx2が等しいことが通知された場合、Pnx1とPnx2の値を更新せずに処理を終了する(ステップS35でYes)。
図18は、補正部70の例を示す図である。補正部70は、制御信号生成部71、フラグ管理部72、WADR(Write Address)生成カウンタ73、および、RADR(Read Address)生成カウンタ74を備える。制御信号生成部71は、比較部62からmatch_1、比較部64からmatch_2、判定部66から同期状態の判定結果を取得する。制御信号生成部71は、比較部62、比較部64、および判定部66から取得した情報を用いて、フレームバッファ80への書き込みやフレームバッファ80からの読み出しを制御するための信号を生成する。図13に示すように、フレームバッファ80には、振り分け部51からフレームが入力されるが、フレームバッファ80は、制御信号生成部71から書き込みを許可する信号が入力されているタイミングで入力されている情報を格納する。また、フレームバッファ80は、制御信号生成部71から読み出しを要求されると、フレームをスイッチ40に出力する。このため、制御信号生成部71から出力される信号により、スイッチ40に出力されるフレームの選択が行われることになる。以下、フレームバッファ80への書き込みを許可するための信号を、「書き込みイネーブル信号」または「WE(Write Enable)」と記載する。一方、フレームバッファ80からの読み出しを制御するための信号を、「読み出しイネーブル信号」または「RE(Read Enable)」と記載する。制御信号生成部71は、書き込みイネーブル信号をフレームバッファ80とWADR生成カウンタ73に出力する。
制御信号生成部71は、WADR生成カウンタ73に書き込みイネーブル信号を出力することにより、書き込みを行うアドレスを特定する信号の生成を、WADR生成カウンタ73に要求する。WADR生成カウンタ73は、書き込みを行うアドレスを特定する信号(書き込みアドレス信号)を生成し、書き込みアドレス信号をフレームバッファ80に出力する。このとき、WADR生成カウンタ73は、フラグ管理部72にアクセスすることにより、フレームバッファ80にフレームが格納されているかを判定することができる。フレームバッファ80にフレームが格納されている場合、WADR生成カウンタ73は、すでにフレームが格納されている領域とは異なる領域に新たなフレームが書き込まれるように、書き込みアドレスを調整する。制御信号生成部71は、RADR生成カウンタ74に読み出しイネーブル信号を出力することにより、読み出しを行うアドレスを特定する信号の生成を、RADR生成カウンタ74に要求する。RADR生成カウンタ74は、読み出しを行うアドレスを特定する信号(読み出しアドレス信号)を生成し、読み出しアドレス信号をフレームバッファ80に出力する。
フラグ管理部72は、フレームバッファ80にフレームが格納されているかを特定するためのフラグを管理する。以下、フレームバッファ80にフレームが格納されているかを特定するためのフラグを「格納フラグ」と記載することがある。格納フラグ=1は、フレームバッファ80にフレームが格納されていることを示し、格納フラグ=0は、フレームバッファ80にフレームが格納されていないことを示すものとする。
図19は、補正部70とフレームバッファ80を用いて行われる処理の例を説明するテーブルである。図19において、d.c.は、don’t careの略であり、値が任意であることを示す。なお、図19などにおいて、同期状態はsync_stateで表されている。sync_state=ISは、送信側と受信側の間で同期が確立していることを表し、sync_state=OOSは、送信側と受信側の間で同期が取れていないことを表す。
判定部66から同期はずれであることを通知された場合、比較部62と比較部64からの情報や格納フラグの値が何であっても、制御信号生成部71は、入力フレームを廃棄することを決定する。そこで、制御信号生成部71は、同期はずれの間は、書き込みイネーブル信号と読み出しイネーブル信号のいずれも出力しない。このため、同期はずれの間にフレームバッファ80に入力されたフレームは、フレームバッファ80に格納されず、スイッチ40への出力もされないため、廃棄される。
判定部66から同期していることを通知され、かつ、比較部62から受信ポート番号の予測が正しいことが通知された場合、制御信号生成部71は、フレームバッファ80にフレームが格納されているかを判定する。フレームバッファ80にフレームが格納されていない場合(格納フラグ=0)、制御信号生成部71は、入力フレームをスイッチ40に出力することを決定する。そこで、制御信号生成部71は、書き込みイネーブル信号と読み出しイネーブル信号の両方を出力する。また、WADR生成カウンタ73とRADR生成カウンタ74が特定する書き込みアドレスと読み出しアドレスは、フレームバッファ80に書き込まれているフレームがスイッチ40に読み出されるように調整される。このため、振り分け部51からフレームバッファ80に入力されたフレームは、フレームバッファ80に書き込まれつつ、スイッチ40に読み出される。
一方、フレームバッファ80にフレームが格納されている場合(格納フラグ=1)、制御信号生成部71は、入力フレームをスイッチ40に出力した後で、フレームバッファ80に格納されているフレームをスイッチ40に出力することを決定する。そこで、制御信号生成部71は、書き込みイネーブル信号と読み出しイネーブル信号の両方を出力する。このとき、WADR生成カウンタ73は、フレームバッファ80に入力されるフレームが、既にフレームバッファ80に書き込まれているフレームの続きに書き込まれるように、書き込みアドレスを設定する。また、RADR生成カウンタ74は、フレームバッファ80に書き込んでいるフレームの読み出しが最初に行われるように、読み出しアドレスを設定する。このため、振り分け部51からフレームバッファ80に入力されたフレームがスイッチ40に出力され、フレームバッファ80に格納されているフレームは、そのまま保持される。振り分け部51から入力されたフレームの読み出しが終了すると、フレームバッファ80に保持されているフレームがスイッチ40に出力される。
判定部66から同期していることを通知され、かつ、比較部64から受信ポート番号の予測が正しい(match_2=OK)ことが通知された場合、順序逆転が発生している。そこで、制御信号生成部71は、順序の逆転を修正するために、受信フレームをフレームバッファ80に書き込むことを決定する。このため、制御信号生成部71は、書き込みイネーブル信号をフレームバッファ80に出力する。
図20〜図23は、タイミングチャートの例を示す。以下、図20〜図23を参照しながら、図19に示す各ケースについての信号のタイミングの例を説明する。
図20は、通信装置10aと通信装置10bの間で同期が確立しており、フレームの順序逆転が発生していない場合のタイミングチャートの例である。なお、図20に示すケースでは、フレームバッファ80にフレームが格納されていない(格納フラグ=0)であるものとする。
図20に示すケースでは、前回までのフレームの送受信の結果に基づいて、送信側と受信側の間で同期が取れていると判定部66で判定されている。このため、判定部66は、制御信号生成部71にsync_state=ISを出力する。振り分け部51から同期判定部60およびフレームバッファ80にフレームが入力されるタイミングは、図20の入力フレームの欄のとおりであるとする。入力フレームの1バイト目が入力ポート特定部61と比較部62で処理されることにより、受信ポートの予測が正しいかが判定される。図20の例では、受信ポートの予測が正しいため、比較部62は、match_1=OKの信号を制御信号生成部71に出力する。なお、比較部62は、正しく受信ポートが予測できたフレームの末尾が比較部62を通過するまで、match_1=OKを制御信号生成部71に出力し続ける。このため、フレームバッファ80に入力フレームの2バイト目から最後の1バイトが入力されるまでの間、match_1=OKが制御信号生成部71に出力されることになる。
制御信号生成部71は、sync_state=ISとmatch_1=OKの制御信号が入力されると、入力フレームの2バイト目の書き込みに間に合うように、フレームバッファ80に書き込みイネーブル信号を出力する。制御信号生成部71は、match_1=OKが入力されている間、フレームバッファ80に書き込みイネーブル信号を出力し続ける。さらに、制御信号生成部71はWADR生成カウンタ73に書き込みアドレス信号の生成を要求する。WADR生成カウンタ73は、フレームバッファ80にフレームが格納されていないと判定すると、書き込みアドレスを0から1バイトずつカウントアップする。このため、フレームバッファ80のアドレス0からアドレスnまでの間に、フレームバッファ80に入力されたフレームが格納される。
制御信号生成部71は、フラグ管理部72にアクセスすることによって、格納フラグの値を特定する。ここでは、格納フラグ=0であるため、制御信号生成部71は、フレームバッファ80への書き込みが行われているフレームを、スイッチ40に読み出すことを決定する。そこで、制御信号生成部71は、書き込みのタイミングよりも遅れたタイミングで、読み出しイネーブル信号をフレームバッファ80とRADR生成カウンタ74に出力する。図20の例では、書き込みイネーブル信号よりも1バイトの処理時間遅れたタイミングで、読み出しイネーブル信号が出力される。RADR生成カウンタ74は、読み出しイネーブル信号が入力されると、読み出しアドレス信号をフレームバッファ80に出力する。このとき、RADR生成カウンタ74は、読み出しアドレスを0から1バイトずつカウントアップする。
さらに、制御信号生成部71は、読み出されるフレームの先頭の1バイトに、スイッチ40からの出力に用いられる回線側のポートの番号を指定する情報が付されるように、ポート指定部85に制御信号を出力する。図20の場合では、制御信号生成部71は、書き込みイネーブル信号とほぼ同じタイミングに、ポート指定部85に制御信号を出力する。そこで、ポート指定部85はポート番号Ptrをスイッチ40に出力する。制御信号生成部71とRADR生成カウンタ74からの制御信号に従って、フレームバッファ80からフレームが読み出され、ポート番号Ptrに続いて読み出されたフレームがスイッチ40に出力される。このため、スイッチ40に出力されるフレームは、図20の出力フレームに示すとおりになる。
図21は、通信装置10aと通信装置10bの間で同期が確立しており、フレームの順序逆転が発生した場合のタイミングチャートの例である。図21の例では、最後に受信したフレームの2つ後のフレームが入力された場合の処理の例を示す。なお、図21に示すケースでも、フレームバッファ80にフレームが格納されていない(格納フラグ=0)ものとする。
図21に示すケースでは、同期が確立しているので、判定部66は、制御信号生成部71にsync_state=ISを出力する。振り分け部51から同期判定部60およびフレームバッファ80にフレームが入力されるタイミングは、図21の入力フレームの欄のとおりであるとする。入力フレームの1バイト目が入力ポート特定部61、比較部62、比較部64で処理された結果、最後に受信したフレームの2つ後のフレームを受信したと判定されたとする。すると、比較部62はmatch_1=NGの信号を、比較部64はmatch_2=OKの信号を制御信号生成部71に出力する。ここで、比較部64は、最後に受信したフレームの2つ後のフレームであると判定したフレームの末尾が比較部64を通過するまで、match_2=OKを制御信号生成部71に出力し続ける。
制御信号生成部71は、sync_state=ISとmatch_2=OKの制御信号が入力されると、入力フレームの2バイト目の書き込みに間に合うように、フレームバッファ80に書き込みイネーブル信号を出力する。制御信号生成部71は、match_2=OKが入力されている間、フレームバッファ80に書き込みイネーブル信号を出力し続ける。さらに、制御信号生成部71はWADR生成カウンタ73に書き込みアドレス信号の生成を要求する。WADR生成カウンタ73は、フレームバッファ80にフレームが格納されていないと判定すると、書き込みアドレスを0から1バイトずつカウントアップしながら入力アドレスをフレームバッファ80に通知する。このため、フレームバッファ80のアドレス0からアドレスnまでの間にフレームが格納される。
制御信号生成部71は、match_1=NGであるため、読み出しイネーブル信号を出力しない。このため、フレームバッファ80に書き込まれているフレームは読み出されずに格納される。
図22は、図21を参照しながら説明した処理を行った後に、フレームバッファ80に格納されているフレームの1つ前に送信されたフレームを受信したケースで行われる処理の例を示す。なお、図22では、sync_state、match_1、書き込みイネーブル信号、および、入力フレームは、横軸の時間をそろえて記載しており、読み出しイネーブル信号および出力フレームとは異なる時系列で示している。一方、読み出しイネーブル信号および出力フレームは、フレームの順序逆転の調整方法を分かりやすくするため、時間軸の途中を省略して記載している。このため、出力フレームの2つ目のPtrの前までで出力されるフレームが入力フレームであり、2つ目のPtr以降のフレームは、フレームバッファ80に格納されていたフレームであるものとする。
図22のケースでも、図20を参照しながら説明した手順と同様の手順により、受信ポートの予測が正しいかが判定される。ここで、図21の処理の際に順序逆転が発生しているので、図17のステップS35に示すように、Pnx1は更新されていない。このため、比較部62では、受信ポートの予測が正しいと判定し、match_1=OKの信号を制御信号生成部71に出力する。
制御信号生成部71は、sync_state=ISとmatch_1=OKの制御信号が入力されるので、入力フレームの2バイト目の書き込みに間に合うように、フレームバッファ80とWADR生成カウンタ73に書き込みイネーブル信号を出力する。WADR生成カウンタ73は、格納フラグ=1より、フレームバッファ80にフレームが格納されていると判定すると、書き込みを開始できるアドレスを特定する。図21の例では、フレームバッファ80のアドレス0〜nは使用されている。そこで、WADR生成カウンタ73は、アドレスn+1以降を、新たに受信したフレームを書き込むアドレスとして指定する。図22の例では、アドレスn+1〜n+kに、新たなフレームが書き込まれる。
制御信号生成部71は、フレームバッファ80への書き込みが行われているフレームを、スイッチ40に読み出すことを決定する。そこで、制御信号生成部71は、書き込みのタイミングよりも遅れたタイミングで、読み出しイネーブル信号をフレームバッファ80とRADR生成カウンタ74に出力する。RADR生成カウンタ74は、フラグ管理部72にアクセスして格納フラグ=1であることを特定し、先に読み出すフレームが格納されているメモリの先頭のアドレスを特定する。図22の例では、アドレスn+1以降に新たなフレームが記録されている。そこで、RADR生成カウンタ74は、アドレスn+1以降のアドレスを読み出し対象とする読み出しアドレス信号を、フレームバッファ80に出力する。
ここで、図22のケースでも、図20で説明したのと同様の手順により、ポート番号Ptrがフレームの先頭に付加される。さらに、制御信号生成部71は、新たに受信したフレームの読み出しが終わると、再度、ポート指定部85にポート番号Ptrの挿入を要求する。ポート指定部85がポート番号をスイッチ40に出力すると、制御信号生成部71は、フレームバッファ80とRADR生成カウンタ74への読み出しイネーブル信号の出力を再開する。2回目に出されている読み出しイネーブル信号では、フレームバッファ80に格納されていたフレームがスイッチ40に出力される。このため、RADR生成カウンタ74は、読み出しアドレスをアドレス0から1バイトずつカウントアップして、読み出しアドレス信号を生成する。
図23は、送信側の通信装置10aと受信側の通信装置10bの間で同期が取れていないときの動作の例を説明するタイミングチャートである。前回までのフレームの送受信の結果に基づいて、送信側と受信側の間で同期が取れていないと判定部66で判定されている。このため、判定部66は、制御信号生成部71にsync_state=OOSを出力する。
制御信号生成部71は、入力フレームの2バイト目の書き込みに間に合うように、書き込みイネーブル信号を出力するが、sync_state=OOSであると判定すると、書き込みイネーブル信号の出力を中止する。図23の例では、入力フレームの2バイト目の書き込みに間に合わせるためにsync_state=OOSであるかの判定が終わる前に、書き込みイネーブル信号が出力されてしまうので、入力フレームの最初の1バイトはフレームバッファ80に書き込まれる。しかし、以後の書き込みが中断されるため、格納フラグは0に設定される。このため、同期が取れた後に新たなフレームが読み込まれると、sync_state=OOSのときに受信したフレームが記録されているアドレスは、新たなフレームの記録に使用され、上書きされる。制御信号生成部71は、sync_state=OOSである場合は、読み出しイネーブル信号も出力しない。このため、同期が確立するまでの間に受信されたフレームは廃棄される。
図24は、補正部70で行われる処理の例を説明するフローチャートである。制御信号生成部71は、送信側の通信装置10と受信側の通信装置10の間で同期が確立しているかを判定する(ステップS41)。同期が確立されていない間は、受信側の通信装置10においてフレームの送信順序どおりに受信フレームを並べ替えることができない。そこで、制御信号生成部71は、同期が確立されていない間に受信したフレームを廃棄するために、書き込みイネーブル信号と読み出しイネーブル信号のいずれも生成しない(ステップS41でNo、ステップS42)。制御信号生成部71は、フラグ管理部72にアクセスすることにより、フレームバッファ80にフレームが格納されているかを判定する(ステップS43)。フレームバッファ80が空であれば、補正部70は処理を終了する(ステップS43でYes)。一方、フレームバッファ80にフレームが格納されている場合、フレームバッファ80内のフレームが廃棄される(ステップS43でNo、ステップS44)。
同期が確立されている場合、受信側の通信装置10においてフレームの送信順序どおりに受信フレームを並べ替えることができるため、補正部70は、受信フレームをスイッチ40に出力するための処理を行う。制御信号生成部71は、フラグ管理部72にアクセスし、フレームバッファ80が空であるかを判定する(ステップS41でYes、ステップS45)。フレームバッファ80にフレームが格納されている場合、順序逆転が発生していることになる(ステップS45でNo)。そこで、制御信号生成部71は、受信したフレームをスイッチ40に出力した後で、フレームバッファ80に格納されているフレームを出力する(ステップS46、S47)。一方、フレームバッファ80が空であり、順序逆転が発生していない場合、制御信号生成部71は、受信したフレームをスイッチ40に出力する(ステップS45でYes、ステップS48)。
スイッチ40は、順序補正部52から図5(d)に示すフォーマットのフレームを取得する。スイッチ40は、フレームの先頭の1バイトの値とポート番号が一致する回線側のポートに、受信フレームを出力する。このため、フレームの先頭の1バイトの値で指定されたポートに接続されているインタフェース回路20に、受信フレームが入力される。インタフェース回路20は、入力されたフレームの先頭の1バイトを削除することにより、入力されたフレームを、送信元の装置が端末に向けて送信したフレーム(図5(a))に変換する。インタフェース回路20は、変換したフレームを、送受信部21から端末に向けて送信する。
このように、実施形態に係る通信装置10によると、受信側の通信装置10は、受信フレームが入力されてきたポートの番号、送信元アドレス、宛先アドレスを用いて、受信フレームの送信順序を推定できる。換言すると、受信側の通信装置10は、送信側の通信装置10から送信されてきたフレームの順序が入れ替わってしまっても、順序逆転を補正することができる。従って、送信側の通信装置10は、送信元と宛先の組み合わせが同じ複数のフレームを、異なる物理リンク11を用いて、受信側の通信装置10に送信することができる。このため、通信装置10は、物理リンク11の帯域を超えた帯域幅で行われる通信も中継することができる。
さらに、通信装置10の間で送受信されるフレームには、複数の物理リンク11を介して送受信されたフレームの順番を特定するためのシーケンス番号(巡回番号)が含まれていない。このため、端末間で送受信に使用するフレームのフォーマットを変更しなくても、物理リンク以上の帯域幅の通信の中継が可能である。
<その他>
なお、実施形態は上記に限られるものではなく、様々に変形可能である。以下にその例をいくつか述べる。
上記の説明ではハッシュ関数としてMD5を用いた場合を例としたが、ハッシュ関数のアルゴリズムは、実装に応じて任意に変更できる。例えば、MD5ではなく、Cyclic Redundancy Code(CRC32)やSecure Hash Algorithm(SHA−1)などが使用されても良い。
なお、図中の矢印は、図をわかりやすくするために、受信フレームや送信フレームなど、処理対象の情報の一部の流れを示している。従って、制御信号など、図中の矢印とは逆の方向に出力される情報もある。例えば、図18において、WADR生成カウンタ73やRADR生成カウンタ74は、制御信号生成部71に情報を入力しうるものとする。