以下、本発明を実施するための形態を、図面に基づいて説明する。尚、以下では、シェーピング装置の一例であるパケットシェーピング装置の説明を進める。尚、パケット以外の各種データ(例えば、セルやフレーム等)をシェーピングする任意のシェーピング装置についても、後述する構成及び動作を適用してもよい。
(1)第1実施形態
図1から図8を参照して、第1実施形態のパケットシェーピング装置1について説明する。
(1−1)パケットシェーピング装置の構成
図1から図2を参照して、第1実施形態のパケットシェーピング装置1の構成について説明する。図1は、第1実施形態のパケットシェーピング装置1の機能ブロックの一例を示すブロック図である。図2は、第1実施形態のパケットシェーピング装置1のハードウェアブロックの一例を示すブロック図である。
図1に示すように、第1実施形態のパケットシェーピング装置1は、フロー別シェーパ部11と、フロー情報テーブル12と、バッファ管理テーブル13と、バッファ部14とを備えている。
フロー別シェーパ部11は、パケットシェーピング装置1に入力される入力パケットを、バッファ部14が備えるn(但し、nは1以上の整数)個の時刻バッファ(TBk(但し、kは、1≦k≦nを満たす整数)141のいずれかに書き込む。フロー別シェーパ部11は、フロー情報テーブル12及びバッファ管理テーブル13の少なくとも一方に基づいて、n個の時刻バッファ(TBk)141のうちの入力パケットを書き込むべき少なくとも一つのバッファ141を決定することが好ましい。
フロー情報テーブル12は、入力パケットのフローに関する情報を含むテーブルである。入力パケットのフローは、例えば、入力パケットが送信又は受信される契約者や入力パケットのサービス等に応じて個別に割り当てられる。尚、フロー情報テーブル12の詳細については図3を参照しながら後に詳述するため、ここでの詳細な説明については省略する。
バッファ管理テーブル13は、n個の時刻バッファ(TBk)141を管理するための情報を含むテーブルである。尚、バッファ管理テーブル13の詳細については図4を参照しながら後に詳述するため、ここでの詳細な説明については省略する。
バッファ部14は、n個の時刻バッファ(TBk)141と、セレクタ142とを備えている。
n個の時刻バッファ(TBk)141の夫々は、フロー別シェーパ部11によって書き込まれた入力パケットを一時的に格納する。n個の時刻バッファ(TBk)141の夫々の上限サイズ(つまり、書込可能な上限サイズであって、バッファリング容量の上限サイズ)は、各時刻バッファ(TBk)141から所定時間T1内に読出可能な最大のデータ量に設定されている。例えば、所定時間T1を1ミリ秒に設定した場合には、n個の時刻バッファ(TBk)141の夫々の上限サイズは、各時刻バッファ(TBk)141から1ミリ秒以内に読出可能な最大のデータ量に設定されている。但し、n個の時刻バッファ(TBk)141の夫々の上限サイズは、各時刻バッファ(TBk)141から所定時間T1以内に読出可能な最大のデータ量に対して所定のマージン(例えば、1パケットに相当するサイズのマージン)を加味した値に設定されていてもよい。
尚、第1実施形態では、n個の時刻バッファ(TBk)141の夫々に付与されている「TBk」という符号は、便宜上時刻バッファ(TBk)141の識別番号として用いられてもよい。加えて、「TBk」という表記は、便宜上時刻バッファ(TBk)141に書き込まれている入力パケットが読み出される順番を示す情報として用いられてもよい。この場合、例えば、時刻バッファ(TB1)141は、「TB1」という識別番号を有する時刻バッファ(TB1)141であって、1番目に(或いは、n番目の時刻バッファ(TBn)141の次に)読み出される時刻バッファ(TB1)141である。同様に、例えば、時刻バッファ(TB2)141は、「TB2」という識別番号を有する時刻バッファ(TB2)141であって、2番目に(つまり、1番目の時刻バッファ(TB1)141の次に)読み出される時刻バッファ(TB2)141である。同様に、例えば、時刻バッファ(TBk)141は、「TBk」という識別番号を有する時刻バッファ(TBk)141であって、k番目に(つまり、k−1番目の時刻バッファ(TBk−1)141の次に)読み出される時刻バッファ(TBk)141である。
セレクタ142は、所定時間T1毎に、n個の時刻バッファ(TBk)141の中から書き込まれている入力パケットを読み出す一つの時刻バッファ(TBk)141を順次選択する。尚、上述したように、セレクタ142は、時刻バッファ(TB1)141から時刻バッファ(TBn)をこの順に選択することが好ましい。セレクタ142は、所定時間T1が経過する間、選択した一つの時刻バッファ(TBk)141に書き込まれている入力パケットを、出力パケットとして読み出す。つまり、セレクタ142により、入力パケットが出力パケットとして読み出される一つの時刻バッファ(TBk)141が所定時間T1毎に順次切り替えられる。
図2に示すように、パケットシェーピング装置1は、ハードウェア構成の観点からみると、入力インタフェース15と、FPGA(Field Programmable Gate Array)16と、出力インタフェース17と、テーブル格納用RAM(Random Access Memory)18と、バッファ用RAM19とを備えている。入力インタフェース15は、入力パケットの入力を受け付ける。FPGA16は、書き換え可能な論理回路を含む集積処理回路であり、シェーピング装置1の仕様に応じた処理を行うように論理回路の定義付けないしは設計を適宜行うことができる。出力インタフェース17は、出力パケットを出力する。テーブル用RAM18は、フロー情報テーブル12及びバッファ管理テーブル13を格納するためのRAMである。バッファ用RAM19は、複数の時刻バッファ141を形成するためのRAMである。尚、FPGA125が、上述したフロー別シェーパ部11及びセレクタ142に対応している。テーブル用RAM18が、上述したフロー情報テーブル12及びバッファ管理テーブル13に対応している。バッファ用RAM19が、上述した複数の時刻バッファ141に対応している。
(1−2)フロー情報テーブル及びバッファ管理テーブルのデータ構造
図3及び図4を参照して、第1実施形態のフロー情報テーブル12及びバッファ管理テーブル13のデータ構造について説明する。図3は、第1実施形態のフロー情報テーブル12のデータ構造を示すテーブル図である。図4は、第1実施形態のバッファ管理テーブル13のデータ構造を示すテーブル図である。
図3に示すように、フロー情報テーブル12は、フローID121と、入力可能上限バイト数122と、許容遅延123と、次時刻バッファ番号124と、入力可能残りバイト数125とを含むフロー情報レコード126を、フロー毎に備えている。尚、図3は、m(但し、mは1以上の整数)個のフローが存在する場合のフロー情報テーブル12の例を示している。
フローID121は、フロー情報レコード126に対応するフローを識別するための識別情報(ID)を示す。尚、図3は、m個のフローに対して、「#1」、「#2」、・・・、「#m」というフローID121が割り当てられる例を示している。
入力可能上限バイト数122は、「最大量情報」の一例であって、各時刻バッファ(TBk)141に書込可能な上限バイト数を、フロー毎に個別に示す。つまり、入力可能上限バイト数122は、各時刻バッファ(TBk)141に書込可能な各フローの入力パケットの上限バイト数を示す。例えば、図3は、フローID121が「#1」となるフローの入力パケットが、各時刻バッファ(TBk)141に最大1250バイト書込可能であることを示す入力可能上限バイト数122の例を示している。同様に、例えば、図3は、フローID121が「#2」となるフローの入力パケットが、各時刻バッファ(TBk)141に最大500バイト書込可能であることを示す入力可能上限バイト数122の例を示している。同様に、例えば、図3は、フローID121が「#m」となるフローの入力パケットが、各時刻バッファ(TBk)141に最大2000バイト書込可能であることを示す入力可能上限バイト数122の例を示している。尚、入力可能上限バイト数122には、各フローの帯域(レート)に応じて固定的なバイト数が設定されてもよい。或いは、入力可能上限バイト数122は、適宜変更されてもよい。
許容遅延123は、「遅延時間情報」の一例であって、入力パケットを新たに書き込んでから当該入力パケットが実際に読み出されるまでの遅延時間の許容値を示す。より具体的には、許容遅延123は、現在読出中の一の時刻バッファ(TBk)141を起点として、入力パケットを新たに書き込むべき他の時刻バッファ(TBk)141から当該書き込んだ入力パケットが実際に読み出されるまでの遅延時間の許容値を示す。例えば、入力パケットを新たに書き込んでから当該入力パケットが実際に読み出されるまでの遅延時間が許容遅延123以内であれば、入力パケットが実際に書き込まれることが好ましい。他方で、例えば、入力パケットを新たに書き込んでから当該入力パケットが実際に読み出されるまでの遅延時間が許容遅延123を超えるのであれば、入力パケットが実際に新たに書き込まれないことが好ましい。
尚、図3は、フローID121が「#1」となるフローの許容遅延123が30ミリ秒である例を示している。従って、フローID121が「#1」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が30ミリ秒以下であれば、n個の時刻バッファ(TBk)141のいずれかに書き込まれることが好ましい。他方で、フローID121が「#1」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が30ミリ秒を超えるのであれば、n個の時刻バッファ(TBk)141のいずれかに書き込まれない(例えば、破棄される)ことが好ましい。
同様に、図3は、フローID121が「#2」となるフローの許容遅延123が50ミリ秒である例を示している。従って、フローID121が「#2」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が50ミリ秒以下であれば、n個の時刻バッファ(TBk)141のいずれかに書き込まれることが好ましい。他方で、フローID121が「#2」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が50ミリ秒を超えるのであれば、n個の時刻バッファ(TBk)141のいずれかに書き込まれない(例えば、破棄される)ことが好ましい。
同様に、図3は、フローID121が「#m」となるフローの許容遅延123が10ミリ秒である例を示している。従って、フローID121が「#m」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が10ミリ秒以下であれば、n個の時刻バッファ(TBk)141のいずれかに書き込まれることが好ましい。他方で、フローID121が「#m」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が10ミリ秒を超えるのであれば、n個の時刻バッファ(TBk)141のいずれかに書き込まれない(例えば、破棄される)ことが好ましい。
次時刻バッファ番号124は、「特定情報」の一例であって、入力パケットを書き込むべき一つの時刻バッファ(TBk)141の識別番号を、フロー毎に個別に示す。例えば、図3は、フローID121が「#1」となるフローの入力パケットが、時刻バッファ(TB1)141に書き込まれるべきであることを示す次時刻バッファ番号124の例を示している。同様に、例えば、図3は、フローID121が「#2」となるフローの入力パケットが、時刻バッファ(TB1)141に書き込まれるべきであることを示す次時刻バッファ番号124の例を示している。同様に、例えば、図3は、フローID121が「#m」となるフローの入力パケットが、時刻バッファ(TB3)141に書き込まれるべきであることを示す次時刻バッファ番号124の例を示している。
入力可能残りバイト数125は、「残量情報」の一例であって、次時刻バッファ番号124によって特定される一つの時刻バッファ(TBk)141に書込可能な残りのバイト数を、フロー毎に個別に示す。例えば、入力可能残りバイト数125は、次時刻バッファ番号124によって特定される一つの時刻バッファ(TBk)141に既に書込済みの入力パケットのバイト数を上述した入力可能上限バイト数122から減算した値となる。例えば、図3は、フローID121が「#1」となるフローの入力パケットが、次時刻バッファ番号124によって特定される時刻バッファ(TB1)141にあと500バイト書込可能であることを示す入力可能残りバイト数125の例を示している。同様に、例えば、図3は、フローID121が「#2」となるフローの入力パケットが、次時刻バッファ番号124によって特定される時刻バッファ(TB1)141にあと300バイト書込可能であることを示す入力可能残りバイト数125の例を示している。同様に、例えば、図3は、フローID121が「#m」となるフローの入力パケットが、次時刻バッファ番号124によって特定される時刻バッファ(TB3)141にあと1520バイト書込可能であることを示す入力可能残りバイト数125の例を示している。
図4に示すように、バッファ管理テーブル13は、時刻バッファ識別番号131と、バッファ上限値132と、キュー長133と、読出中フラグ134とを含むバッファ管理レコード135を、時刻バッファ(TBk)141毎に備えている。
時刻バッファ識別番号131は、バッファ管理レコード135に対応する時刻バッファ(TBk)141を識別するための識別番号を示す。
バッファ上限値132は、「上限情報」の一例であって、各時刻バッファ(TBk)141に書込可能な上限バイト数を示す。つまり、バッファ上限値132は、各時刻バッファ(TBk)141の上限サイズを示す。尚、バッファ上限値132は、フロー毎の区別をすることなく時刻バッファ(TBk)141全体として書込可能な上限バイト数を示すという点で、上述した入力可能上限バイト数122とは異なる。例えば、図4は、時刻バッファ(TB1)141に最大125000バイト書込可能であることを示すバッファ上限値132の例を示している。同様に、例えば、図4は、時刻バッファ(TB2)141に最大125000バイト書込可能であることを示すバッファ上限値132の例を示している。同様に、例えば、図4は、時刻バッファ(TBn)141に最大125000バイト書込可能であることを示すバッファ上限値132の例を示している。
キュー長133は、「キュー長情報」の一例であって、各時刻バッファ(TBk)141に既に書き込まれている入力パケットのバイト数を示す。言い換えれば、キュー長133は、各時刻バッファ(TBk)141に既に書き込まれ且つ読み出し待ち中の入力パケットのバイト数を示す。更に言い換えれば、キュー長133は、各時刻バッファ(TBk)141に既に書き込まれ且つ読み出し待ち中の全てのフローの入力パケットのバイト数を示す。例えば、図4は、時刻バッファ(TB1)141に87000バイトの入力パケットが既に書き込まれ且つ読み出し待ち中であることを示すキュー長133の例を示している。同様に、例えば、図4は、時刻バッファ(TB2)141に42000バイトの入力パケットが既に書き込まれ且つ読み出し待ち中であることを示すキュー長133の例を示している。同様に、例えば、図4は、時刻バッファ(TBn)141には入力パケットが書き込まれていないことを示すキュー長133の例を示している。
読出中フラグ134は、n個の時刻バッファ(TBk)141のうちの読出中の一つの時刻バッファ(TBk)141を識別するフラグである。例えば、読出中フラグ134は、対応する時刻バッファ(TBk)141が読出中である場合には“1”に設定される。他方で、読出中フラグ134は、対応する時刻バッファ(TBk)141が読出中でない場合には“0”に設定される。例えば、図4は、時刻バッファ(TB1)141が読出中であり且つその他の時刻バッファ(TB2)141から時刻バッファ(TBn)141が読出中ではないことを示す読出中フラグ134の例を示している。
(1−3)パケットシェーピング装置の動作
図5から図6を参照して、第1実施形態のパケットシェーピング装置1の動作について説明する。図5は、第1実施形態のパケットシェーピング装置1の動作の一部の流れを示すフローチャートである。図6は、第1実施形態のパケットシェーピング装置1の動作の他の一部の流れを示すフローチャートである。
図5に示すように、フロー別シェーパ部11は、入力パケットを取得する(ステップS101)。その後、フロー別シェーパ部11は、取得した入力パケットに含まれるパケット管理情報を取得する(ステップS102)。パケット管理情報は、例えば、入力パケットのフローを識別する変数FID(フローID)や、入力パケットのサイズ(バイト数)を示す変数PLEN(Packet LENgth)等を含んでいる。
その後、フロー別シェーパ部11は、フロー情報テーブル12から、ステップS102で取得したFIDと一致するフローID121を有するフロー情報レコード126を取得する(ステップS103)。以降、フロー情報レコード126に含まれる次時刻バッファ番号124を、「変数TBx(但し、xは、1≦x≦nを満たす整数)」と表記する。同様に、許容遅延123を、「変数N」と表記する。同様に、入力可能上限バイト数122を、「変数B1」と表記する。同様に、入力可能残りバイト数125を、「変数B2」と表記する。
ステップS103の動作に続いて、相前後して又は並行して、フロー別シェーパ部11は、バッファ管理テーブル13から、バッファ管理レコード135を取得する(ステップS104)。例えば、フロー別シェーパ部11は、読出中フラグ134を取得することで、現在読出中の時刻バッファ(TBk)141を認識する。尚、以降、現在読出中の時刻バッファ(TBk)141の識別番号を、「変数TBy(但し、yは、1≦y≦nを満たす整数)」と表記する。
続いて、フロー別シェーパ部11は、変数TBxが有効な値であるか否かを判定する(ステップS105)。例えば、ステップS101で取得した入力パケットのフローと同一のフローにおいて過去に別の入力パケットを既に取得している場合には、当該フローに対応する変数TBx(つまり、次時刻バッファ番号124)は有効であると推測できる。従って、この場合には、フロー別シェーパ部11は、変数TBxが有効であると判定してもよい。他方で、ステップS101で取得した入力パケットが、当該入力パケットのフローにおいて初めて取得した入力パケットである場合には、当該フローに対応する変数TBx(つまり、次時刻バッファ番号124)には有効な値が未だ設定されていないと推測できる。従って、この場合には、フロー別シェーパ部11は、変数TBxが有効でないと判定してもよい。或いは、時刻バッファ(TBx)141の読出時刻が、現在読出中の時刻バッファ(TBy)141の読出時刻よりも過去である(つまり、TBx<TBy(言い換えれば、x<y)となる)場合には、変数TBxが有効でないものとして取り扱うことが好ましい。従って、この場合には、フロー別シェーパ部11は、変数TBxが有効でないと判定してもよい。
ステップS105における判定の結果、変数TBxが有効であると判定される場合には(ステップS105:Yes)、フロー別シェーパ11は、時刻バッファ(TBx)141が現在読出中の時刻バッファ(TBy)141であるか否かを判定する(ステップS106)。つまり、フロー別シェーパ11は、TBx=TBy(言い換えれば、x=y)であるか否かを判定する。
ステップS106における判定の結果、時刻バッファ(TBx)141が現在読出中の時刻バッファ(TBy)141でないと判定される場合には(ステップS106:No)、フロー別シェーパ部11は、時刻バッファ(TBx)141を、ステップS101で取得した入力パケットを書き込むべき候補となる時刻バッファ(TBz(但し、zは、1≦z≦nを満たす整数))141に設定する(ステップS107)。つまり、フロー別シェーパ部11は、TBzにTBxを(言い換えれば、zにxを)設定する。
他方で、ステップS106における判定の結果、時刻バッファ(TBx)141が現在読出中の時刻バッファ(TBy)141であると判定される場合には(ステップS106:Yes)、フロー別シェーパ部11は、読出中の時刻バッファ(TBy)141への書き込みが許可されているか否かを判定する(ステップS108)。尚、読出中の時刻バッファ(TBy)141への書き込みが許可されているか否かは、パケットシェーピング装置1に対して予め設定されていてもよい。
ステップS108における判定の結果、読出中の時刻バッファ(TBy)141への書き込みが許可されていると判定される場合には(ステップS108:Yes)、フロー別シェーパ部11は、時刻バッファ(TBx)141を、ステップS101で取得した入力パケットを書き込むべき候補となる時刻バッファ(TBz)141に設定する(ステップS107)。つまり、フロー別シェーパ部11は、TBzにTBxを(言い換えれば、zにxを)設定する。
他方で、ステップS108における判定の結果、読出中の時刻バッファ(TBy)141への書き込みが許可されていないと判定される場合には(ステップS108:No)、フロー別シェーパ部11は、時刻バッファ(TBx)141の次段の時刻バッファ(TBx+1)141を、ステップS101で取得した入力パケットを書き込むべき候補となる時刻バッファ(TBz)141に設定する(ステップS109)。つまり、フロー別シェーパ部11は、TBzにTBx+1を(言い換えれば、zにx+1を)設定する。
他方で、ステップS105における判定の結果、変数TBxが有効でないと判定される場合には(ステップS105:No)、フロー別シェーパ11は、読出中の時刻バッファ(TBy)141への書き込みが許可されているか否かを判定する(ステップS110)。
ステップS110における判定の結果、読出中の時刻バッファ(TBy)141への書き込みが許可されていないと判定される場合には(ステップS110:No)、フロー別シェーパ部11は、読出中の時刻バッファ(TBy)141の次段の時刻バッファ(TBy+1)141を、ステップS101で取得した入力パケットを書き込むべき候補となる時刻バッファ(TBz)141に設定する(ステップS111)。つまり、フロー別シェーパ部11は、TBzにTBy+1を(言い換えれば、zにy+1を)設定する。
他方で、ステップS110における判定の結果、読出中の時刻バッファ(TBy)141への書き込みが許可されていると判定される場合には(ステップS110:Yes)、フロー別シェーパ部11は、時刻バッファ(TBy)141を、ステップS101で取得した入力パケットを書き込むべき候補となる時刻バッファ(TBz)141に設定する(ステップS112)。つまり、フロー別シェーパ部11は、TBzにTByを(言い換えれば、zにyを)設定する。
尚、読出中の時刻バッファ(TBy)141への書き込みが許可されているか否かを判定しなくともよい。つまり、フロー別シェーパ部11は、ステップS106、ステップS108及びステップS110の判定動作が行わなくともよい。この場合、フロー別シェーパ部11は、変数TBxが有効であると判定される場合には(ステップS105:Yes)、時刻バッファ(TBx)141を、ステップS101で取得した入力パケットを書き込むべき候補となる時刻バッファ(TBz)141に設定してもよい(ステップS107)。他方で、フロー別シェーパ部11は、変数TBxが有効でないと判定される場合には(ステップS105:No)、時刻バッファ(TBy)141又は時刻バッファ(TBy+1)141を、ステップS101で取得した入力パケットを書き込むべき候補となる時刻バッファ(TBz)141に設定してもよい(ステップS111又はステップS112)。
続いて、フロー別シェーパ部11は、ステップS101で取得した入力パケットを書き込むべき候補となる時刻バッファ(TBz)141に空きがあるか否かを判定する(ステップS113)。具体的には、フロー別シェーパ部11は、バッファ管理テーブル13から、時刻バッファ識別番号131が「TBz」となるバッファ管理レコード135を取得する。尚、フロー別シェーパ部11は、ステップS104において取得済みのバッファ管理レコード135の中から、時刻バッファ識別番号131が「TBz」となるバッファ管理レコード135を抽出してもよい。フロー別シェーパ部11は、取得したバッファ管理レコード135のキュー長133がバッファ上限値132よりも小さいか否かを判定する。取得したバッファ管理レコード135のキュー長133がバッファ上限値132よりも小さいと判定される場合には、フロー別シェーパ部11は、時刻バッファ(TBz)141に空きがあると判定してもよい。他方で、取得したバッファ管理レコード135のキュー長133がバッファ上限値132よりも小さくないと判定される場合には、フロー別シェーパ部11は、時刻バッファ(TBz)141に空きがないと判定してもよい。
ステップS113における判定の結果、時刻バッファ(TBz)141に空きがないと判定される場合には(ステップS113:No)、フロー別シェーパ部11は、TBz(言い換えれば、z)を1だけインクリメントした後(ステップS114)、ステップS113の動作を繰り返す。つまり、フロー別シェーパ部11は、空きがないと判定された時刻バッファ(TBz)141の次段の時刻バッファ(TBz+1)141を新たな時刻バッファ(TBz)141に設定した上で、ステップS113の動作を繰り返す。
他方で、ステップS113における判定の結果、時刻バッファ(TBz)141に空きがあると判定される場合には(ステップS113:Yes)、フロー別シェーパ部11は、図6に示す動作を行う。
図6に示すように、フロー別シェーパ部11は、入力パケットを書き込むべき候補となる時刻バッファ(TBz)141の読出時間と、現在読出中の時刻バッファ(TBy)141の読出時間との間の差分が、変数N(つまり、許容遅延123)よりも大きいか否かを判定する(ステップS115)。つまり、フロー別シェーパ部11は、時刻バッファ(TBz)141に入力パケットを書き込んでから当該時刻バッファ(TBz)141から実際に入力パケットが読み出されるまでの遅延時間が、変数Nよりも大きいか否かを判定する。尚、上述した所定時間T1の例として「1ミリ秒」を用いた場合には、時刻バッファ(TBk)141の識別番号TBkの差分は、遅延時間[ミリ秒]に相当する。従って、図6に示す例では、フロー別シェーパ部11は、時刻バッファ(TBz)141の識別番号TBzと時刻バッファ(TBy)141の識別番号TByとの間の差分(TBz−TBy(言い換えれば、z−y))が、変数Nよりも大きいか否かを判定している。
ステップS115における判定の結果、TBz−TBy(つまり、遅延時間)が変数Nよりも大きいと判定される場合には(ステップS115:Yes)、フロー別シェーパ部11は、ステップS101で取得した入力パケットを廃棄する(ステップS116)。その後、パケットシェーピング装置1は、動作を終了してもよいし、図5のステップS101以降の動作を再度繰り返してもよい。
他方で、ステップS115における判定の結果、TBz−TBy(つまり、遅延時間)が変数Nよりも大きくないと判定される場合には(ステップS115:No)、フロー別シェーパ11は、ステップS101で取得した入力パケットを、時刻バッファ(TBz)141に書き込む(ステップS117)。
尚、フロー別シェーパ部11は、ステップS115及びステップS116の動作を行わなくともよい。つまり、フロー別シェーパ部11は、遅延時間を考慮することなく入力パケットを書き込んでもよい。この場合、フロー情報テーブル12は、許容遅延123を含んでいなくともよい。
続いて、フロー別シェーパ部11は、時刻バッファ識別番号131が「TBz」となるバッファ管理レコード135のキュー長133を更新する(ステップS118)。具体的には、フロー別シェーパ部11は、更新前のキュー長133に対して変数PLEN(つまり、今回書き込んだ入力パケットのサイズ(バイト数))を加算した値を、更新後のキュー長133としてバッファ管理テーブル13に書き込む。
続いて、フロー別シェーパ部11は、ステップS118で更新されたキュー長133が、時刻バッファ識別番号131が「TBz」となるバッファ管理レコード135のバッファ上限値132よりも大きいか否かを判定する(ステップS119)。
ステップS119における判定の結果、ステップS118で更新されたキュー長133が、時刻バッファ識別番号131が「TBz」となるバッファ管理レコード135のバッファ上限値132よりも大きいと判定される場合には(ステップS119:Yes)、フロー別シェーパ部11は、時刻バッファ(TBz)の次段以降の空きがある時刻バッファ(TBz+a(但し、aは、1≦a<nを満たす整数))141のバッファ上限値132を更新する(ステップS120)。具体的には、フロー別シェーパ部11は、時刻バッファ識別番号131が「TBz+a」となるバッファ管理レコード135のバッファ上限値132から、キュー長133(つまり、ステップS118で更新されたキュー長)がバッファ上限値132(つまり、時刻バッファ識別番号131が「TBz」となるバッファ管理レコード135のバッファ上限値132)を超過したバイト数だけ減算する。フロー別シェーパ部11は、減算の結果得られた値を、時刻バッファ識別番号131が「TBz+a」となるバッファ管理レコード135の更新後のバッファ上限値132としてバッファ管理テーブル13に書き込む。
他方で、ステップS119における判定の結果、ステップS118で更新されたキュー長133が、時刻バッファ識別番号131が「TBz」となるバッファ管理レコード135のバッファ上限値132よりも大きくないと判定される場合には(ステップS119:No)、フロー別シェーパ部11は、ステップS120の動作を行わなくともよい。
尚、フロー別シェーパ11は、ステップS119及びステップS120の動作を行わなくともよい。
続いて、フロー別シェーパ部11は、フロー情報テーブル12の更新動作(ステップS121からステップS127)を行う。具体的には、フロー別シェーパ部11は、変数B2(つまり、入力可能残りバイト数125)が変数PLEN(つまり、今回書き込んだ入力パケットのサイズ(バイト数))よりも大きいか否かを判定する(ステップS121)。
ステップS121における判定の結果、変数B2が変数PLENよりも大きいと判定される場合には(ステップS121:Yes)、フロー別シェーパ部11は、変数B2(つまり、入力可能残りバイト数125)を更新する(ステップS122)。具体的には、フロー別シェーパ部11は、変数B2から変数PLENを減算した値を、更新後の変数B2(つまり、更新後の入力可能残りバイト数125)としてフロー情報テーブル12に書き込む。その後、パケットシェーピング装置1は、動作を終了してもよいし、図5のステップS101以降の動作を再度繰り返してもよい。
他方で、ステップS121における判定の結果、変数B2が変数PLENよりも大きくないと判定される場合には(ステップS121:No)、フロー別シェーパ部11は、変数PLENを更新する(ステップS123)。具体的には、フロー別シェーパ部11は、変数PLENから変数B2を減算した値を、更新後の変数PLENとする。
続いて、フロー別シェーパ部11は、変数TBx(つまり、次時刻バッファ番号124)を更新する(ステップS124)。具体的には、フロー別シェーパ部11は、変数TBx(言い換えれば、x)を1だけインクリメントした値を、更新後の次時刻バッファ番号124としてフロー情報テーブル12に書き込む。つまり、フロー別シェーパ部11は、時刻バッファ(TBx)141の次段の時刻バッファ(TBx+1)141を、新たな時刻バッファ(TBx)141として取り扱う。その後、フロー別シェーパ部11は、変数B1(つまり、入力可能上限バイト数122)が変数PLEN(つまり、ステップS123で更新された更新後の変数PLEN)よりも大きいか否かが判定される(ステップS125)。
ステップS125における判定の結果、変数B1が変数PLENよりも大きくないと判定される場合には(ステップS125:No)、フロー別シェーパ部11は、変数PLENを更新する(ステップS126)。具体的には、フロー別シェーパ部11は、変数PLENから変数B1を減算した値を、更新後の変数PLENとする。その後、フロー別シェーパ部11は、ステップS124以降の動作を繰り返す。
他方で、ステップS125における判定の結果、変数B1が変数PLENよりも大きいと判定される場合には(ステップS125:Yes)、フロー別シェーパ部11は、変数B2(つまり、入力可能残りバイト数125)を更新する(ステップS127)。具体的には、フロー別シェーパ部11は、変数B1から変数PLENを減算した値を、更新後の変数B2(つまり、更新後の入力可能残りバイト数125)としてフロー情報テーブル12に書き込む。その後、パケットシェーピング装置1は、動作を終了してもよいし、図5のステップS101以降の動作を再度繰り返してもよい。
以上説明したフロー情報テーブル12の更新動作(ステップS121からステップS127)について、図7に示す実例を交えながら詳細に説明する。図7は、フロー情報テーブル12の更新動作が行われる場合の変数B1、変数B2及び変数PLENの関係を示す説明図である。
図7(a)は、更新前の変数B2(つまり、更新前の入力可能残りバイト数125)が更新前の変数PLEN(つまり、今回書き込んだ入力パケットのサイズ)よりも大きい例を示す。この場合、フロー別シェーパ部11は、更新前の変数B2から更新前の変数PLENを減算した値を、更新後の変数B2としてフロー情報テーブル12に書き込む(図6のステップS122)。
図7(b)は、更新前の変数B2が更新前の変数PLENよりも小さい第1の例を示す。この場合、フロー別シェーパ部11は、更新前の変数PLENから更新前の変数B2を減算した値を、更新後の変数PLENとする(図6のステップS123)。更に、フロー別シェーパ部11は、変数TBxに対して1回目のインクリメントを行う(ステップS124)。その後、図7(b)に示すように、更新後の変数PLENが変数B1よりも小さくなったとする(図6のステップS125:Yes)。この場合、フロー別シェーパ部11は、変数B1から更新後の変数PLENを減算した値を、更新後の変数B2としてフロー情報テーブル12に書き込む。尚、更新後の変数PLENは、更新前の変数PLEN−更新前の変数B2と表現できる。このため、図7(b)に示す例では、更新後の変数B2は、変数B1−更新後の変数PLEN=変数B1−(更新前の変数PLEN−更新前の変数B2)=更新前の変数B2−更新前の変数PLEN+変数B1と表現できる。
図7(c)は、更新前の変数B2が更新前の変数PLENよりも小さい第2の例を示す。この場合、フロー別シェーパ部11は、更新前の変数PLENから更新前の変数B2を減算した値を、1回更新後の変数PLENとする(図6のステップS123)。更に、フロー別シェーパ部11は、変数TBxに対して1回目のインクリメントを行う(ステップS124)。その後、図7(c)に示すように、1回更新後の変数PLENが変数B1よりもいまだ大きくなっているとする(図6のステップS125:No)。この場合、フロー別シェーパ部11は、1回更新後の変数PLENから変数B1を減算した値を、2回更新後の変数PLENとする(図6のステップS126)。更に、フロー別シェーパ部11は、変数TBxに対して2回目のインクリメントを行う(ステップS124)。その後、図7(c)に示すように、2回更新後の変数PLENが変数B1よりも小さくなったとする(図6のステップS125:Yes)。この場合、フロー別シェーパ部11は、変数B1から2回更新後の変数PLENを減算した値を、更新後の変数B2としてフロー情報テーブル12に書き込む。尚、2回更新後の変数PLENは、1回更新後の変数PLEN−変数B1と表現できる。更に、1回更新後の変数PLENは、更新前の変数PLEN−更新前の変数B2と表現できる。このため、図7(c)に示す例では、更新後の変数B2は、変数B1−2回更新後の変数PLEN=変数B1−(1回更新後の変数PLEN−変数B1)=変数B1−((更新前の変数PLEN−更新前の変数B2)−変数B1)=更新前の変数B2−更新前の変数PLEN+変数B1×2と表現できる。
図7(d)は、更新前の変数B2が更新前の変数PLENよりも小さい第3の例を示す。この場合、フロー別シェーパ部11は、更新前の変数PLENから更新前の変数B2を減算した値を、1回更新後の変数PLENとする(図6のステップS123)。更に、フロー別シェーパ部11は、変数TBxに対して1回目のインクリメントを行う(ステップS124)。その後、図7(d)に示すように、1回更新後の変数PLENが変数B1よりもいまだ大きくなっているとする(図6のステップS125:No)。この場合、フロー別シェーパ部11は、1回更新後の変数PLENから変数B1を減算した値を、2回更新後の変数PLENとする(図6のステップS126)。更に、フロー別シェーパ部11は、変数TBxに対して2回目のインクリメントを行う(ステップS124)。以降同様の動作が繰り返され、図7(d)に示すように、変数TBxに対してi(但し、iは1以上の整数)回目のインクリメントを行った時点で、変数PLENが変数B1よりも小さくなったとする(図6のステップS125:Yes)。つまり、i回更新後の変数PLENが変数B1よりも小さくなったとする(図6のステップS125:Yes)。この場合、フロー別シェーパ部11は、変数B1からi回更新後の変数PLENを減算した値を、更新後の変数B2としてフロー情報テーブル12に書き込む。尚、i回更新後の変数PLENは、i−1回更新後の変数PLEN−変数B1と表現できる。このため、図7(d)に示す例では、更新後の変数B2は、変数B1−i回更新後の変数PLEN=変数B1−(i−1回更新後の変数PLEN−変数B1)=・・・=更新前の変数B2−更新前の変数PLEN+変数B1×iと表現できる。
図7(a)から図7(d)に示す例をまとめると、変数B2は、以下のように更新されているとも表現できる。まず、更新後の変数B2を、更新前の変数B2−更新前の変数PLENとする。更新後の変数B2が正の値になる場合には、変数B2の更新は終了する。他方で、更新後の変数B2が負の値になる場合には、変数TBxがインクリメントされると共にインクリメントの都度更新後の変数B2に対して変数B1が加算された値を、更なる更新後の変数B2とする。以下、同様の動作が、更新後の変数B2が正の値になるまで繰り返される。
このようなフロー情報テーブル12の更新動作の手順を考慮すれば、図6に示すフローチャートは、図8のフローチャートに書き換えることができる。尚、図8に示すフローチャートは、実質的には図6に示すフローチャートと同様の動作を行っている。
図8に示すように、ステップS115からステップS120までの動作は、図6に示す動作と同一である。ステップS120に続いて、フロー別シェーパ部11は、変数B2を更新する(ステップS131)。具体的には、フロー別シェーパ部11は、変数B2から変数PLENを減算した値を、更新後の変数B2とする。このとき、フロー別シェーパ部11は、更新後の変数B2をフロー情報テーブル12に書き込んでもよいし、書き込まなくともよい。更新後の変数B2を書き込まない場合には、フロー別シェーパ部11は、更新後の変数B2を内部のパラメータとして記憶しておくことが好ましい。
その後、フロー別シェーパ部11は、更新後の変数B2が正の値を有しているか否かを判定する(ステップS132)。
ステップS132における判定の結果、更新後の変数B2が正の値を有していると判定される場合には(ステップS132:Yes)、その後、パケットシェーピング装置1は、動作を終了してもよいし、図5のステップS101以降の動作を再度繰り返してもよい。尚、ステップS131(或いは、後述のステップS134)の段階で更新後の変数B2がフロー情報テーブル12に書き込まれていない場合には、フロー別シェーパ部11は、更新後の変数B2が正の値を有していると判定されるタイミングで、更新後の変数B2をフロー情報テーブル12に書き込んでもよい。
他方で、ステップS132における判定の結果、更新後の変数B2が正の値を有していないと判定される場合には(ステップS132:No)、フロー別シェーパ部11は、変数TBx(つまり、次時刻バッファ番号124)を更新する(ステップS124)。具体的には、フロー別シェーパ部11は、変数TBx(言い換えれば、x)を1だけインクリメントした値を、更新後の次時刻バッファ番号124としてフロー情報テーブル12に書き込む。
その後、フロー別シェーパ部11は、変数B2を更新する(ステップS134)。具体的には、フロー別シェーパ部11は、変数B2に変数B1を加算した値を、更新後の変数B2とする。このとき、フロー別シェーパ部11は、更新後の変数B2をフロー情報テーブル12に書き込んでもよいし、書き込まなくともよい。更新後の変数B2を書き込まない場合には、フロー別シェーパ部11は、更新後の変数B2を内部のパラメータとして記憶しておくことが好ましい。
以降、ステップS132以降の動作が繰り返される。
以上説明したように、第1実施形態のパケットシェーピング装置1によれば、フロー情報テーブル12を参照及び更新しながら、入力パケットを複数の時刻バッファ(TBk)141のいずれかに書き込むことができる。このため、第1実施形態のパケットシェーピング装置1は、効率的なシェーピングを行うことができる。
第1実施形態のパケットシェーピング装置1によれば、最小パケット長(64バイト)に固定されたサイズを有するタイムスロットで刻まれるタイムテーブルを備えるシェーピング装置と比較して、ハードウェア構成を比較的簡易にすることができる。例えば、最小パケット長(64バイト)に固定されたサイズを有するタイムスロットで刻まれるタイムテーブルを備えるシェーピング装置では、1Gbpsの伝送容量を有するネットワーク上で50ミリ秒の時間幅のタイムテーブルを用意するためには、約10万個のタイムスロット(つまり、10万個のアドレス)が必要になる。一方で、第1実施形態のシェーピング装置1によれば、例えば1ミリ秒毎に切り替わる50個の時刻バッファ(TBk)141を用意すれば足りる。加えて、第1実施形態のパケットシェーピング装置1によれば、時刻バッファ(TBk)141に書き込まれた入力パケットを管理するための管理情報のデータ量も削減することができる。
第1実施形態のパケットシェーピング装置1によれば、時刻バッファ(TBk)141のキュー長情報133がバッファ上限値132を超える場合であっても、入力パケットの書き込みを許可することができる。例えば、バッファ上限値132が125kバイトであり且つキュー長情報133が124kバイトである時刻バッファ(TBk)141に対して、新たに2kバイトの入力パケットの書き込みを許可することができる。従って、スループットの低下を抑えることができる。尚、を従って、スループットの低下を抑えることができる。尚、キュー長情報133がバッファ上限値132を超える場合に入力パケットの更なる書き込みを許可したとしても、次段以降の時刻バッファ(TBk)141のバッファ上限値132を調整することができる。このため、パケットシェーピング装置1全体として、キュー長情報133がバッファ上限値132を超える影響が蓄積されることはない。
第1実施形態のパケットシェーピング装置1によれば、入力パケットが時刻バッファ(TBk)に書き込まれた時点で、当該入力パケットがどのタイミングで読み出されるのかが確定する。つまり、入力パケットが読み出されるタイミングが意図せず遅延することは殆どない。加えて、第1実施形態のパケットシェーピング装置1によれば、入力パケットを新たに書き込んでから当該入力パケットが実際に読み出されるまでの遅延時間が許容遅延123を超える場合には、当該入力パケットを廃棄することができる。このため、入力パケットが時刻バッファ(TBk)141内に意図せず長い間滞留してしまう不都合を好適に抑制することができる。
第1実施形態のパケットシェーピング装置1によれば、読出中の時刻バッファ(TBk)141に対して入力パケットを書き込むことができる。従って、バッファリング遅延を少なく又は殆どなくすことができる。但し、読出中の時刻バッファ(TBk)141に書込可能なサイズ(バイト数)は刻一刻と変化する。例えば、バッファ上限値132が125kバイト(言い換えれば、1ミリ秒で読出可能な上限サイズが125kバイト)である時刻バッファ(TBk)141の読出しが始まってから0.5ミリ秒が経過した時点では、当該時刻バッファ(TBk)141に書込可能なサイズ(バイト数)は、125kバイト×0.5=62.5kバイトとなっている。このため、フロー別シェーパ部11は、読出中の時刻バッファ(TBk)141に書込可能なサイズ(バイト数)は刻一刻と変化することを考慮しながら、読出中の時刻バッファ(TBk)141に対して入力パケットを書き込むことが好ましい。
第1実施形態のパケットシェーピング装置1によれば、読出中の時刻バッファ(TBk)141に対する入力パケットの書き込みを禁止することができる。このため、読出中の時刻バッファ(TBk)141に書込可能なサイズ(バイト数)は刻一刻と変化することを考慮しながら入力パケットを書き込まなくともよくなる。
(2)第2実施形態
図9から図14を参照して、第2実施形態のパケットシェーピング装置2について説明する。尚、上述した第1実施形態のパケットシェーピング装置2と同一の構成及び動作については、同一の参照符号及びステップ番号を付与することで、それらの詳細な説明については省略する。加えて、第2実施形態に対して、第1実施形態の構成及び動作の全部又は一部の各種態様を適宜適用してもよい。逆に、第1実施形態に対して、第2実施形態の構成及び動作の全部又は一部の各種態様を適宜適用してもよい。
(2−1)パケットシェーピング装置の構成
図9を参照して、第2実施形態のパケットシェーピング装置2の構成について説明する。図9は、第2実施形態のパケットシェーピング装置2の機能ブロックの一例を示すブロック図である。
図9(a)及び図9(b)に示すように、第2実施形態のパケットシェーピング装置2は、第1実施形態のパケットシェーピング装置1と同様に、フロー別シェーパ部21と、フロー情報テーブル22と、バッファ管理テーブル23と、バッファ部24とを備えている。
フロー別シェーパ部21は、上述のフロー別シェーパ部11と同様である。具体的には、フロー別シェーパ部21は、パケットシェーピング装置2に入力される入力パケットを、バッファ部24が備えるn個の時刻バッファ(TBk)241のいずれかに書き込む。
第2実施形態では、図9(b)に示すように、n個の時刻バッファ(TBk)241の夫々は、b(但し、bは1以上の整数)個のクラスj(但し、jは、1≦j≦bを満たす整数)用バッファ2412を備えている。尚、第2実施形態における「クラス」とは、例えば、入力パケットが送信又は受信される契約者や入力パケットのサービス等に応じて個別に割り当てられる優先度を意味する趣旨である。従って、フロー別シェーパ部21は、入力パケットを、b個のクラスj用バッファ2412のうち、入力パケットのクラスに対応する少なくとも一つのクラスj用バッファ2412に書き込むことが好ましい。フロー別シェーパ部21は、フロー情報テーブル22及びバッファ管理テーブル23の少なくとも一方に基づいて、n個の時刻バッファ(TBk)241のうちの入力パケットを書き込むべき少なくとも一つの時刻バッファ241を決定することが好ましい。加えて、フロー別シェーパ部21は、フロー情報テーブル22及びバッファ管理テーブル23の少なくとも一方に基づいて、決定された一つの時刻バッファ241が備えるb個のクラスj用バッファ2412のうちの入力パケットを書き込むべき少なくとも一つのクラスj用バッファ2412を決定することが好ましい。
尚、b個のクラスj用バッファ2412は、時刻バッファ(TBk)241内で物理的に又は論理的に区別されていてもよいし、物理的に又は論理的に区別されていなくともよい。b種類のクラスに応じた入力パケットを区別して記録することができるのであれば、時刻バッファ(TBk)241は、上述した時刻バッファ(TBk)141と同一であってもよい。
フロー情報テーブル22は、入力パケットのフローに関する情報を、フロー毎及びクラス毎に含むテーブルである。フロー情報テーブル22の詳細については図10を参照しながら後に詳述するため、ここでの詳細な説明については省略する。
バッファ管理テーブル23は、n個の時刻バッファ(TBk)241をクラス毎に管理するための情報を含むテーブルである。バッファ管理テーブル23の詳細については図11を参照しながら後に詳述するため、ここでの詳細な説明については省略する。
バッファ部24は、n個の時刻バッファ(TBk)241と、セレクタ242とを備えている。
n個の時刻バッファ(TBk)241の夫々は、セレクタ2411と、b個のクラスj用バッファ2412とを備えている。b個のクラスj用バッファ2412の夫々は、フロー別シェーパ部21によって書き込まれた入力パケットを一時的に格納する。セレクタ2411は、b個のクラスj用バッファ2412の中から、入力パケットを書き込むべき少なくとも一つのクラスj用バッファ2412を選択する。また、セレクタ2411は、b個のクラスj用バッファ2412の中から、入力パケットを読み出すべき少なくとも一つのクラスj用バッファ2412を選択する。セレクタ2411は、選択した少なくとも一つのクラスj用バッファ2412に書き込まれている入力パケットを、出力パケットとして読み出す。
n個の時刻バッファ(TBk)241の夫々の上限サイズは、各時刻バッファ(TBk)241から所定時間T1内に読出可能な最大のデータ量に設定されている。但し、n個の時刻バッファ(TBk)241の夫々の上限サイズは、各時刻バッファ(TBk)241から所定時間T1以内に読出可能な最大のデータ量に対して所定のマージン(例えば、1パケットに相当するサイズのマージン)を加味した値に設定されていてもよい。
セレクタ242は、上述したセレクタ142と同様に、所定時間T1毎に、n個の時刻バッファ(TBk)241の中から書き込まれている入力パケットを読み出す一つの時刻バッファ(TBk)241を順次選択する。また、セレクタ242は、所定時間T1が経過する間、選択した一つの時刻バッファ(TBk)241に書き込まれている入力パケットを、出力パケットとして読み出す。
尚、第2実施形態のパケットシェーピング装置2のハードウェア構成は、第1実施形態のパケットシェーピング装置1のハードウェア構成と同様であってもよい。
(2−2)フロー情報テーブル及びバッファ管理テーブルのデータ構造
図10及び図11を参照して、第2実施形態のフロー情報テーブル22及びバッファ管理テーブル23のデータ構造について説明する。図10は、第2実施形態のフロー情報テーブル22のデータ構造を示すテーブル図である。図11は、第2実施形態のバッファ管理テーブル23のデータ構造を示すテーブル図である。
図10に示すように、フロー情報テーブル22は、フローID221と、クラスID227と、入力可能上限バイト数222と、許容遅延223と、次時刻バッファ番号224と、入力可能残りバイト数225とを含むフロー情報レコード226を、フロー毎及びクラス毎に備えている。
フローID221は、上述したフローID121と同様の情報であり、フロー情報レコード226に対応するフローを識別するための識別情報(ID)を示す。
クラスID227は、フロー情報レコード226に対応するクラスを識別するための識別情報(ID)を示す。
入力可能上限バイト数222は、上述した入力可能上限バイト数122と同様の情報である。第2実施形態では、入力可能上限バイト数222は、各時刻バッファ(TBk)241に書込可能な上限バイト数を、フロー毎且つクラス毎に示す。例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「1」となる入力パケットが、各時刻バッファ(TBk)241に最大300バイト書込可能であることを示す入力可能上限バイト数222の例を示している。同様に、例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「2」となる入力パケットが、各時刻バッファ(TBk)241に最大500バイト書込可能であることを示す入力可能上限バイト数222の例を示している。同様に、例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「b」となる入力パケットが、各時刻バッファ(TBk)241に最大2000バイト書込可能であることを示す入力可能上限バイト数222の例を示している。
或いは、第2実施形態では、入力可能上限バイト数222は、各時刻バッファ(TBk)241に書込可能な上限バイト数を、フロー毎に個別に且つ優先度の高いクラス順にまとめて示す。例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「1」以下となる入力パケットが、各時刻バッファ(TBk)241に最大300バイト書込可能であることを示す入力可能上限バイト数222の例を示している。同様に、例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「2」以下となる入力パケットが、各時刻バッファ(TBk)241に最大500バイト書込可能であることを示す入力可能上限バイト数222の例を示している。同様に、例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「b」以下となる入力パケットが、各時刻バッファ(TBk)241に最大2000バイト書込可能であることを示す入力可能上限バイト数222の例を示している。
尚、入力可能上限バイト数222には、各フロー及び各クラスの帯域(レート)に応じて固定的なバイト数が設定されてもよい。或いは、入力可能上限バイト数222は、適宜変更されてもよい。
許容遅延223は、上述した許容遅延123と同様の情報である。第2実施形態では、許容遅延223は、入力パケットを新たに書き込んでから当該入力パケットが実際に読み出されるまでの遅延時間の許容値を、フロー毎に且つクラス毎に示す。
例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「1」となる入力パケットの許容遅延223が30ミリ秒である例を示している。従って、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「1」となる入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が30ミリ秒以下であれば、n個の時刻バッファ(TBk)241のいずれかに書き込まれることが好ましい。他方で、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「1」となる入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が30ミリ秒を超えるのであれば、n個の時刻バッファ(TBk)241のいずれかに書き込まれない(例えば、破棄される)ことが好ましい。
次時刻バッファ番号224は、上述した次時刻バッファ番号124と同様の情報である。第2実施形態では、次時刻バッファ番号224は、入力パケットを書き込むべき一つの時刻バッファ(TBk)241の識別番号を、フロー毎に且つクラス毎に個別に示す。例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「1」となる入力パケットが、時刻バッファ(TB1)241に書き込まれるべきであることを示す次時刻バッファ番号224の例を示している。
入力可能残りバイト数225は、上述した入力可能残りバイト数125と同様の情報である。第2実施形態では、入力可能残りバイト数225は、次時刻バッファ番号224によって特定される一つの時刻バッファ(TBk)241に書込可能な残りのバイト数を、フロー毎に且つクラス毎に示す。例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「1」となる入力パケットが、次時刻バッファ番号224によって特定される時刻バッファ(TBk)241にあと100バイト書込可能であることを示す入力可能残りバイト数225の例を示している。同様に、例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「b」となる入力パケットが、次時刻バッファ番号224によって特定される時刻バッファ(TBk)241にあと1520バイト書込可能であることを示す入力可能残りバイト数225の例を示している。
或いは、第2実施形態では、入力可能残りバイト数225は、次時刻バッファ番号224によって特定される一つの時刻バッファ(TBk)241に書込可能な残りのバイト数を、フロー毎に個別に且つ優先度の高いクラス順にまとめて示す。例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「1」以下となる入力パケットが、次時刻バッファ番号224によって特定される時刻バッファ(TBk)241にあと100バイト書込可能であることを示す入力可能残りバイト数225の例を示している。同様に、例えば、図10は、フローID221が「#1」となるフローの入力パケットのうちクラスID227が「b」以下となる入力パケットが、次時刻バッファ番号224によって特定される時刻バッファ(TBk)241にあと1520バイト書込可能であることを示す入力可能残りバイト数225の例を示している。
図11に示すように、バッファ管理テーブル23は、時刻バッファ識別番号231と、クラスID236と、バッファ上限値232と、クラス上限値237と、クラスキュー長233と、加算クラス238と、判定キュー長239と、読出中フラグ234とを含むバッファ管理レコード235を、時刻バッファ(TBk)241毎に且つクラス毎に備えている。
時刻バッファ識別番号231は、上述した時刻バッファ識別番号131と同様の情報であり、バッファ管理レコード235に対応する時刻バッファ(TBk)241を識別するための識別番号を示す。
クラスID227は、バッファ管理レコード235に対応するクラスを識別するための識別情報(ID)を示す。
バッファ上限値232は、上述したバッファ上限値132と同様の情報であり、各時刻バッファ(TBk)241に書込可能な上限バイト数を示す。
クラス上限値237は、各時刻バッファ(TBk)241に書込可能な上限バイト数を、優先度の高いクラス順にまとめて示す。つまり、クラス上限値237は、各時刻バッファ(TBk)241が備えるb個のクラスj用バッファ2412の夫々に書き込み可能な上限バイト数を、優先度の高いクラス順にまとめて示す。例えば、図11は、時刻バッファ(TB1)241に対して、クラスID236が「1」以下となる入力パケットを最大70000バイト書込可能であり、クラスID236が「2」以下となる入力パケットを最大100000バイト書込可能であり、クラスID236が「b」以下となる入力パケットを最大125000バイト書込可能であることを示すクラス上限値232の例を示している。
クラスキュー長233は、上述したキュー長133と同様の情報である。第2実施形態では、クラスキュー長233は、各時刻バッファ(TBk)241に既に書き込まれている入力パケットのバイト数を、クラス毎に示す。つまり、クラスキュー長233は、各時刻バッファ(TBk)241が備えるb個のクラスj用バッファ2412の夫々に既に書き込まれている入力パケットのバイト数を示す。例えば、図11は、時刻バッファ(TB1)241に対して、クラスID236が「1」となる入力パケットが既に34000バイト書き込まれており、クラスID236が「2」となる入力パケットが既に12000バイト書き込まれており、クラスID236が「b」となる入力パケットが既に117800バイト書き込まれていることを示すクラスキュー長233の例を示している。
加算クラス238は、判定用キュー長239を算出するために用いられるクラスキュー長233を特定するためのクラスID236を示す。具体的には、加算クラス238は、判定用キュー長239を算出するために加算されるクラスキュー長233を特定するためのクラスID236を示す。
判定キュー長239は、加算クラス238によって示されるクラスID236に対応するクラスキュー長233が加算された値を有している。例えば、図11は、「1」というクラスID236に対応する時刻バッファ(TB1)の判定キュー長239が、クラスID236が「1」となるクラスキュー長233の値「3400」となる例を示している。同様に、例えば、図11は、「2」というクラスID236に対応する時刻バッファ(TB1)の判定キュー長239が、クラスID236が「1」又は「2」となるクラスキュー長233の値「3400」及び「12000」和である「15400」となる例を示している。同様に、例えば、図11は、「b」というクラスID236に対応する時刻バッファ(TB1)の判定キュー長239が、クラスID236が「1」、「2」、・・・、又は「b」となるクラスキュー長233の値「3400」、「12000」、・・・、及び「117800」和である「143500」となる例を示している。
読出中フラグ234は、上述した読出中フラグ134と同様の情報であり、n個の時刻バッファ(TBk)241のうちの読出中の一つの時刻バッファ(TBk)241を識別するフラグである。
(2−3)パケットシェーピング装置の動作
図12から図14を参照して、第2実施形態のパケットシェーピング装置2の動作について説明する。図12は、第2実施形態のパケットシェーピング装置2の動作の一部の流れを示すフローチャートである。図13は、第2実施形態のパケットシェーピング装置2の動作の他の一部の流れを示すフローチャートである。図14は、第2実施形態のパケットシェーピング装置2の動作の他の一部の流れを示すフローチャートである。
図12に示すように、フロー別シェーパ部21は、入力パケットを取得する(ステップS101)。その後、フロー別シェーパ部21は、取得した入力パケットに含まれるパケット管理情報を取得する(ステップS202)。パケット管理情報は、例えば、入力パケットのフローを識別する変数FID(フローID)や、入力パケットのクラスを識別する変数CLASS(クラスID)や、入力パケットのサイズ(バイト数)を示す変数PLEN(Packet LENgth)等を含んでいる。
その後、フロー別シェーパ部21は、フロー情報テーブル22から、ステップS202で取得したFIDと一致するフローID221及びステップS202で取得したCLASSと一致するクラスID227を有するフロー情報レコード226を取得する(ステップS203)。以降、第1実施形態と同様に、「変数TBx」、「変数N」、「変数B1」及び「変数B2」という表記を使用する。
ステップS203の動作に続いて、相前後して又は並行して、フロー別シェーパ部21は、バッファ管理テーブル23から、バッファ管理レコード235を取得する(ステップS104)。例えば、フロー別シェーパ部21は、読出中フラグ234を取得することで、現在読出中の時刻バッファ(TBk)241を認識する。以降、第1実施形態と同様に、「変数TBy」という表記を使用する。
続いて、フロー別シェーパ部21は、第1実施形態と同様の動作(具体的には、ステップS105からステップS112の動作)を行うことで、ステップS101で取得した入力パケットを書き込むべき候補となる時刻バッファ(TBz)241を設定する。
続いて、フロー別シェーパ部21は、時刻バッファ(TBz)241内に、入力パケットのクラスに対応する空きがあるか否かを判定する(ステップS213)。つまり、フロー別シェーパ部21は、時刻バッファ(TBz)241が備えるb個のクラスj用バッファ2412のうちの入力パケットのクラスに対応する少なくとも一つのクラスj用バッファ2412に空きがあるか否かを判定する。具体的には、フロー別シェーパ部21は、バッファ管理テーブル23から、時刻バッファ識別番号231が「TBz」となり且つクラスID236が「CLASS」となるバッファ管理レコード235を取得する。フロー別シェーパ部21は、取得したバッファ管理レコード235の判定キュー長239がクラス上限値237よりも小さいか否かを判定する。判定キュー長239がクラス上限値237よりも小さいと判定される場合には、フロー別シェーパ部21は、時刻バッファ(TBz)241内に、入力パケットのクラスに対応する空きがあると判定してもよい。他方で、判定キュー長239がクラス上限値237よりも小さくないと判定される場合には、フロー別シェーパ部21は、時刻バッファ(TBz)241内に、入力パケットのクラスに対応する空きがないと判定してもよい。
ステップS213における判定の結果、時刻バッファ(TBz)241内に、入力パケットのクラスに対応する空きがないと判定される場合には(ステップS213:No)、フロー別シェーパ部21は、TBz(言い換えれば、z)を1だけインクリメントした後(ステップS114)、ステップS213の動作を繰り返す。
他方で、ステップS213における判定の結果、時刻バッファ(TBz)241内に、入力パケットのクラスに対応する空きがあると判定される場合には(ステップS213:Yes)、フロー別シェーパ部21は、図13に示す動作を行う。
図13に示すように、フロー別シェーパ部21は、入力パケットを書き込むべき候補となる時刻バッファ(TBz)241の読出時間と、現在読出中の時刻バッファ(TBy)241の読出時間との間の差分が、変数N(つまり、許容遅延223)よりも大きいか否かを判定する(ステップS115)。
ステップS115における判定の結果、TBz−TBy(つまり、遅延時間)が変数Nよりも大きいと判定される場合には(ステップS115:Yes)、フロー別シェーパ部21は、ステップS101で取得した入力パケットを廃棄する(ステップS116)。その後、パケットシェーピング装置2は、動作を終了してもよいし、図12のステップS101以降の動作を再度繰り返してもよい。
他方で、ステップS115における判定の結果、TBz−TBy(つまり、遅延時間)が変数Nよりも大きくないと判定される場合には(ステップS115:No)、フロー別シェーパ21は、ステップS101で取得した入力パケットを、時刻バッファ(TBz)241のうちの入力パケットのクラスに対応する領域に書き込む(ステップS217)。より具体的には、フロー別シェーパ21は、ステップS101で取得した入力パケットを、時刻バッファ(TBz)241が備えるクラスj(但し、j=CLASS)用バッファ2412に書き込む。
続いて、フロー別シェーパ部21は、時刻バッファ識別番号231が「TBz」となり且つクラスID236が「CLASS」となるバッファ管理レコード235のクラスキュー長233を更新する(ステップS218)。具体的には、フロー別シェーパ部21は、更新前のクラスキュー長233に対して変数PLEN(つまり、今回書き込んだ入力パケットのサイズ(バイト数))を加算した値を、更新後のキュー長233としてバッファ管理テーブル23に書き込む。
続いて、フロー別シェーパ部21は、バッファ管理テーブル23から、時刻バッファ識別番号231が「TBz」となるバッファ管理レコード235に含まれる各クラスの加算クラス238及び判定キュー長239を取得する(ステップS231)。つまり、図11に示すバッファ管理テーブル23を例にあげれば、時刻バッファ識別番号231が「TBz」となり且つクラスID236が「1」から「b」となるb個のバッファ管理レコード235の夫々の加算クラス238及び判定キュー長239を取得する。
続いて、フロー別シェーパ部21は、変数iに初期値「1」を設定する(ステップS232)。
その後、フロー別シェーパ部21は、時刻バッファ識別番号231が「TBz」となり且つクラスID236が「i」となるバッファ管理レコード235の加算クラス238に、変数CLASSが含まれているか否かを判定する(ステップS233)。
ステップS233における判定の結果、クラスID236が「i」となるバッファ管理レコード235の加算クラス238に変数CLASSが含まれていると判定される場合には(ステップS233:Yes)、フロー別シェーパ部21は、判定キュー長239を更新する(ステップS234)。具体的には、フロー別シェーパ部21は、時刻バッファ識別番号231が「TBz」となり且つクラスID236が「i」となるバッファ管理レコード235の判定キュー長239を更新する。このとき、フロー別シェーパ部21は、更新前の判定キュー長239に対して変数PLEN(つまり、今回書き込んだ入力パケットのサイズ(バイト数))を加算した値を、更新後の判定キュー長239としてバッファ管理テーブル23に書き込む。
他方で、ステップS233における判定の結果、クラスID236が「i」となるバッファ管理レコード235の加算クラス238に変数CLASSが含まれていないと判定される場合には(ステップS233:No)、フロー別シェーパ部21は、ステップS234の動作を行わなくともよい。
その後、フロー別シェーパ部21は、変数iがクラスの種類数(つまり、クラスj用バッファ2412の数)bと一致するか否か(つまり、i=bとなるか否か)を判定する(ステップS235)。
ステップS235における判定の結果、変数iがクラスの種類数bと一致しない場合には(ステップS235:No)、フロー別シェーパ部21は、変数iを1だけインクリメントした後(ステップS236)、ステップS233の動作を繰り返す。
他方で、ステップS235における判定の結果、変数iがクラスの種類数bと一致する場合には(ステップS235:Yes)、フロー別シェーパ部21は、図14に示す動作を行う。
図14に示すように、フロー別シェーパ部21は、時刻バッファ識別番号231が「TBz」となるバッファ管理レコード235のクラスキュー長233の総和が、時刻バッファ識別番号231が「TBz」となるバッファ管理レコード235のバッファ上限値232よりも大きいか否かを判定する(ステップS219)。
ステップS219における判定の結果、クラスキュー長233の総和がバッファ上限値232よりも大きいと判定される場合には(ステップS219:Yes)、フロー別シェーパ部21は、時刻バッファ(TBz)の次段以降の空きがある時刻バッファ(TBz+a(但し、aは、1≦a<nを満たす整数))241のバッファ上限値232を更新する(ステップS220)。具体的には、フロー別シェーパ部21は、時刻バッファ番号が「TBz+a」となるバッファ管理レコード235のバッファ上限値232から、クラスキュー長233の総和がバッファ上限値232を超過したバイト数だけ減算する。フロー別シェーパ部21は、減算の結果得られた値を、時刻バッファ識別番号231が「TBz+a」となるバッファ管理レコード235の更新後のバッファ上限値232としてバッファ管理テーブル23に書き込む。
加えて、ステップS219における判定の結果、クラスキュー長233の総和がバッファ上限値232よりも大きいと判定される場合には(ステップS219:Yes)、フロー別シェーパ部21は、時刻バッファ(TBz)の次段以降の空きがある時刻バッファ(TBz+a)241のクラスであって且つ予め指定されたクラスのクラス上限値237を更新する(ステップS220)。具体的には、フロー別シェーパ部21は、時刻バッファ番号が「TBz+a」となり且つ予め指定されたクラスに対応するバッファ管理レコード235のクラス上限値237から、クラスキュー長233の総和がバッファ上限値232を超過したバイト数だけ減算する。フロー別シェーパ部21は、減算の結果得られた値を、時刻バッファ識別番号231が「TBz+a」となり且つ予め指定されたクラスに対応するバッファ管理レコード235の更新後のクラス上限値237としてバッファ管理テーブル23に書き込む。
尚、ステップS220における「クラスの予めの指定」は、フロー別シェーパ部21によって任意に行われてもよいし、パケットシェーピング装置2のユーザないしはオペレータの指示によって行われてもよい。いずれにせよ、超過したバイト数を減算するクラスが予め何らかの方法によって指定されていればよい。
他方で、ステップS219における判定の結果、クラスキュー長233の総和がバッファ上限値232よりも大きくないと判定される場合には(ステップS219:No)、フロー別シェーパ部21は、ステップS220の動作を行わなくともよい。
続いて、フロー別シェーパ部21は、第1実施形態と同様の動作(具体的には、ステップS121からステップS127の動作)をクラスID227が「CLASS」となるフロー情報レコード226に対して行う。その結果、クラスID227が「CLASS」となるフロー情報レコード226を含むフロー情報テーブル22が更新される。
以上説明したように、第2実施形態のパケットシェーピング装置2によれば、第1実施形態のパケットシェーピング装置1が行う動作を、更に入力パケットのクラス毎に区別しながら行うことができる。このため、第2実施形態のパケットシェーピング装置2は、クラス毎の区別を行いながら、第1実施形態のパケットシェーピング装置1が享受する効果と同様の効果を好適に享受することができる。
例えば、遅延に対する許容度が相対的に小さいサービス(例えば、音声トラヒック)における入力パケットと、遅延に対する許容度が相対的に大きいサービス(例えば、データ通信トラヒック)における入力パケットとの双方を、夫々のサービスに対応するクラスを考慮しながら好適にシェーピングすることができる。より具体的には、例えば、音声トラヒックを優先度が高いクラス1用バッファ2412に書き込み且つデータ通信トラヒックを優先度が相対的に低いクラス2用バッファ2412に書き込むことができる。その結果、データ通信トラヒックの輻輳により音声トラヒックが遅延を被ることが殆ど或いは全くなくなる。
(2−4)変形動作例
続いて、図15から図19を参照して、第2実施形態のパケットシェーピング装置2が行う変形動作例について説明する。
(2−4−1)フロー情報テーブル及びバッファ管理テーブルのデータ構造
図15及び図16を参照して、変形動作例に用いられるフロー情報テーブル32及びバッファ管理テーブル33のデータ構造について説明する。図15は、変形動作例に用いられるフロー情報テーブル32のデータ構造を示すテーブル図である。図16は、変形動作例に用いられるバッファ管理テーブル33のデータ構造を示すテーブル図である。
図15に示すように、変形動作例に用いられるフロー情報テーブル32は、上述したフロー情報テーブル12と同様に、フローID321と、レート情報327と、入力可能上限バイト数322と、許容遅延323と、次時刻バッファ番号324と、入力可能残りバイト数325とを含むフロー情報レコード326を、フロー毎に備えている。
フローID321は、上述したフローID121と同様の情報であり、フロー情報レコード326に対応するフローを識別するための識別情報(ID)を示す。
レート情報327は、フロー情報レコード326内でのレートを識別するための識別情報(ID)を示す。尚、変形動作例では、レートとして、高レート(HIGH:ハイレート)と低レート(LOW:ローレート)の2種類を用いているが、更に多種類のレートを用いてもよい。
尚、変形動作例における「低レート」は、例えば、時刻バッファ(TBk241)に対する書き込みが最低源保証されているデータ量の入力パケットの書き込みに対応するレートを示している。他方で、変形動作例における「高レート」は、例えば、時刻バッファ(TBk241)に対する書き込みが最低源保証されているデータ量とは別の余剰分のデータ量の入力パケットの書き込みに対応するレートを示している。
入力可能上限バイト数322は、上述した入力可能上限バイト数122と同様の情報である。変形動作例では、入力可能上限バイト数322は、各時刻バッファ(TBk)241に書込可能な上限バイト数を、フロー毎且つレート毎に示す。
許容遅延323は、上述した許容遅延123と同様の情報である。
次時刻バッファ番号324は、上述した次時刻バッファ番号124と同様の情報である。
入力可能残りバイト数325は、上述した入力可能残りバイト数125と同様の情報である。変形動作例では、入力可能残りバイト数325は、次時刻バッファ番号324によって特定される一つの時刻バッファ(TBk)241に書込可能な残りのバイト数を、フロー毎に且つレート毎に示す。
図16に示すように、バッファ管理テーブル33は、時刻バッファ識別番号331と、バッファ閾値332と、キュー長333と、読出中フラグ334とを含むバッファ管理レコード335を、時刻バッファ(TBk)241毎に備えている。
時刻バッファ識別番号331は、上述した時刻バッファ識別番号131と同様の情報である。
バッファ閾値332は、上述したバッファ上限値132と同様の情報である。但し、変形動作例では、n個の時刻バッファ(TBk)241の夫々の上限サイズは、各時刻バッファ(TBk)241から所定時間T1以内に読出可能な最大のデータ量に対して所定のマージン(例えば、1パケットに相当するサイズのマージン)を加味した値に設定されていることが好ましい。バッファ閾値332は、時刻バッファ(TBk)241の上限サイズ(つまり、マージンを加味した上限サイズ)に代えて、時刻バッファ(TBk)241から所定時間T1以内に読出可能な最大のデータ量(つまり、マージンを加味しない上限サイズ)を示す。
キュー長333は、上述したキュー長133と同様の情報である。
読出中フラグ334は、上述した読出中フラグ134と同様の情報である。
(2−4−2)パケットシェーピング装置の動作
図17から図19を参照して、第2実施形態のパケットシェーピング装置2の変形動作例の流れについて説明する。図17は、第2実施形態のパケットシェーピング装置2の変形動作例の一部の流れを示すフローチャートである。図18は、第2実施形態のパケットシェーピング装置2の変形動作例の他の一部の流れを示すフローチャートである。図19は、第2実施形態のパケットシェーピング装置2の変形動作例の他の一部の流れを示すフローチャートである。
図17に示すように、フロー別シェーパ部21は、入力パケットを取得する(ステップS101)。その後、フロー別シェーパ部21は、取得した入力パケットに含まれるパケット管理情報を取得する(ステップS102)。パケット管理情報は、例えば、入力パケットのフローを識別する変数FID(フローID)や、入力パケットのサイズ(バイト数)を示す変数PLEN(Packet LENgth)等を含んでいる。
その後、フロー別シェーパ部21は、フロー情報テーブル32から、ステップS202で取得したFIDと一致するフローID321を有するフロー情報レコード326を取得する(ステップS303)。以降、第1実施形態と同様に、「変数TBx」及び「変数N」という表記を使用する。加えて、フロー情報レコード326に含まれ且つ低レートに対応する入力可能上限バイト数322を、「最低保証上限バイト数」と適宜称すると共に、「変数B1L」と表記する。同様に、フロー情報レコード326に含まれ且つ高レートに対応する入力可能上限バイト数322を、「余剰帯域上限バイト数」と適宜称すると共に「変数B1H」と表記する。同様に、フロー情報レコード326に含まれ且つ低レートに対応する入力可能残りバイト数325を、「最低保証残りバイト数」と適宜称すると共に、「変数B2L」と表記する。同様に、フロー情報レコード326に含まれ且つ高レートに対応する入力可能残りバイト数325を、「余剰帯域残りバイト数」と適宜称すると共に「変数B2H」と表記する。
ステップS303の動作に続いて、相前後して又は並行して、フロー別シェーパ部21は、バッファ管理テーブル33から、バッファ管理レコード335を取得する(ステップS104)。例えば、フロー別シェーパ部21は、読出中フラグ334を取得することで、現在読出中の時刻バッファ(TBk)241を認識する。以降、第1実施形態と同様に、「変数TBy」という表記を使用する。
続いて、フロー別シェーパ部21は、第1実施形態と同様の動作(具体的には、ステップS105からステップS112の動作)を行うことで、ステップS101で取得した入力パケットを書き込むべき候補となる時刻バッファ(TBz)241を設定する。その後、フロー別シェーパ部21は、図18に示す動作を行う。
図18に示すように、フロー別シェーパ部21は、入力パケットを書き込むべき候補となる時刻バッファ(TBz)241の読出時間と、現在読出中の時刻バッファ(TBy)241の読出時間との間の差分が、変数N(つまり、許容遅延323)よりも大きいか否かを判定する(ステップS115)。
ステップS115における判定の結果、TBz−TBy(つまり、遅延時間)が変数Nよりも大きいと判定される場合には(ステップS115:Yes)、フロー別シェーパ部21は、ステップS101で取得した入力パケットを廃棄する(ステップS116)。その後、パケットシェーピング装置2は、動作を終了してもよいし、図17のステップS101以降の動作を再度繰り返してもよい。
他方で、ステップS115における判定の結果、TBz−TBy(つまり、遅延時間)が変数Nよりも大きくないと判定される場合には(ステップS115:No)、フロー別シェーパ21は、時刻バッファ識別番号331が「TBz」となるバッファ管理レコード335のキュー長333が、時刻バッファ識別番号331が「TBz」となるバッファ管理レコード335のバッファ閾値332よりも大きいか否かを判定する(ステップS311)。つまり、フロー別シェーパ部21は、入力パケットを書き込むべき候補となる時刻バッファ(TBz)241に空きがあるか否かを判定する。
ステップS311における判定の結果、キュー長333がバッファ閾値332よりも大きくないと判定される場合には(ステップS311:No)、フロー別シェーパ21は、時刻バッファ識別番号331が「TBz」となるバッファ管理レコード335のキュー長333に変数PLENを加算した値が、時刻バッファ識別番号331が「TBz」となるバッファ管理レコード335のバッファ閾値332よりも大きいか否かを判定する(ステップS312)。つまり、フロー別シェーパ部21は、入力パケットを書き込むべき候補となる時刻バッファ(TBz)241に、PLENのサイズを有する入力パケットを書き込むだけの空きがあるか否かを判定する。
ステップS312における判定の結果、キュー長333に変数PLENを加算した値がバッファ閾値332よりも大きくないと判定される場合には(ステップS312:No)、フロー別シェーパ部21は、補正値を示す変数amdに「0」を設定する(ステップS313)。尚、変形動作例における「変数amd」は、例えば、時刻バッファ(TBk)241のマージンを考慮しない上限値(具体的には、所定時間T1以内に読出可能な最大のデータ量)を超えて入力パケットを書き込む場合の超過量に相当する。ステップS313の動作が行われる場合は、入力パケットを書き込んだ後であってもキュー長333(つまり、更新前のキュー長333+PLEN)がバッファ閾値332を超えることがない。このため、変数amdは「0」となる。
他方で、ステップS312における判定の結果、キュー長333に変数PLENを加算した値がバッファ閾値332よりも大きいと判定される場合には(ステップS312:No)、フロー別シェーパ部21は、変数amdに「時刻バッファ識別番号331が「TBz」となるバッファ管理レコード335のキュー長333+PLEN−時刻バッファ識別番号331が「TBz」となるバッファ管理レコード335のバッファ閾値332」を設定する(ステップS314)。具体的には、ステップS313の動作が行われる場合は、入力パケットを書き込んだ後に、キュー長333(つまり、更新前のキュー長333+PLEN)がバッファ閾値332を超える。このため、変数amdは「バッファ閾値332を超えて書き込まれた一部の入力パケットのサイズ(つまり、更新前のキュー長+PLEN−バッファ閾値)」となる。
他方で、ステップS311における判定の結果、キュー長333がバッファ閾値332よりも大きいと判定される場合には(ステップS311:Yes)、フロー別シェーパ21は、変数B2Lが0よりも大きいか否かを判定する(ステップS315)。つまり、フロー別シェーパ部21は、最低限の書き込みが保証されているデータ量の入力パケットが、時刻バッファ(TBz)241に既に書き込まれているか否かを判定する。
ステップS315における判定の結果、変数B2Lが0よりも大きくないと判定される場合には(ステップS315:No)、時刻バッファ(TBz)241には、最低限の書き込みが保証されているだけのデータ量以上の入力パケットが既に書き込まれていると想定される。従って、フロー別シェーパ部21は、TBz(言い換えれば、z)を1だけインクリメントした後(ステップS316)、ステップS115の動作を繰り返す。つまり、フロー別シェーパ部11は、最低限の書き込みが保証されているだけのデータ量以上の入力パケットが既に書き込まれていると判定された時刻バッファ(TBz)241の次段の時刻バッファ(TBz+1)241を新たな時刻バッファ(TBz)241に設定した上で、ステップS115の動作を繰り返す。尚、フロー別シェーパ部21は、TBzを1だけインクリメントすると共に、変数B2Lに変数B1Lを設定し、且つ変数B2Hに変数B1Hを設定する(ステップS316)。つまり、フロー別シェーパ部21は、旧変数B1Lを新変数B2Lに設定し、且つ旧変数B1Hを新変数B2Hに設定する。
他方で、ステップS315における判定の結果、変数B2Lが0よりも大きいと判定される場合には(ステップS315:No)、時刻バッファ(TBz)241には、最低限の書き込みが保証されているだけのデータ量未満の入力パケットしか書き込まれていないと想定される。従って、この場合には、時刻バッファ(TBz)241に対して入力パケットを書き込むと判定される。従って、フロー別シェーパ部21は、変数amdに、今回書き込む入力パケットのサイズ「PLEN」を設定する(ステップS317)。但し、この場合、時刻バッファ(TBz)241には、余剰分の入力パケットを書き込む領域がないものとして扱われることが好ましい。従って、フロー別シェーパ部21は、変数B2Hに「0」
を設定する(ステップS317)。
その後、フロー別シェーパ部21は、ステップS101で取得した入力パケットを、時刻バッファ(TBz)241に書き込む(ステップS117)。
続いて、フロー別シェーパ部21は、時刻バッファ識別番号331が「TBz」となるバッファ管理レコード335のキュー長333を更新する(ステップS118)。具体的には、フロー別シェーパ部21は、更新前のキュー長333に対して変数PLEN(つまり、今回書き込んだ入力パケットのサイズ(バイト数))を加算した値を、更新後のキュー長333としてバッファ管理テーブル33に書き込む。
加えて、フロー別シェーパ部21は、時刻バッファ(TBz)241の次段以降の空きがある時刻バッファ(TBz+a)241のバッファ閾値332を更新する(ステップS320)。具体的には、フロー別シェーパ部21は、時刻バッファ識別番号331が「TBz+a」となるバッファ管理レコード335のバッファ閾値332から、補正値を示す変数amdだけ減算する。フロー別シェーパ部21は、減算の結果得られた値を、時刻バッファ識別番号331が「TBz+a」となるバッファ管理レコード335の更新後のバッファ閾値332としてバッファ管理テーブル33に書き込む。
尚、時刻バッファ識別番号331が「TBz+a」となるバッファ管理レコード335の更新後のバッファ閾値332が、更新前のバッファ閾値332と比較して著しく小さくなる場合(例えば、更新後のバッファ閾値332/更新前のバッファ閾値332<0.5となる場合)には、以下の動作が行われてもよい。例えば、フロー別シェーパ部21は、時刻バッファ識別番号331が「TBz+a」となるバッファ管理レコード335のバッファ閾値332から変数amdのうちの一部だけを減算し、時刻バッファ識別番号331が「TBz+a+1」となる(つまり、更に次段の)バッファ管理レコード335のバッファ閾値332から変数amdのうちの他の一部をを減算してもよい。
その後、フロー別シェーパ部21は、図19に示す動作を行うことで、フロー情報テーブル32の更新動作(ステップS321からステップS335)を行う。具体的には、フロー別シェーパ部21は、変数B2L(つまり、入力可能残りバイト数325)が変数PLEN(つまり、今回書き込んだ入力パケットのサイズ(バイト数))よりも大きいか否かを判定する(ステップS321)。
ステップS321における判定の結果、変数B2Lが変数PLENよりも大きいと判定される場合には(ステップS321:Yes)、フロー別シェーパ部21は、変数B2L(つまり、入力可能残りバイト数325)を更新する(ステップS322)。具体的には、フロー別シェーパ部21は、変数B2Lから変数PLENを減算した値を、更新後の変数B2L(つまり、更新後の入力可能残りバイト数325)としてフロー情報テーブル32に書き込む。その後、パケットシェーピング装置2は、動作を終了してもよいし、図17のステップS101以降の動作を再度繰り返してもよい。
他方で、ステップS321における判定の結果、変数B2Lが変数PLENよりも大きくないと判定される場合には(ステップS321:No)、フロー別シェーパ部21は、変数PLEN及び変数B2Lを更新する(ステップS323)。具体的には、フロー別シェーパ部21は、変数PLENから更新前の変数B2Lを減算した値を、更新後の変数PLENとする。加えて、フロー別シェーパ部21は、「0」を、更新後の変数B2Lとしてフロー情報テーブル32に書き込む。
続いて、フロー別シェーパ部21は、変数B2H(つまり、入力可能残りバイト数325)が変数PLEN(つまり、今回書き込んだ入力パケットのサイズ(バイト数))よりも大きいか否かを判定する(ステップS331)。
ステップS331における判定の結果、変数B2Hが変数PLENよりも大きいと判定される場合には(ステップS331:Yes)、フロー別シェーパ部21は、変数B2H(つまり、入力可能残りバイト数325)を更新する(ステップS332)。具体的には、フロー別シェーパ部21は、変数B2Hから変数PLENを減算した値を、更新後の変数B2H(つまり、更新後の入力可能残りバイト数325)としてフロー情報テーブル32に書き込む。その後、パケットシェーピング装置2は、動作を終了してもよいし、図17のステップS101以降の動作を再度繰り返してもよい。
他方で、ステップS331における判定の結果、変数B2Hが変数PLENよりも大きくないと判定される場合には(ステップS331:No)、フロー別シェーパ部21は、変数TBx(つまり、次時刻バッファ番号324)、変数PLEN及び変数B2Lを更新する(ステップS324)。具体的には、フロー別シェーパ部21は、変数TBx(言い換えれば、x)を1だけインクリメントした値を、更新後の次時刻バッファ番号324としてフロー情報テーブル32に書き込む。つまり、フロー別シェーパ部31は、時刻バッファ(TBx)241の次段の時刻バッファ(TBx+1)241を、新たな時刻バッファ(TBx)241として取り扱う。加えて、フロー別シェーパ部21は、変数PLENから更新前の変数B2Hを減算した値を、更新後の変数PLENとする。加えて、フロー別シェーパ部21は、変数B1Lを、更新後の変数B2Lとしてフロー情報テーブル32に書き込む。
続いて、フロー別シェーパ部21は、時刻バッファ識別番号331が「TBx」となるバッファ管理レコード335のキュー長333が、時刻バッファ識別番号331が「TBx」となるバッファ管理レコード335のバッファ閾値332よりも大きいか否かを判定する(ステップS333)。つまり、フロー別シェーパ部21は、更新後の時刻バッファ(TBx)241(つまり、入力パケットを書き込むべき候補となる新たな時刻バッファ(TBz)241)に空きがあるか否かを判定する。
ステップS333における判定の結果、キュー長333がバッファ閾値332よりも大きいと判定される場合には(ステップS333:Yes)、余剰帯域のこれ以上の書き込みを行う余裕がないと想定される。従って、フロー別シェーパ部21は、変数B2H(つまり、入力可能残りバイト数325)を更新する(ステップS334)。具体的には、フロー別シェーパ部21は、「0」を、更新後の変数B2Hとしてフロー情報テーブル32に書き込む。その後、フロー別シェーパ部21は、ステップS321以降の動作を繰り返す。
他方で、ステップS333における判定の結果、キュー長333がバッファ閾値332よりも大きくないと判定される場合には(ステップS311:No)、フロー別シェーパ部21は、変数B2H(つまり、入力可能残りバイト数325)を更新する(ステップS335)。具体的には、フロー別シェーパ部21は、変数B1Hを、更新後の変数B2Hとしてフロー情報テーブル32に書き込む。その後、フロー別シェーパ部21は、ステップS321以降の動作を繰り返す。
以上説明したように、変形動作例によれば、第1実施形態のパケットシェーピング装置1が享受する効果と同様の効果を好適に享受することができる。
加えて、変形動作例によれば、同一優先度(同一クラス)のトラヒックにおいて、複数レートのサービス(例えば、最低帯域保証サービスや最大帯域制限サービス等)をサポートすることができる。具体的には、例えば、キュー長333が本来の上限値(つまり、バッファ閾値332)に達している場合であっても、最低保証分の入力パケットは、時刻バッファ(TBz)241に書き込むことができる。このため、輻輳が発生している場合であっても、最低帯域を保証することができる。一方で、輻輳が発生していない場合には、各フローは最低保証分の入力パケットに加えて余剰帯域分の入力パケットを書き込むことができるため、入力パケットの送信レートを増大させることができる。
尚、変形動作例は、第1実施形態のパケットシェーピング装置1によって行われてもよい。この場合も、上述した各種効果を享受することができる。
以上説明した実施形態に関して、更に以下の付記を開示する。
(付記1)
所定時間内に読出可能なデータ量を書込可能な上限サイズとする複数のバッファであって、読出処理が行われる一のバッファが前記所定時間毎に順次切り替えられる複数のバッファと、
(i)入力データを書き込むべきバッファを、当該入力データのフロー毎に特定する特定情報、(ii)前記複数のバッファの夫々に書込可能な最大のデータ量を前記フロー毎に示す最大量情報及び(ii)前記特定情報により特定されるバッファに書込可能な残りのデータ量を前記フロー毎に示す残量情報を含むフロー情報テーブルと、
前記入力データを、当該入力データのフロー毎に、前記複数のバッファのうちの前記特定情報により特定されるバッファに書き込むシェーパと
を備え、
前記シェーパは、前記フロー毎に、(i)前記残量情報を、前記入力データを書き込む前の前記残量情報から新たに書き込んだ前記入力データのデータ量を減算した値に更新し、(ii)更新後の前記残量情報が負の値になる場合には、前記特定情報を前記特定情報により特定されるバッファの次段以降の他のバッファを特定する情報に更新する動作及び前記特定情報の更新の都度前記最大量情報を前記残量情報に加算する動作の夫々を、前記残量情報が正の値になるまで繰り返すことを特徴とするシェーピング装置。
(付記2)
前記複数のバッファの夫々毎に、(i)各バッファの上限サイズを示す上限情報及び(ii)各バッファに既に書き込まれているデータの総量を示すキュー長情報を含むバッファ管理テーブルを更に備え、
前記シェーパは、前記入力データを書き込む前の前記キュー長情報が前記上限情報を超えていない場合に、前記入力データを前記特定情報により特定されるバッファに書込可能であると判定し、
前記シェーパは、前記フロー毎に、(i)前記入力データを前記特定情報により特定されるバッファに書込可能な場合には、前記入力データを前記特定情報により特定されるバッファに書き込み、(ii)前記入力データを前記特定情報により特定されるバッファに書込可能でない場合には、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する書込可能な他のバッファに書き込むことを特徴とする付記1に記載のシェーピング装置。
(付記3)
前記シェーパは、前記入力データを書き込んだ後の前記キュー長情報が前記上限情報を超えている場合には、前記入力データを前記特定情報により特定されるバッファに書き込むと共に、前記特定情報により特定されるバッファの次段以降に位置する他のバッファの前記上限情報を、前記他のバッファの上限サイズから前記キュー長情報が前記上限情報を超えている分のデータ量を減算した値に更新することを特徴とする付記2に記載のシェーピング装置。
(付記4)
前記複数のバッファの夫々は、前記上限サイズに対して所定のマージンを持ったサイズを有することを特徴とする付記3に記載のシェーピング装置。
(付記5)
前記シェーパは、前記入力データを、現在読出処理が行われているバッファを基準として許容遅延時間以上経過した後に読出処理が行われるバッファに書き込むべきであると判定される場合には、前記入力データを廃棄することを特徴とする付記1から4のいずれか一項に記載のシェーピング装置。
(付記6)
前記フロー情報テーブルは、前記許容遅延時間を前記フロー毎に示す遅延時間情報を更に含むことを特徴とする付記5に記載のシェーピング装置。
(付記7)
前記シェーパは、前記特定情報により特定されるバッファが、読出処理が行われているバッファである場合に、前記入力データを前記特定情報により特定されるバッファに書き込むことを特徴とする付記1から6のいずれか一項に記載のシェーピング装置。
(付記8)
前記シェーパは、前記特定情報により特定されるバッファが、読出処理が行われているバッファである場合に、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する他のバッファに書き込むことを特徴とする付記1から6のいずれか一項に記載のシェーピング装置。
(付記9)
前記複数のバッファの少なくとも一つは、複数種類の優先度に夫々対応する複数の優先度バッファ部を備えており、
前記フロー情報テーブルは、(i)前記入力データを書き込むべきバッファを、前記フロー毎及び前記優先度毎に特定する前記特定情報、(ii)前記複数のバッファの夫々に書込可能な最大のデータ量を前記フロー毎及び前記優先度毎に示す前記最大量情報及び(iii)前記特定情報により特定されるバッファに書込可能な残りのデータ量を前記フロー毎及び前記優先度毎に示す前記残量情報を含み、
前記シェーパは、前記入力データを、当該入力データのフロー毎及び優先度毎に、前記複数のバッファのうちの前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書き込み、
前記シェーパは、前記フロー毎及び前記優先度毎に、(i)前記残量情報を、前記入力データを書き込む前の前記残量情報から新たに書き込んだ前記入力データのデータ量を減算した値に更新し、(ii)更新後の前記残量情報が負の値になる場合には、前記特定情報を前記特定情報により特定されるバッファの次段以降の他のバッファを特定する情報に更新する動作及び前記特定情報の更新の都度前記最大量情報を前記残量情報に加算する動作の夫々を、前記残量情報が正の値になるまで繰り返すことを特徴とする付記1から8のいずれか一項に記載のシェーピング装置。
(付記10)
前記複数のバッファの夫々毎に、(i)各バッファの上限サイズを前記優先度毎に示す上限情報及び(ii)各バッファに既に書き込まれているデータの総量を前記優先度毎に示すキュー長情報を含むバッファ管理テーブルを更に備え、
前記シェーパは、前記入力データを書き込む前の前記キュー長情報が前記上限情報を超えていない場合に、前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に前記入力データを書込可能であると判定し、
前記シェーパは、前記フロー毎及び前記優先度毎に、(i)前記入力データを前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書込可能な場合には、前記入力データを前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書き込み、(ii)前記入力データを前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書込可能でない場合には、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する書込可能な他のバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書き込むことを特徴とする付記9に記載のシェーピング装置。
(付記11)
前記複数のバッファの少なくとも一つは、前記所定時間内に読出可能なデータ量に所定のマージン量を加えたデータ量を書込可能な上限サイズとし、
前記フロー情報テーブルは、前記最大量情報及び前記残量情報を、前記複数のバッファの夫々に書込可能なデータ量として最低限保証される最低保証レベル及び前記複数のバッファの夫々に書込可能なデータ量として余剰に確保される余剰帯域レベルの夫々に対応付けて含んでおり、
前記複数のバッファの夫々毎に、(i)各バッファから前記所定時間内に読出可能なデータ量を示す閾値情報及び(ii)各バッファに既に書き込まれているデータの総量を示すキュー長情報を含むバッファ管理テーブルを更に備え、
前記シェーパは、(i)前記入力データを書き込む前の前記キュー長情報が前記閾値情報を超えていないか、又は(ii)前記入力データを書き込む前の前記キュー長情報が前記閾値情報を超えており且つ前記最低保証レベルに対応する前記残量情報が正の値を有する場合に、前記特定情報により特定されるバッファに前記入力データを書込可能であると判定し、
前記シェーパは、前記入力データを書き込む前の前記キュー長情報が前記閾値情報を超えており且つ前記最低保証レベルに対応する前記残量情報が負の値を有する場合に、前記特定情報により特定されるバッファに前記入力データを書込可能でないと判定し、
前記シェーパは、前記フロー毎に、(i)前記入力データを前記特定情報により特定されるバッファに書込可能な場合には、前記入力データを前記特定情報により特定されるバッファに書き込み、(ii)前記入力データを前記特定情報により特定されるバッファに書込可能でない場合には、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する書込可能な他のバッファに書き込むことを特徴とする付記10に記載のシェーピング装置。
(付記12)
前記シェーパは、前記特定情報により特定されるバッファに前記入力データを書込可能であると判定され且つ前記入力データを書き込んだ後の前記キュー長情報が前記閾値情報を超えている場合には、前記特定情報により特定されるバッファの次段以降に位置する他のバッファの前記閾値情報を、前記他のバッファの前記閾値情報から前記キュー長情報が前記閾値情報を超えている分のデータ量を減算した値に更新することを特徴とする付記11に記載のシェーピング装置。
(付記13)
前記シェーパは、前記特定情報により特定されるバッファに前記入力データを書込可能でない場合には、(i)前記余剰帯域レベルに対応する前記残量情報を、前記余剰帯域レベルに対応する前記最大量情報に更新し、且つ(ii)前記最低保証レベルに対応する前記残量情報を、前記最低保証レベルに対応する前記最大量情報に更新することを特徴とする付記11又は12に記載のシェーピング装置。
(付記14)
所定時間内に読出可能なデータ量を書込可能な上限サイズとする複数のバッファであって、読出処理が行われる一のバッファが前記所定時間毎に順次切り替えられる複数のバッファと、
(i)入力データを書き込むべきバッファを、当該入力データのフロー毎に特定する特定情報、(ii)前記複数のバッファの夫々に書込可能な最大のデータ量を前記フロー毎に示す最大量情報及び(ii)前記特定情報により特定されるバッファに書込可能な残りのデータ量を前記フロー毎に示す残量情報を含むフロー情報テーブルと
を備えるシェーピング装置におけるシェーピング方法であって、
前記入力データを、当該入力データのフロー毎に、前記複数のバッファのうちの前記特定情報により特定されるバッファに書き込む書込工程と、
前記フロー毎に、(i)前記残量情報を、前記入力データを書き込む前の前記残量情報から新たに書き込んだ前記入力データのデータ量を減算した値に更新し、(ii)更新後の前記残量情報が負の値になる場合には、前記特定情報を前記特定情報により特定されるバッファの次段以降の他のバッファを特定する情報に更新する動作及び前記特定情報の更新の都度前記最大量情報を前記残量情報に加算する動作の夫々を、前記残量情報が正の値になるまで繰り返す更新工程と
を備えることを特徴とするシェーピング方法。
本発明は、上述した実施形態に限られるものではなく、請求の範囲及び明細書全体から読み取れる発明の要旨或いは思想に反しない範囲で適宜変更可能であり、そのような変更を伴なうシェーピング装置及び方法もまた本発明の技術的範囲に含まれるものである。