(57)【特許請求の範囲】
【請求項１】
所定時間内に読出可能なデータ量を書込可能な上限サイズとする複数のバッファであって、読出処理が行われる一のバッファが前記所定時間毎に順次切り替えられる複数のバッファと、
(i)入力データを書き込むべきバッファを、当該入力データのフロー毎に特定する特定情報、(ii)前記複数のバッファの夫々に書込可能な最大のデータ量を前記フロー毎に示す最大量情報及び(ii)前記特定情報により特定されるバッファに書込可能な残りのデータ量を前記フロー毎に示す残量情報を含むフロー情報テーブルと、
前記入力データを、当該入力データのフロー毎に、前記複数のバッファのうちの前記特定情報により特定されるバッファに書き込むシェーパと
を備え、
前記シェーパは、前記フロー毎に、(i)前記残量情報を、前記入力データを書き込む前の前記残量情報から新たに書き込んだ前記入力データのデータ量を減算した値に更新し、(ii)更新後の前記残量情報が負の値になる場合には、前記特定情報を前記特定情報により特定されるバッファの次段以降の他のバッファを特定する情報に更新する動作及び前記特定情報の更新の都度前記最大量情報を前記残量情報に加算する動作の夫々を、前記残量情報が正の値になるまで繰り返すことを特徴とするシェーピング装置。
【請求項２】
前記複数のバッファの夫々毎に、(i)各バッファの上限サイズを示す上限情報及び(ii)各バッファに既に書き込まれているデータの総量を示すキュー長情報を含むバッファ管理テーブルを更に備え、
前記シェーパは、前記入力データを書き込む前の前記キュー長情報が前記上限情報を超えていない場合に、前記入力データを前記特定情報により特定されるバッファに書込可能であると判定し、
前記シェーパは、前記フロー毎に、(i)前記入力データを前記特定情報により特定されるバッファに書込可能な場合には、前記入力データを前記特定情報により特定されるバッファに書き込み、(ii)前記入力データを前記特定情報により特定されるバッファに書込可能でない場合には、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する書込可能な他のバッファに書き込むことを特徴とする請求項１に記載のシェーピング装置。
【請求項３】
前記シェーパは、前記入力データを書き込んだ後の前記キュー長情報が前記上限情報を超えている場合には、前記入力データを前記特定情報により特定されるバッファに書き込むと共に、前記特定情報により特定されるバッファの次段以降に位置する他のバッファの前記上限情報を、前記他のバッファの上限サイズから前記キュー長情報が前記上限情報を超えている分のデータ量を減算した値に更新することを特徴とする請求項２に記載のシェーピング装置。
【請求項４】
前記シェーパは、前記入力データを、現在読出処理が行われているバッファを基準として許容遅延時間以上経過した後に読出処理が行われるバッファに書き込むべきであると判定される場合には、前記入力データを廃棄することを特徴とする請求項１から３のいずれか一項に記載のシェーピング装置。
【請求項５】
前記シェーパは、前記特定情報により特定されるバッファが、読出処理が行われているバッファである場合に、前記入力データを前記特定情報により特定されるバッファに書き込むことを特徴とする請求項１から４のいずれか一項に記載のシェーピング装置。
【請求項６】
前記シェーパは、前記特定情報により特定されるバッファが、読出処理が行われているバッファである場合に、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する他のバッファに書き込むことを特徴とする請求項１から４のいずれか一項に記載のシェーピング装置。
【請求項７】
前記複数のバッファの少なくとも一つは、複数種類の優先度に夫々対応する複数の優先度バッファ部を備えており、
前記フロー情報テーブルは、(i)前記入力データを書き込むべきバッファを、前記フロー毎及び前記優先度毎に特定する前記特定情報、(ii)前記複数のバッファの夫々に書込可能な最大のデータ量を前記フロー毎及び前記優先度毎に示す前記最大量情報及び(iii)前記特定情報により特定されるバッファに書込可能な残りのデータ量を前記フロー毎及び前記優先度毎に示す前記残量情報を含み、
前記シェーパは、前記入力データを、前記フロー毎及び前記優先度毎に、前記複数のバッファのうちの前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書き込み、
前記シェーパは、前記フロー毎及び前記優先度毎に、(i)前記残量情報を、前記入力データを書き込む前の前記残量情報から新たに書き込んだ前記入力データのデータ量を減算した値に更新し、(ii)更新後の前記残量情報が負の値になる場合には、前記特定情報を前記特定情報により特定されるバッファの次段以降の他のバッファを特定する情報に更新する動作及び前記特定情報の更新の都度前記最大量情報を前記残量情報に加算する動作の夫々を、前記残量情報が正の値になるまで繰り返すことを特徴とする請求項１から６のいずれか一項に記載のシェーピング装置。
【請求項８】
前記複数のバッファの夫々毎に、(i)各バッファの上限サイズを前記優先度毎に示す上限情報及び(ii)各バッファに既に書き込まれているデータの総量を前記優先度毎に示すキュー長情報を含むバッファ管理テーブルを更に備え、
前記シェーパは、前記入力データを書き込む前の前記キュー長情報が前記上限情報を超えていない場合に、前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に前記入力データを書込可能であると判定し、
前記シェーパは、前記フロー毎及び前記優先度毎に、(i)前記入力データを前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書込可能な場合には、前記入力データを前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書き込み、(ii)前記入力データを前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書込可能でない場合には、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する書込可能な他のバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書き込むことを特徴とする請求項７に記載のシェーピング装置。
【請求項９】
前記複数のバッファの少なくとも一つは、前記所定時間内に読出可能なデータ量に所定のマージン量を加えたデータ量を書込可能な上限サイズとし、
前記フロー情報テーブルは、前記最大量情報及び前記残量情報を、前記複数のバッファの夫々に書込可能なデータ量として最低限保証される最低保証レベル及び前記複数のバッファの夫々に書込可能なデータ量として余剰に確保される余剰帯域レベルの夫々に対応付けて含んでおり、
前記複数のバッファの夫々毎に、(i)各バッファから前記所定時間内に読出可能なデータ量を示す閾値情報及び(ii)各バッファに既に書き込まれているデータの総量を示すキュー長情報を含むバッファ管理テーブルを更に備え、
前記シェーパは、(i)前記入力データを書き込む前の前記キュー長情報が前記閾値情報を超えていないか、又は(ii)前記入力データを書き込む前の前記キュー長情報が前記閾値情報を超えており且つ前記最低保証レベルに対応する前記残量情報が正の値を有する場合に、前記特定情報により特定されるバッファに前記入力データを書込可能であると判定し、
前記シェーパは、前記入力データを書き込む前の前記キュー長情報が前記閾値情報を超えており且つ前記最低保証レベルに対応する前記残量情報が負の値を有する場合に、前記特定情報により特定されるバッファに前記入力データを書込可能でないと判定し、
前記シェーパは、前記フロー毎に、(i)前記入力データを前記特定情報により特定されるバッファに書込可能な場合には、前記入力データを前記特定情報により特定されるバッファに書き込み、(ii)前記入力データを前記特定情報により特定されるバッファに書込可能でない場合には、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する書込可能な他のバッファに書き込むことを特徴とする請求項８に記載のシェーピング装置。
【請求項１０】
所定時間内に読出可能なデータ量を書込可能な上限サイズとする複数のバッファであって、読出処理が行われる一のバッファが前記所定時間毎に順次切り替えられる複数のバッファと、
(i)入力データを書き込むべきバッファを、当該入力データのフロー毎に特定する特定情報、(ii)前記複数のバッファの夫々に書込可能な最大のデータ量を前記フロー毎に示す最大量情報及び(ii)前記特定情報により特定されるバッファに書込可能な残りのデータ量を前記フロー毎に示す残量情報を含むフロー情報テーブルと
を備えるシェーピング装置におけるシェーピング方法であって、
前記入力データを、当該入力データのフロー毎に、前記複数のバッファのうちの前記特定情報により特定されるバッファに書き込む書込工程と、
前記フロー毎に、(i)前記残量情報を、前記入力データを書き込む前の前記残量情報から新たに書き込んだ前記入力データのデータ量を減算した値に更新し、(ii)更新後の前記残量情報が負の値になる場合には、前記特定情報を前記特定情報により特定されるバッファの次段以降の他のバッファを特定する情報に更新する動作及び前記特定情報の更新の都度前記最大量情報を前記残量情報に加算する動作の夫々を、前記残量情報が正の値になるまで繰り返す更新工程と
を備えることを特徴とするシェーピング方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えばパケット等のデータのシェーピングを行うシェーピング装置及び方法に関する。
【背景技術】
【０００２】
イントラネットやインターネット等の普及により、ネットワークのトラフィックは著しく増加している。従って、多種多量のデータを効率的に転送する能力が重要になっている。多種多量のデータを効率的に転送するための技術として、送信要求されたパケット（或いは、その他の各種データ）を指定された帯域（レート）に制限し且つ平滑化してパケットを出力するシェーピング装置が用いられている。
【０００３】
例えば、シェーピング装置としては、シェーピング装置からパケットを出力する際にスケジューリング（つまり、帯域制限）を行う出力スケジューリング型のシェーピング装置が提案されている。出力スケジューリング型のシェーピング装置の一例として、トークンバケツモデルを用いたトラヒックシェーピング装置があげられる。トークンバケツモデルでは、所望の帯域に合わせたレートでトークンがトークンバケツに蓄積されていく。バッファに書き込まれたパケットの読出要求があった場合には、読出要求されたパケットのサイズと現在のトークンバケツに蓄積されているトークン量とが比較される。トークン量が読出要求されたパケットのサイズよりも少ない場合には、トークン量が読出要求されたパケットのサイズ以上になるまでパケットは読み出されない。一方、トークン量が読出要求されたパケットのサイズ以上であれば、パケットが読み出されると共にトークンバケツに蓄積されているトークンからパケットのサイズ分のトークンが削除される。
【０００４】
出力スケジューリング型のシェーピング装置では、一度に複数のバッファからパケットの読出要求があった場合には、所定の規則（例えば、ラウンドロビンや完全優先制御等）に従って、読出処理が実際に行われるバッファが一つずつ順次選択される。読出処理が行われるタイミングが遅れたバッファでは、読出処理を待つ間もトークンが蓄積されるため、読出処理が行われるタイミングの遅れを後で挽回することができる。しかしながら、あまりに多数のバッファから同時に読出要求があった場合には、読出処理を待つ間に蓄積されるトークンがトークンバケツのサイズを超えてしまいかねない。従って、トークンの蓄積を継続することができずに、結果としてスループットの低下を引き起こしてしまう。
【０００５】
そこで、シェーピング装置にパケットが入力される際にスケジューリングを行う入力スケジューリング型のシェーピング装置が提案されている（例えば、特許文献１参照）。例えば、入力スケジューリング型のシェーピング装置は、入力されるパケットを格納するバッファ部と、固定サイズ（具体的には、イーサネット（登録商標）の最小パケット長である６４バイト）のタイムスロットで刻まれるタイムテーブルとを備えている。シェーピング装置は、前回のパケット出力終了時間と所望の送信レートに基づいて、新たな入力パケットの理想出力終了時間を算出すると共に、前回のパケット出力終了時間の次のタイムスロットに新たな入力パケットをエントリする。パケットをエントリするタイムスロットの間隔を調整することにより、適切なシェーピングが実現される。例えば、ある一つのフローに着目した場合、サイズの大きいパケットが到着すると次に到着したパケットはより後ろのタイムスロットにエントリされ、サイズの小さいパケットが到着すると次に到着したパケットはより近くのタイムスロットにエントリされる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００６−１９７２３５号公報
【特許文献２】特開２００１−２０３７０２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、上述した入力スケジューリング型のシェーピング装置では、タイムテーブル上のタイムスロットの単位が最小パケット長（６４バイト）に固定されている。従って、ネットワークの伝送容量によっては、膨大な数のタイムスロットを用意する必要がある。例えば、１Ｇｂｐｓの伝送容量を有するネットワーク上で５０ミリ秒の時間幅のタイムテーブルを用意するためには、約１０万個のタイムスロットを用意する必要がある。約１０万個のタイムスロットをＲＡＭ等で実現しようとすると、１０万個（１００ｋ個）のアドレスが必要になるため、非常に大規模な実装が必要になってしまう。
【０００８】
加えて、タイムスロットの単位が最小パケット長（６４バイト）に固定されているため、例えば入力パケットのサイズによっては、スループットの低下を引き起こしてしまいかねない。例えば、６５バイトの入力パケットが入力された場合には、当該入力パケットは２つのタイムスロットにエントリされると共に、次に入力される入力パケットは当該２つのタイムスロットの次のタイムスロットにエントリされる。従って、１２８バイトのタイムスロットに対して６５バイトの入力パケットがエントリされることになるため、スループットの低下を引き起こしてしまう。
【０００９】
このように、上述した入力スケジューリング型のシェーピング装置では、必ずしも効率的なシェーピングを行うことができるとは言い難い。
【００１０】
本発明が解決しようとする課題には上記のようなものが一例として挙げられる。本発明は、例えば効率的なシェーピングを行うことが可能なシェーピング装置及びシェーピング方法を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記課題は、複数のバッファと、フロー情報テーブルと、シェーパとを備えるシェーピング装置によって解決され得る。複数のバッファは、所定時間内に読出可能なデータ量を、書込可能な上限サイズとしている。複数のバッファに書き込まれた入力データを読み出す際には、読出処理が行われる一のバッファが所定時間毎に順次切り替えられる。フロー情報テーブルは、特定情報と、最大量情報と、残量情報とを含む。特定情報は、入力データを書き込むべきバッファを、当該入力データのフロー毎に特定する。最大量情報は、特定情報により特定されるバッファに書込可能な最大のデータ量を、フロー毎に示す。残量情報は、特定情報により特定されるバッファに書込可能な残りのデータ量を、フロー毎に示す。シェーパは、入力データを、当該入力データのフロー毎に、複数のバッファのうちの特定情報により特定されるバッファに書き込む。更に、シェーパは、フロー毎に、残量情報を、入力データを書き込む前の残量情報から新たに書き込んだ入力データのデータ量を減算した値に更新する。加えて、シェーパは、更新後の残量情報が負の値になる場合には、特定情報を特定情報により特定されるバッファの次段以降の他のバッファを特定する情報に更新する動作及び特定情報を更新する動作を行う都度、最大量情報を残量情報に加算する動作の夫々を、残量情報が正の値になるまで繰り返す。
【００１２】
上記課題は、上述した複数のバッファと上述したフロー情報テーブルとを備えるシェーピング装置におけるシェーピング方法であって、書込工程と、更新工程とを備えるシェーピング方法によって解決され得る。書込工程では、複数のバッファのうちの特定情報により特定されるバッファに、入力データが書き込まれる。更新工程では、フロー毎に、残量情報が、入力データを書き込む前の残量情報から新たに書き込んだ入力データのデータ量を減算した値に更新される。更新工程では、更新後の残量情報が負の値になる場合には、特定情報が、特定情報により特定されるバッファの次段以降の他のバッファを特定する情報に更新される動作及び特定情報が更新される動作が行われる都度、最大量情報が残量情報に加算される動作の夫々が、残量情報が正の値になるまで繰り返される。
【発明の効果】
【００１３】
以上説明したシェーピング装置及び方法によれば、フロー情報テーブルを更新しながら、複数のバッファへの入力データの書き込みが行われる。従って、効率的なシェーピングを行うことができる。
【図面の簡単な説明】
【００１４】
【図１】第１実施形態のパケットシェーピング装置の機能ブロックの一例を示すブロック図である。
【図２】第１実施形態のパケットシェーピング装置のハードウェアブロックの一例を示すブロック図である。
【図３】第１実施形態のフロー情報テーブルのデータ構造を示すテーブル図である。
【図４】第１実施形態のバッファ管理テーブルのデータ構造を示すテーブル図である。
【図５】第１実施形態のパケットシェーピング装置の動作の一部の流れを示すフローチャートである。
【図６】第１実施形態のパケットシェーピング装置の動作の他の一部の流れを示すフローチャートである。
【図７】第１実施形態のフロー情報テーブルの更新動作が行われる場合の変数Ｂ１、変数Ｂ２及び変数ＰＬＥＮの関係を示す説明図である。
【図８】第１実施形態のパケットシェーピング装置の動作の他の一部の流れを示すフローチャートである。
【図９】第２実施形態のパケットシェーピング装置の機能ブロックの一例を示すブロック図である。
【図１０】第２実施形態のフロー情報テーブルのデータ構造を示すテーブル図である。
【図１１】第２実施形態のバッファ管理テーブルのデータ構造を示すテーブル図である。
【図１２】第２実施形態のパケットシェーピング装置の動作の一部の流れを示すフローチャートである。
【図１３】第２実施形態のパケットシェーピング装置の動作の他の一部の流れを示すフローチャートである。
【図１４】第２実施形態のパケットシェーピング装置の動作の他の一部の流れを示すフローチャートである。
【図１５】変形動作例に用いられるフロー情報テーブルのデータ構造を示すテーブル図である。
【図１６】変形動作例に用いられるバッファ管理テーブルのデータ構造を示すテーブル図である。
【図１７】第２実施形態のパケットシェーピング装置の変形動作例の一部の流れを示すフローチャートである。
【図１８】第２実施形態のパケットシェーピング装置の変形動作例の他の一部の流れを示すフローチャートである。
【図１９】第２実施形態のパケットシェーピング装置の変形動作例の他の一部の流れを示すフローチャートである。
【発明を実施するための形態】
【００１５】
以下、本発明を実施するための形態を、図面に基づいて説明する。尚、以下では、シェーピング装置の一例であるパケットシェーピング装置の説明を進める。尚、パケット以外の各種データ（例えば、セルやフレーム等）をシェーピングする任意のシェーピング装置についても、後述する構成及び動作を適用してもよい。
【００１６】
（１）第１実施形態
図１から図８を参照して、第１実施形態のパケットシェーピング装置１について説明する。
【００１７】
（１−１）パケットシェーピング装置の構成
図１から図２を参照して、第１実施形態のパケットシェーピング装置１の構成について説明する。図１は、第１実施形態のパケットシェーピング装置１の機能ブロックの一例を示すブロック図である。図２は、第１実施形態のパケットシェーピング装置１のハードウェアブロックの一例を示すブロック図である。
【００１８】
図１に示すように、第１実施形態のパケットシェーピング装置１は、フロー別シェーパ部１１と、フロー情報テーブル１２と、バッファ管理テーブル１３と、バッファ部１４とを備えている。
【００１９】
フロー別シェーパ部１１は、パケットシェーピング装置１に入力される入力パケットを、バッファ部１４が備えるｎ（但し、ｎは１以上の整数）個の時刻バッファ（ＴＢｋ（但し、ｋは、１≦ｋ≦ｎを満たす整数）１４１のいずれかに書き込む。フロー別シェーパ部１１は、フロー情報テーブル１２及びバッファ管理テーブル１３の少なくとも一方に基づいて、ｎ個の時刻バッファ（ＴＢｋ）１４１のうちの入力パケットを書き込むべき少なくとも一つのバッファ１４１を決定することが好ましい。
【００２０】
フロー情報テーブル１２は、入力パケットのフローに関する情報を含むテーブルである。入力パケットのフローは、例えば、入力パケットが送信又は受信される契約者や入力パケットのサービス等に応じて個別に割り当てられる。尚、フロー情報テーブル１２の詳細については図３を参照しながら後に詳述するため、ここでの詳細な説明については省略する。
【００２１】
バッファ管理テーブル１３は、ｎ個の時刻バッファ（ＴＢｋ）１４１を管理するための情報を含むテーブルである。尚、バッファ管理テーブル１３の詳細については図４を参照しながら後に詳述するため、ここでの詳細な説明については省略する。
【００２２】
バッファ部１４は、ｎ個の時刻バッファ（ＴＢｋ）１４１と、セレクタ１４２とを備えている。
【００２３】
ｎ個の時刻バッファ（ＴＢｋ）１４１の夫々は、フロー別シェーパ部１１によって書き込まれた入力パケットを一時的に格納する。ｎ個の時刻バッファ（ＴＢｋ）１４１の夫々の上限サイズ（つまり、書込可能な上限サイズであって、バッファリング容量の上限サイズ）は、各時刻バッファ（ＴＢｋ）１４１から所定時間Ｔ１内に読出可能な最大のデータ量に設定されている。例えば、所定時間Ｔ１を１ミリ秒に設定した場合には、ｎ個の時刻バッファ（ＴＢｋ）１４１の夫々の上限サイズは、各時刻バッファ（ＴＢｋ）１４１から１ミリ秒以内に読出可能な最大のデータ量に設定されている。但し、ｎ個の時刻バッファ（ＴＢｋ）１４１の夫々の上限サイズは、各時刻バッファ（ＴＢｋ）１４１から所定時間Ｔ１以内に読出可能な最大のデータ量に対して所定のマージン（例えば、１パケットに相当するサイズのマージン）を加味した値に設定されていてもよい。
【００２４】
尚、第１実施形態では、ｎ個の時刻バッファ（ＴＢｋ）１４１の夫々に付与されている「ＴＢｋ」という符号は、便宜上時刻バッファ（ＴＢｋ）１４１の識別番号として用いられてもよい。加えて、「ＴＢｋ」という表記は、便宜上時刻バッファ（ＴＢｋ）１４１に書き込まれている入力パケットが読み出される順番を示す情報として用いられてもよい。この場合、例えば、時刻バッファ（ＴＢ１）１４１は、「ＴＢ１」という識別番号を有する時刻バッファ（ＴＢ１）１４１であって、１番目に（或いは、ｎ番目の時刻バッファ（ＴＢｎ）１４１の次に）読み出される時刻バッファ（ＴＢ１）１４１である。同様に、例えば、時刻バッファ（ＴＢ２）１４１は、「ＴＢ２」という識別番号を有する時刻バッファ（ＴＢ２）１４１であって、２番目に（つまり、１番目の時刻バッファ（ＴＢ１）１４１の次に）読み出される時刻バッファ（ＴＢ２）１４１である。同様に、例えば、時刻バッファ（ＴＢｋ）１４１は、「ＴＢｋ」という識別番号を有する時刻バッファ（ＴＢｋ）１４１であって、ｋ番目に（つまり、ｋ−１番目の時刻バッファ（ＴＢｋ−１）１４１の次に）読み出される時刻バッファ（ＴＢｋ）１４１である。
【００２５】
セレクタ１４２は、所定時間Ｔ１毎に、ｎ個の時刻バッファ（ＴＢｋ）１４１の中から書き込まれている入力パケットを読み出す一つの時刻バッファ（ＴＢｋ）１４１を順次選択する。尚、上述したように、セレクタ１４２は、時刻バッファ（ＴＢ１）１４１から時刻バッファ（ＴＢｎ）をこの順に選択することが好ましい。セレクタ１４２は、所定時間Ｔ１が経過する間、選択した一つの時刻バッファ（ＴＢｋ）１４１に書き込まれている入力パケットを、出力パケットとして読み出す。つまり、セレクタ１４２により、入力パケットが出力パケットとして読み出される一つの時刻バッファ（ＴＢｋ）１４１が所定時間Ｔ１毎に順次切り替えられる。
【００２６】
図２に示すように、パケットシェーピング装置１は、ハードウェア構成の観点からみると、入力インタフェース１５と、ＦＰＧＡ（Field Programmable Gate Array）１６と、出力インタフェース１７と、テーブル格納用ＲＡＭ（Random Access Memory）１８と、バッファ用ＲＡＭ１９とを備えている。入力インタフェース１５は、入力パケットの入力を受け付ける。ＦＰＧＡ１６は、書き換え可能な論理回路を含む集積処理回路であり、シェーピング装置１の仕様に応じた処理を行うように論理回路の定義付けないしは設計を適宜行うことができる。出力インタフェース１７は、出力パケットを出力する。テーブル用ＲＡＭ１８は、フロー情報テーブル１２及びバッファ管理テーブル１３を格納するためのＲＡＭである。バッファ用ＲＡＭ１９は、複数の時刻バッファ１４１を形成するためのＲＡＭである。尚、ＦＰＧＡ１２５が、上述したフロー別シェーパ部１１及びセレクタ１４２に対応している。テーブル用ＲＡＭ１８が、上述したフロー情報テーブル１２及びバッファ管理テーブル１３に対応している。バッファ用ＲＡＭ１９が、上述した複数の時刻バッファ１４１に対応している。
【００２７】
（１−２）フロー情報テーブル及びバッファ管理テーブルのデータ構造
図３及び図４を参照して、第１実施形態のフロー情報テーブル１２及びバッファ管理テーブル１３のデータ構造について説明する。図３は、第１実施形態のフロー情報テーブル１２のデータ構造を示すテーブル図である。図４は、第１実施形態のバッファ管理テーブル１３のデータ構造を示すテーブル図である。
【００２８】
図３に示すように、フロー情報テーブル１２は、フローＩＤ１２１と、入力可能上限バイト数１２２と、許容遅延１２３と、次時刻バッファ番号１２４と、入力可能残りバイト数１２５とを含むフロー情報レコード１２６を、フロー毎に備えている。尚、図３は、ｍ（但し、ｍは１以上の整数）個のフローが存在する場合のフロー情報テーブル１２の例を示している。
【００２９】
フローＩＤ１２１は、フロー情報レコード１２６に対応するフローを識別するための識別情報（ＩＤ）を示す。尚、図３は、ｍ個のフローに対して、「＃１」、「＃２」、・・・、「＃ｍ」というフローＩＤ１２１が割り当てられる例を示している。
【００３０】
入力可能上限バイト数１２２は、「最大量情報」の一例であって、各時刻バッファ（ＴＢｋ）１４１に書込可能な上限バイト数を、フロー毎に個別に示す。つまり、入力可能上限バイト数１２２は、各時刻バッファ（ＴＢｋ）１４１に書込可能な各フローの入力パケットの上限バイト数を示す。例えば、図３は、フローＩＤ１２１が「＃１」となるフローの入力パケットが、各時刻バッファ（ＴＢｋ）１４１に最大１２５０バイト書込可能であることを示す入力可能上限バイト数１２２の例を示している。同様に、例えば、図３は、フローＩＤ１２１が「＃２」となるフローの入力パケットが、各時刻バッファ（ＴＢｋ）１４１に最大５００バイト書込可能であることを示す入力可能上限バイト数１２２の例を示している。同様に、例えば、図３は、フローＩＤ１２１が「＃ｍ」となるフローの入力パケットが、各時刻バッファ（ＴＢｋ）１４１に最大２０００バイト書込可能であることを示す入力可能上限バイト数１２２の例を示している。尚、入力可能上限バイト数１２２には、各フローの帯域（レート）に応じて固定的なバイト数が設定されてもよい。或いは、入力可能上限バイト数１２２は、適宜変更されてもよい。
【００３１】
許容遅延１２３は、「遅延時間情報」の一例であって、入力パケットを新たに書き込んでから当該入力パケットが実際に読み出されるまでの遅延時間の許容値を示す。より具体的には、許容遅延１２３は、現在読出中の一の時刻バッファ（ＴＢｋ）１４１を起点として、入力パケットを新たに書き込むべき他の時刻バッファ（ＴＢｋ）１４１から当該書き込んだ入力パケットが実際に読み出されるまでの遅延時間の許容値を示す。例えば、入力パケットを新たに書き込んでから当該入力パケットが実際に読み出されるまでの遅延時間が許容遅延１２３以内であれば、入力パケットが実際に書き込まれることが好ましい。他方で、例えば、入力パケットを新たに書き込んでから当該入力パケットが実際に読み出されるまでの遅延時間が許容遅延１２３を超えるのであれば、入力パケットが実際に新たに書き込まれないことが好ましい。
【００３２】
尚、図３は、フローＩＤ１２１が「＃１」となるフローの許容遅延１２３が３０ミリ秒である例を示している。従って、フローＩＤ１２１が「＃１」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が３０ミリ秒以下であれば、ｎ個の時刻バッファ（ＴＢｋ）１４１のいずれかに書き込まれることが好ましい。他方で、フローＩＤ１２１が「＃１」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が３０ミリ秒を超えるのであれば、ｎ個の時刻バッファ（ＴＢｋ）１４１のいずれかに書き込まれない（例えば、破棄される）ことが好ましい。
【００３３】
同様に、図３は、フローＩＤ１２１が「＃２」となるフローの許容遅延１２３が５０ミリ秒である例を示している。従って、フローＩＤ１２１が「＃２」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が５０ミリ秒以下であれば、ｎ個の時刻バッファ（ＴＢｋ）１４１のいずれかに書き込まれることが好ましい。他方で、フローＩＤ１２１が「＃２」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が５０ミリ秒を超えるのであれば、ｎ個の時刻バッファ（ＴＢｋ）１４１のいずれかに書き込まれない（例えば、破棄される）ことが好ましい。
【００３４】
同様に、図３は、フローＩＤ１２１が「＃ｍ」となるフローの許容遅延１２３が１０ミリ秒である例を示している。従って、フローＩＤ１２１が「＃ｍ」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が１０ミリ秒以下であれば、ｎ個の時刻バッファ（ＴＢｋ）１４１のいずれかに書き込まれることが好ましい。他方で、フローＩＤ１２１が「＃ｍ」となるフローの入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が１０ミリ秒を超えるのであれば、ｎ個の時刻バッファ（ＴＢｋ）１４１のいずれかに書き込まれない（例えば、破棄される）ことが好ましい。
【００３５】
次時刻バッファ番号１２４は、「特定情報」の一例であって、入力パケットを書き込むべき一つの時刻バッファ（ＴＢｋ）１４１の識別番号を、フロー毎に個別に示す。例えば、図３は、フローＩＤ１２１が「＃１」となるフローの入力パケットが、時刻バッファ（ＴＢ１）１４１に書き込まれるべきであることを示す次時刻バッファ番号１２４の例を示している。同様に、例えば、図３は、フローＩＤ１２１が「＃２」となるフローの入力パケットが、時刻バッファ（ＴＢ１）１４１に書き込まれるべきであることを示す次時刻バッファ番号１２４の例を示している。同様に、例えば、図３は、フローＩＤ１２１が「＃ｍ」となるフローの入力パケットが、時刻バッファ（ＴＢ３）１４１に書き込まれるべきであることを示す次時刻バッファ番号１２４の例を示している。
【００３６】
入力可能残りバイト数１２５は、「残量情報」の一例であって、次時刻バッファ番号１２４によって特定される一つの時刻バッファ（ＴＢｋ）１４１に書込可能な残りのバイト数を、フロー毎に個別に示す。例えば、入力可能残りバイト数１２５は、次時刻バッファ番号１２４によって特定される一つの時刻バッファ（ＴＢｋ）１４１に既に書込済みの入力パケットのバイト数を上述した入力可能上限バイト数１２２から減算した値となる。例えば、図３は、フローＩＤ１２１が「＃１」となるフローの入力パケットが、次時刻バッファ番号１２４によって特定される時刻バッファ（ＴＢ１）１４１にあと５００バイト書込可能であることを示す入力可能残りバイト数１２５の例を示している。同様に、例えば、図３は、フローＩＤ１２１が「＃２」となるフローの入力パケットが、次時刻バッファ番号１２４によって特定される時刻バッファ（ＴＢ１）１４１にあと３００バイト書込可能であることを示す入力可能残りバイト数１２５の例を示している。同様に、例えば、図３は、フローＩＤ１２１が「＃ｍ」となるフローの入力パケットが、次時刻バッファ番号１２４によって特定される時刻バッファ（ＴＢ３）１４１にあと１５２０バイト書込可能であることを示す入力可能残りバイト数１２５の例を示している。
【００３７】
図４に示すように、バッファ管理テーブル１３は、時刻バッファ識別番号１３１と、バッファ上限値１３２と、キュー長１３３と、読出中フラグ１３４とを含むバッファ管理レコード１３５を、時刻バッファ（ＴＢｋ）１４１毎に備えている。
【００３８】
時刻バッファ識別番号１３１は、バッファ管理レコード１３５に対応する時刻バッファ（ＴＢｋ）１４１を識別するための識別番号を示す。
【００３９】
バッファ上限値１３２は、「上限情報」の一例であって、各時刻バッファ（ＴＢｋ）１４１に書込可能な上限バイト数を示す。つまり、バッファ上限値１３２は、各時刻バッファ（ＴＢｋ）１４１の上限サイズを示す。尚、バッファ上限値１３２は、フロー毎の区別をすることなく時刻バッファ（ＴＢｋ）１４１全体として書込可能な上限バイト数を示すという点で、上述した入力可能上限バイト数１２２とは異なる。例えば、図４は、時刻バッファ（ＴＢ１）１４１に最大１２５０００バイト書込可能であることを示すバッファ上限値１３２の例を示している。同様に、例えば、図４は、時刻バッファ（ＴＢ２）１４１に最大１２５０００バイト書込可能であることを示すバッファ上限値１３２の例を示している。同様に、例えば、図４は、時刻バッファ（ＴＢｎ）１４１に最大１２５０００バイト書込可能であることを示すバッファ上限値１３２の例を示している。
【００４０】
キュー長１３３は、「キュー長情報」の一例であって、各時刻バッファ（ＴＢｋ）１４１に既に書き込まれている入力パケットのバイト数を示す。言い換えれば、キュー長１３３は、各時刻バッファ（ＴＢｋ）１４１に既に書き込まれ且つ読み出し待ち中の入力パケットのバイト数を示す。更に言い換えれば、キュー長１３３は、各時刻バッファ（ＴＢｋ）１４１に既に書き込まれ且つ読み出し待ち中の全てのフローの入力パケットのバイト数を示す。例えば、図４は、時刻バッファ（ＴＢ１）１４１に８７０００バイトの入力パケットが既に書き込まれ且つ読み出し待ち中であることを示すキュー長１３３の例を示している。同様に、例えば、図４は、時刻バッファ（ＴＢ２）１４１に４２０００バイトの入力パケットが既に書き込まれ且つ読み出し待ち中であることを示すキュー長１３３の例を示している。同様に、例えば、図４は、時刻バッファ（ＴＢｎ）１４１には入力パケットが書き込まれていないことを示すキュー長１３３の例を示している。
【００４１】
読出中フラグ１３４は、ｎ個の時刻バッファ（ＴＢｋ）１４１のうちの読出中の一つの時刻バッファ（ＴＢｋ）１４１を識別するフラグである。例えば、読出中フラグ１３４は、対応する時刻バッファ（ＴＢｋ）１４１が読出中である場合には“１”に設定される。他方で、読出中フラグ１３４は、対応する時刻バッファ（ＴＢｋ）１４１が読出中でない場合には“０”に設定される。例えば、図４は、時刻バッファ（ＴＢ１）１４１が読出中であり且つその他の時刻バッファ（ＴＢ２）１４１から時刻バッファ（ＴＢｎ）１４１が読出中ではないことを示す読出中フラグ１３４の例を示している。
【００４２】
（１−３）パケットシェーピング装置の動作
図５から図６を参照して、第１実施形態のパケットシェーピング装置１の動作について説明する。図５は、第１実施形態のパケットシェーピング装置１の動作の一部の流れを示すフローチャートである。図６は、第１実施形態のパケットシェーピング装置１の動作の他の一部の流れを示すフローチャートである。
【００４３】
図５に示すように、フロー別シェーパ部１１は、入力パケットを取得する（ステップＳ１０１）。その後、フロー別シェーパ部１１は、取得した入力パケットに含まれるパケット管理情報を取得する（ステップＳ１０２）。パケット管理情報は、例えば、入力パケットのフローを識別する変数ＦＩＤ（フローＩＤ）や、入力パケットのサイズ（バイト数）を示す変数ＰＬＥＮ（Packet LENgth）等を含んでいる。
【００４４】
その後、フロー別シェーパ部１１は、フロー情報テーブル１２から、ステップＳ１０２で取得したＦＩＤと一致するフローＩＤ１２１を有するフロー情報レコード１２６を取得する（ステップＳ１０３）。以降、フロー情報レコード１２６に含まれる次時刻バッファ番号１２４を、「変数ＴＢｘ（但し、ｘは、１≦ｘ≦ｎを満たす整数）」と表記する。同様に、許容遅延１２３を、「変数Ｎ」と表記する。同様に、入力可能上限バイト数１２２を、「変数Ｂ１」と表記する。同様に、入力可能残りバイト数１２５を、「変数Ｂ２」と表記する。
【００４５】
ステップＳ１０３の動作に続いて、相前後して又は並行して、フロー別シェーパ部１１は、バッファ管理テーブル１３から、バッファ管理レコード１３５を取得する（ステップＳ１０４）。例えば、フロー別シェーパ部１１は、読出中フラグ１３４を取得することで、現在読出中の時刻バッファ（ＴＢｋ）１４１を認識する。尚、以降、現在読出中の時刻バッファ（ＴＢｋ）１４１の識別番号を、「変数ＴＢｙ（但し、ｙは、１≦ｙ≦ｎを満たす整数）」と表記する。
【００４６】
続いて、フロー別シェーパ部１１は、変数ＴＢｘが有効な値であるか否かを判定する（ステップＳ１０５）。例えば、ステップＳ１０１で取得した入力パケットのフローと同一のフローにおいて過去に別の入力パケットを既に取得している場合には、当該フローに対応する変数ＴＢｘ（つまり、次時刻バッファ番号１２４）は有効であると推測できる。従って、この場合には、フロー別シェーパ部１１は、変数ＴＢｘが有効であると判定してもよい。他方で、ステップＳ１０１で取得した入力パケットが、当該入力パケットのフローにおいて初めて取得した入力パケットである場合には、当該フローに対応する変数ＴＢｘ（つまり、次時刻バッファ番号１２４）には有効な値が未だ設定されていないと推測できる。従って、この場合には、フロー別シェーパ部１１は、変数ＴＢｘが有効でないと判定してもよい。或いは、時刻バッファ（ＴＢｘ）１４１の読出時刻が、現在読出中の時刻バッファ（ＴＢｙ）１４１の読出時刻よりも過去である（つまり、ＴＢｘ＜ＴＢｙ（言い換えれば、ｘ＜ｙ）となる）場合には、変数ＴＢｘが有効でないものとして取り扱うことが好ましい。従って、この場合には、フロー別シェーパ部１１は、変数ＴＢｘが有効でないと判定してもよい。
【００４７】
ステップＳ１０５における判定の結果、変数ＴＢｘが有効であると判定される場合には（ステップＳ１０５：Ｙｅｓ）、フロー別シェーパ１１は、時刻バッファ（ＴＢｘ）１４１が現在読出中の時刻バッファ（ＴＢｙ）１４１であるか否かを判定する（ステップＳ１０６）。つまり、フロー別シェーパ１１は、ＴＢｘ＝ＴＢｙ（言い換えれば、ｘ＝ｙ）であるか否かを判定する。
【００４８】
ステップＳ１０６における判定の結果、時刻バッファ（ＴＢｘ）１４１が現在読出中の時刻バッファ（ＴＢｙ）１４１でないと判定される場合には（ステップＳ１０６：Ｎｏ）、フロー別シェーパ部１１は、時刻バッファ（ＴＢｘ）１４１を、ステップＳ１０１で取得した入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ（但し、ｚは、１≦ｚ≦ｎを満たす整数））１４１に設定する（ステップＳ１０７）。つまり、フロー別シェーパ部１１は、ＴＢｚにＴＢｘを（言い換えれば、ｚにｘを）設定する。
【００４９】
他方で、ステップＳ１０６における判定の結果、時刻バッファ（ＴＢｘ）１４１が現在読出中の時刻バッファ（ＴＢｙ）１４１であると判定される場合には（ステップＳ１０６：Ｙｅｓ）、フロー別シェーパ部１１は、読出中の時刻バッファ（ＴＢｙ）１４１への書き込みが許可されているか否かを判定する（ステップＳ１０８）。尚、読出中の時刻バッファ（ＴＢｙ）１４１への書き込みが許可されているか否かは、パケットシェーピング装置１に対して予め設定されていてもよい。
【００５０】
ステップＳ１０８における判定の結果、読出中の時刻バッファ（ＴＢｙ）１４１への書き込みが許可されていると判定される場合には（ステップＳ１０８：Ｙｅｓ）、フロー別シェーパ部１１は、時刻バッファ（ＴＢｘ）１４１を、ステップＳ１０１で取得した入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）１４１に設定する（ステップＳ１０７）。つまり、フロー別シェーパ部１１は、ＴＢｚにＴＢｘを（言い換えれば、ｚにｘを）設定する。
【００５１】
他方で、ステップＳ１０８における判定の結果、読出中の時刻バッファ（ＴＢｙ）１４１への書き込みが許可されていないと判定される場合には（ステップＳ１０８：Ｎｏ）、フロー別シェーパ部１１は、時刻バッファ（ＴＢｘ）１４１の次段の時刻バッファ（ＴＢｘ＋１）１４１を、ステップＳ１０１で取得した入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）１４１に設定する（ステップＳ１０９）。つまり、フロー別シェーパ部１１は、ＴＢｚにＴＢｘ＋１を（言い換えれば、ｚにｘ＋１を）設定する。
【００５２】
他方で、ステップＳ１０５における判定の結果、変数ＴＢｘが有効でないと判定される場合には（ステップＳ１０５：Ｎｏ）、フロー別シェーパ１１は、読出中の時刻バッファ（ＴＢｙ）１４１への書き込みが許可されているか否かを判定する（ステップＳ１１０）。
【００５３】
ステップＳ１１０における判定の結果、読出中の時刻バッファ（ＴＢｙ）１４１への書き込みが許可されていないと判定される場合には（ステップＳ１１０：Ｎｏ）、フロー別シェーパ部１１は、読出中の時刻バッファ（ＴＢｙ）１４１の次段の時刻バッファ（ＴＢｙ＋１）１４１を、ステップＳ１０１で取得した入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）１４１に設定する（ステップＳ１１１）。つまり、フロー別シェーパ部１１は、ＴＢｚにＴＢｙ＋１を（言い換えれば、ｚにｙ＋１を）設定する。
【００５４】
他方で、ステップＳ１１０における判定の結果、読出中の時刻バッファ（ＴＢｙ）１４１への書き込みが許可されていると判定される場合には（ステップＳ１１０：Ｙｅｓ）、フロー別シェーパ部１１は、時刻バッファ（ＴＢｙ）１４１を、ステップＳ１０１で取得した入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）１４１に設定する（ステップＳ１１２）。つまり、フロー別シェーパ部１１は、ＴＢｚにＴＢｙを（言い換えれば、ｚにｙを）設定する。
【００５５】
尚、読出中の時刻バッファ（ＴＢｙ）１４１への書き込みが許可されているか否かを判定しなくともよい。つまり、フロー別シェーパ部１１は、ステップＳ１０６、ステップＳ１０８及びステップＳ１１０の判定動作が行わなくともよい。この場合、フロー別シェーパ部１１は、変数ＴＢｘが有効であると判定される場合には（ステップＳ１０５：Ｙｅｓ）、時刻バッファ（ＴＢｘ）１４１を、ステップＳ１０１で取得した入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）１４１に設定してもよい（ステップＳ１０７）。他方で、フロー別シェーパ部１１は、変数ＴＢｘが有効でないと判定される場合には（ステップＳ１０５：Ｎｏ）、時刻バッファ（ＴＢｙ）１４１又は時刻バッファ（ＴＢｙ＋１）１４１を、ステップＳ１０１で取得した入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）１４１に設定してもよい（ステップＳ１１１又はステップＳ１１２）。
【００５６】
続いて、フロー別シェーパ部１１は、ステップＳ１０１で取得した入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）１４１に空きがあるか否かを判定する（ステップＳ１１３）。具体的には、フロー別シェーパ部１１は、バッファ管理テーブル１３から、時刻バッファ識別番号１３１が「ＴＢｚ」となるバッファ管理レコード１３５を取得する。尚、フロー別シェーパ部１１は、ステップＳ１０４において取得済みのバッファ管理レコード１３５の中から、時刻バッファ識別番号１３１が「ＴＢｚ」となるバッファ管理レコード１３５を抽出してもよい。フロー別シェーパ部１１は、取得したバッファ管理レコード１３５のキュー長１３３がバッファ上限値１３２よりも小さいか否かを判定する。取得したバッファ管理レコード１３５のキュー長１３３がバッファ上限値１３２よりも小さいと判定される場合には、フロー別シェーパ部１１は、時刻バッファ（ＴＢｚ）１４１に空きがあると判定してもよい。他方で、取得したバッファ管理レコード１３５のキュー長１３３がバッファ上限値１３２よりも小さくないと判定される場合には、フロー別シェーパ部１１は、時刻バッファ（ＴＢｚ）１４１に空きがないと判定してもよい。
【００５７】
ステップＳ１１３における判定の結果、時刻バッファ（ＴＢｚ）１４１に空きがないと判定される場合には（ステップＳ１１３：Ｎｏ）、フロー別シェーパ部１１は、ＴＢｚ（言い換えれば、ｚ）を１だけインクリメントした後（ステップＳ１１４）、ステップＳ１１３の動作を繰り返す。つまり、フロー別シェーパ部１１は、空きがないと判定された時刻バッファ（ＴＢｚ）１４１の次段の時刻バッファ（ＴＢｚ＋１）１４１を新たな時刻バッファ（ＴＢｚ）１４１に設定した上で、ステップＳ１１３の動作を繰り返す。
【００５８】
他方で、ステップＳ１１３における判定の結果、時刻バッファ（ＴＢｚ）１４１に空きがあると判定される場合には（ステップＳ１１３：Ｙｅｓ）、フロー別シェーパ部１１は、図６に示す動作を行う。
【００５９】
図６に示すように、フロー別シェーパ部１１は、入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）１４１の読出時間と、現在読出中の時刻バッファ（ＴＢｙ）１４１の読出時間との間の差分が、変数Ｎ（つまり、許容遅延１２３）よりも大きいか否かを判定する（ステップＳ１１５）。つまり、フロー別シェーパ部１１は、時刻バッファ（ＴＢｚ）１４１に入力パケットを書き込んでから当該時刻バッファ（ＴＢｚ）１４１から実際に入力パケットが読み出されるまでの遅延時間が、変数Ｎよりも大きいか否かを判定する。尚、上述した所定時間Ｔ１の例として「１ミリ秒」を用いた場合には、時刻バッファ（ＴＢｋ）１４１の識別番号ＴＢｋの差分は、遅延時間［ミリ秒］に相当する。従って、図６に示す例では、フロー別シェーパ部１１は、時刻バッファ（ＴＢｚ）１４１の識別番号ＴＢｚと時刻バッファ（ＴＢｙ）１４１の識別番号ＴＢｙとの間の差分（ＴＢｚ−ＴＢｙ（言い換えれば、ｚ−ｙ））が、変数Ｎよりも大きいか否かを判定している。
【００６０】
ステップＳ１１５における判定の結果、ＴＢｚ−ＴＢｙ（つまり、遅延時間）が変数Ｎよりも大きいと判定される場合には（ステップＳ１１５：Ｙｅｓ）、フロー別シェーパ部１１は、ステップＳ１０１で取得した入力パケットを廃棄する（ステップＳ１１６）。その後、パケットシェーピング装置１は、動作を終了してもよいし、図５のステップＳ１０１以降の動作を再度繰り返してもよい。
【００６１】
他方で、ステップＳ１１５における判定の結果、ＴＢｚ−ＴＢｙ（つまり、遅延時間）が変数Ｎよりも大きくないと判定される場合には（ステップＳ１１５：Ｎｏ）、フロー別シェーパ１１は、ステップＳ１０１で取得した入力パケットを、時刻バッファ（ＴＢｚ）１４１に書き込む（ステップＳ１１７）。
【００６２】
尚、フロー別シェーパ部１１は、ステップＳ１１５及びステップＳ１１６の動作を行わなくともよい。つまり、フロー別シェーパ部１１は、遅延時間を考慮することなく入力パケットを書き込んでもよい。この場合、フロー情報テーブル１２は、許容遅延１２３を含んでいなくともよい。
【００６３】
続いて、フロー別シェーパ部１１は、時刻バッファ識別番号１３１が「ＴＢｚ」となるバッファ管理レコード１３５のキュー長１３３を更新する（ステップＳ１１８）。具体的には、フロー別シェーパ部１１は、更新前のキュー長１３３に対して変数ＰＬＥＮ（つまり、今回書き込んだ入力パケットのサイズ（バイト数））を加算した値を、更新後のキュー長１３３としてバッファ管理テーブル１３に書き込む。
【００６４】
続いて、フロー別シェーパ部１１は、ステップＳ１１８で更新されたキュー長１３３が、時刻バッファ識別番号１３１が「ＴＢｚ」となるバッファ管理レコード１３５のバッファ上限値１３２よりも大きいか否かを判定する（ステップＳ１１９）。
【００６５】
ステップＳ１１９における判定の結果、ステップＳ１１８で更新されたキュー長１３３が、時刻バッファ識別番号１３１が「ＴＢｚ」となるバッファ管理レコード１３５のバッファ上限値１３２よりも大きいと判定される場合には（ステップＳ１１９：Ｙｅｓ）、フロー別シェーパ部１１は、時刻バッファ（ＴＢｚ）の次段以降の空きがある時刻バッファ（ＴＢｚ＋ａ（但し、ａは、１≦ａ＜ｎを満たす整数））１４１のバッファ上限値１３２を更新する（ステップＳ１２０）。具体的には、フロー別シェーパ部１１は、時刻バッファ識別番号１３１が「ＴＢｚ＋ａ」となるバッファ管理レコード１３５のバッファ上限値１３２から、キュー長１３３（つまり、ステップＳ１１８で更新されたキュー長）がバッファ上限値１３２（つまり、時刻バッファ識別番号１３１が「ＴＢｚ」となるバッファ管理レコード１３５のバッファ上限値１３２）を超過したバイト数だけ減算する。フロー別シェーパ部１１は、減算の結果得られた値を、時刻バッファ識別番号１３１が「ＴＢｚ＋ａ」となるバッファ管理レコード１３５の更新後のバッファ上限値１３２としてバッファ管理テーブル１３に書き込む。
【００６６】
他方で、ステップＳ１１９における判定の結果、ステップＳ１１８で更新されたキュー長１３３が、時刻バッファ識別番号１３１が「ＴＢｚ」となるバッファ管理レコード１３５のバッファ上限値１３２よりも大きくないと判定される場合には（ステップＳ１１９：Ｎｏ）、フロー別シェーパ部１１は、ステップＳ１２０の動作を行わなくともよい。
【００６７】
尚、フロー別シェーパ１１は、ステップＳ１１９及びステップＳ１２０の動作を行わなくともよい。
【００６８】
続いて、フロー別シェーパ部１１は、フロー情報テーブル１２の更新動作（ステップＳ１２１からステップＳ１２７）を行う。具体的には、フロー別シェーパ部１１は、変数Ｂ２（つまり、入力可能残りバイト数１２５）が変数ＰＬＥＮ（つまり、今回書き込んだ入力パケットのサイズ（バイト数））よりも大きいか否かを判定する（ステップＳ１２１）。
【００６９】
ステップＳ１２１における判定の結果、変数Ｂ２が変数ＰＬＥＮよりも大きいと判定される場合には（ステップＳ１２１：Ｙｅｓ）、フロー別シェーパ部１１は、変数Ｂ２（つまり、入力可能残りバイト数１２５）を更新する（ステップＳ１２２）。具体的には、フロー別シェーパ部１１は、変数Ｂ２から変数ＰＬＥＮを減算した値を、更新後の変数Ｂ２（つまり、更新後の入力可能残りバイト数１２５）としてフロー情報テーブル１２に書き込む。その後、パケットシェーピング装置１は、動作を終了してもよいし、図５のステップＳ１０１以降の動作を再度繰り返してもよい。
【００７０】
他方で、ステップＳ１２１における判定の結果、変数Ｂ２が変数ＰＬＥＮよりも大きくないと判定される場合には（ステップＳ１２１：Ｎｏ）、フロー別シェーパ部１１は、変数ＰＬＥＮを更新する（ステップＳ１２３）。具体的には、フロー別シェーパ部１１は、変数ＰＬＥＮから変数Ｂ２を減算した値を、更新後の変数ＰＬＥＮとする。
【００７１】
続いて、フロー別シェーパ部１１は、変数ＴＢｘ（つまり、次時刻バッファ番号１２４）を更新する（ステップＳ１２４）。具体的には、フロー別シェーパ部１１は、変数ＴＢｘ（言い換えれば、ｘ）を１だけインクリメントした値を、更新後の次時刻バッファ番号１２４としてフロー情報テーブル１２に書き込む。つまり、フロー別シェーパ部１１は、時刻バッファ（ＴＢｘ）１４１の次段の時刻バッファ（ＴＢｘ＋１）１４１を、新たな時刻バッファ（ＴＢｘ）１４１として取り扱う。その後、フロー別シェーパ部１１は、変数Ｂ１（つまり、入力可能上限バイト数１２２）が変数ＰＬＥＮ（つまり、ステップＳ１２３で更新された更新後の変数ＰＬＥＮ）よりも大きいか否かが判定される（ステップＳ１２５）。
【００７２】
ステップＳ１２５における判定の結果、変数Ｂ１が変数ＰＬＥＮよりも大きくないと判定される場合には（ステップＳ１２５：Ｎｏ）、フロー別シェーパ部１１は、変数ＰＬＥＮを更新する（ステップＳ１２６）。具体的には、フロー別シェーパ部１１は、変数ＰＬＥＮから変数Ｂ１を減算した値を、更新後の変数ＰＬＥＮとする。その後、フロー別シェーパ部１１は、ステップＳ１２４以降の動作を繰り返す。
【００７３】
他方で、ステップＳ１２５における判定の結果、変数Ｂ１が変数ＰＬＥＮよりも大きいと判定される場合には（ステップＳ１２５：Ｙｅｓ）、フロー別シェーパ部１１は、変数Ｂ２（つまり、入力可能残りバイト数１２５）を更新する（ステップＳ１２７）。具体的には、フロー別シェーパ部１１は、変数Ｂ１から変数ＰＬＥＮを減算した値を、更新後の変数Ｂ２（つまり、更新後の入力可能残りバイト数１２５）としてフロー情報テーブル１２に書き込む。その後、パケットシェーピング装置１は、動作を終了してもよいし、図５のステップＳ１０１以降の動作を再度繰り返してもよい。
【００７４】
以上説明したフロー情報テーブル１２の更新動作（ステップＳ１２１からステップＳ１２７）について、図７に示す実例を交えながら詳細に説明する。図７は、フロー情報テーブル１２の更新動作が行われる場合の変数Ｂ１、変数Ｂ２及び変数ＰＬＥＮの関係を示す説明図である。
【００７５】
図７（ａ）は、更新前の変数Ｂ２（つまり、更新前の入力可能残りバイト数１２５）が更新前の変数ＰＬＥＮ（つまり、今回書き込んだ入力パケットのサイズ）よりも大きい例を示す。この場合、フロー別シェーパ部１１は、更新前の変数Ｂ２から更新前の変数ＰＬＥＮを減算した値を、更新後の変数Ｂ２としてフロー情報テーブル１２に書き込む（図６のステップＳ１２２）。
【００７６】
図７（ｂ）は、更新前の変数Ｂ２が更新前の変数ＰＬＥＮよりも小さい第１の例を示す。この場合、フロー別シェーパ部１１は、更新前の変数ＰＬＥＮから更新前の変数Ｂ２を減算した値を、更新後の変数ＰＬＥＮとする（図６のステップＳ１２３）。更に、フロー別シェーパ部１１は、変数ＴＢｘに対して１回目のインクリメントを行う（ステップＳ１２４）。その後、図７（ｂ）に示すように、更新後の変数ＰＬＥＮが変数Ｂ１よりも小さくなったとする（図６のステップＳ１２５：Ｙｅｓ）。この場合、フロー別シェーパ部１１は、変数Ｂ１から更新後の変数ＰＬＥＮを減算した値を、更新後の変数Ｂ２としてフロー情報テーブル１２に書き込む。尚、更新後の変数ＰＬＥＮは、更新前の変数ＰＬＥＮ−更新前の変数Ｂ２と表現できる。このため、図７（ｂ）に示す例では、更新後の変数Ｂ２は、変数Ｂ１−更新後の変数ＰＬＥＮ＝変数Ｂ１−（更新前の変数ＰＬＥＮ−更新前の変数Ｂ２）＝更新前の変数Ｂ２−更新前の変数ＰＬＥＮ＋変数Ｂ１と表現できる。
【００７７】
図７（ｃ）は、更新前の変数Ｂ２が更新前の変数ＰＬＥＮよりも小さい第２の例を示す。この場合、フロー別シェーパ部１１は、更新前の変数ＰＬＥＮから更新前の変数Ｂ２を減算した値を、１回更新後の変数ＰＬＥＮとする（図６のステップＳ１２３）。更に、フロー別シェーパ部１１は、変数ＴＢｘに対して１回目のインクリメントを行う（ステップＳ１２４）。その後、図７（ｃ）に示すように、１回更新後の変数ＰＬＥＮが変数Ｂ１よりもいまだ大きくなっているとする（図６のステップＳ１２５：Ｎｏ）。この場合、フロー別シェーパ部１１は、１回更新後の変数ＰＬＥＮから変数Ｂ１を減算した値を、２回更新後の変数ＰＬＥＮとする（図６のステップＳ１２６）。更に、フロー別シェーパ部１１は、変数ＴＢｘに対して２回目のインクリメントを行う（ステップＳ１２４）。その後、図７（ｃ）に示すように、２回更新後の変数ＰＬＥＮが変数Ｂ１よりも小さくなったとする（図６のステップＳ１２５：Ｙｅｓ）。この場合、フロー別シェーパ部１１は、変数Ｂ１から２回更新後の変数ＰＬＥＮを減算した値を、更新後の変数Ｂ２としてフロー情報テーブル１２に書き込む。尚、２回更新後の変数ＰＬＥＮは、１回更新後の変数ＰＬＥＮ−変数Ｂ１と表現できる。更に、１回更新後の変数ＰＬＥＮは、更新前の変数ＰＬＥＮ−更新前の変数Ｂ２と表現できる。このため、図７（ｃ）に示す例では、更新後の変数Ｂ２は、変数Ｂ１−２回更新後の変数ＰＬＥＮ＝変数Ｂ１−（１回更新後の変数ＰＬＥＮ−変数Ｂ１）＝変数Ｂ１−（（更新前の変数ＰＬＥＮ−更新前の変数Ｂ２）−変数Ｂ１）＝更新前の変数Ｂ２−更新前の変数ＰＬＥＮ＋変数Ｂ１×２と表現できる。
【００７８】
図７（ｄ）は、更新前の変数Ｂ２が更新前の変数ＰＬＥＮよりも小さい第３の例を示す。この場合、フロー別シェーパ部１１は、更新前の変数ＰＬＥＮから更新前の変数Ｂ２を減算した値を、１回更新後の変数ＰＬＥＮとする（図６のステップＳ１２３）。更に、フロー別シェーパ部１１は、変数ＴＢｘに対して１回目のインクリメントを行う（ステップＳ１２４）。その後、図７（ｄ）に示すように、１回更新後の変数ＰＬＥＮが変数Ｂ１よりもいまだ大きくなっているとする（図６のステップＳ１２５：Ｎｏ）。この場合、フロー別シェーパ部１１は、１回更新後の変数ＰＬＥＮから変数Ｂ１を減算した値を、２回更新後の変数ＰＬＥＮとする（図６のステップＳ１２６）。更に、フロー別シェーパ部１１は、変数ＴＢｘに対して２回目のインクリメントを行う（ステップＳ１２４）。以降同様の動作が繰り返され、図７（ｄ）に示すように、変数ＴＢｘに対してｉ（但し、ｉは１以上の整数）回目のインクリメントを行った時点で、変数ＰＬＥＮが変数Ｂ１よりも小さくなったとする（図６のステップＳ１２５：Ｙｅｓ）。つまり、ｉ回更新後の変数ＰＬＥＮが変数Ｂ１よりも小さくなったとする（図６のステップＳ１２５：Ｙｅｓ）。この場合、フロー別シェーパ部１１は、変数Ｂ１からｉ回更新後の変数ＰＬＥＮを減算した値を、更新後の変数Ｂ２としてフロー情報テーブル１２に書き込む。尚、ｉ回更新後の変数ＰＬＥＮは、ｉ−１回更新後の変数ＰＬＥＮ−変数Ｂ１と表現できる。このため、図７（ｄ）に示す例では、更新後の変数Ｂ２は、変数Ｂ１−ｉ回更新後の変数ＰＬＥＮ＝変数Ｂ１−（ｉ−１回更新後の変数ＰＬＥＮ−変数Ｂ１）＝・・・＝更新前の変数Ｂ２−更新前の変数ＰＬＥＮ＋変数Ｂ１×ｉと表現できる。
【００７９】
図７（ａ）から図７（ｄ）に示す例をまとめると、変数Ｂ２は、以下のように更新されているとも表現できる。まず、更新後の変数Ｂ２を、更新前の変数Ｂ２−更新前の変数ＰＬＥＮとする。更新後の変数Ｂ２が正の値になる場合には、変数Ｂ２の更新は終了する。他方で、更新後の変数Ｂ２が負の値になる場合には、変数ＴＢｘがインクリメントされると共にインクリメントの都度更新後の変数Ｂ２に対して変数Ｂ１が加算された値を、更なる更新後の変数Ｂ２とする。以下、同様の動作が、更新後の変数Ｂ２が正の値になるまで繰り返される。
【００８０】
このようなフロー情報テーブル１２の更新動作の手順を考慮すれば、図６に示すフローチャートは、図８のフローチャートに書き換えることができる。尚、図８に示すフローチャートは、実質的には図６に示すフローチャートと同様の動作を行っている。
【００８１】
図８に示すように、ステップＳ１１５からステップＳ１２０までの動作は、図６に示す動作と同一である。ステップＳ１２０に続いて、フロー別シェーパ部１１は、変数Ｂ２を更新する（ステップＳ１３１）。具体的には、フロー別シェーパ部１１は、変数Ｂ２から変数ＰＬＥＮを減算した値を、更新後の変数Ｂ２とする。このとき、フロー別シェーパ部１１は、更新後の変数Ｂ２をフロー情報テーブル１２に書き込んでもよいし、書き込まなくともよい。更新後の変数Ｂ２を書き込まない場合には、フロー別シェーパ部１１は、更新後の変数Ｂ２を内部のパラメータとして記憶しておくことが好ましい。
【００８２】
その後、フロー別シェーパ部１１は、更新後の変数Ｂ２が正の値を有しているか否かを判定する（ステップＳ１３２）。
【００８３】
ステップＳ１３２における判定の結果、更新後の変数Ｂ２が正の値を有していると判定される場合には（ステップＳ１３２：Ｙｅｓ）、その後、パケットシェーピング装置１は、動作を終了してもよいし、図５のステップＳ１０１以降の動作を再度繰り返してもよい。尚、ステップＳ１３１（或いは、後述のステップＳ１３４）の段階で更新後の変数Ｂ２がフロー情報テーブル１２に書き込まれていない場合には、フロー別シェーパ部１１は、更新後の変数Ｂ２が正の値を有していると判定されるタイミングで、更新後の変数Ｂ２をフロー情報テーブル１２に書き込んでもよい。
【００８４】
他方で、ステップＳ１３２における判定の結果、更新後の変数Ｂ２が正の値を有していないと判定される場合には（ステップＳ１３２：Ｎｏ）、フロー別シェーパ部１１は、変数ＴＢｘ（つまり、次時刻バッファ番号１２４）を更新する（ステップＳ１２４）。具体的には、フロー別シェーパ部１１は、変数ＴＢｘ（言い換えれば、ｘ）を１だけインクリメントした値を、更新後の次時刻バッファ番号１２４としてフロー情報テーブル１２に書き込む。
【００８５】
その後、フロー別シェーパ部１１は、変数Ｂ２を更新する（ステップＳ１３４）。具体的には、フロー別シェーパ部１１は、変数Ｂ２に変数Ｂ１を加算した値を、更新後の変数Ｂ２とする。このとき、フロー別シェーパ部１１は、更新後の変数Ｂ２をフロー情報テーブル１２に書き込んでもよいし、書き込まなくともよい。更新後の変数Ｂ２を書き込まない場合には、フロー別シェーパ部１１は、更新後の変数Ｂ２を内部のパラメータとして記憶しておくことが好ましい。
【００８６】
以降、ステップＳ１３２以降の動作が繰り返される。
【００８７】
以上説明したように、第１実施形態のパケットシェーピング装置１によれば、フロー情報テーブル１２を参照及び更新しながら、入力パケットを複数の時刻バッファ（ＴＢｋ）１４１のいずれかに書き込むことができる。このため、第１実施形態のパケットシェーピング装置１は、効率的なシェーピングを行うことができる。
【００８８】
第１実施形態のパケットシェーピング装置１によれば、最小パケット長（６４バイト）に固定されたサイズを有するタイムスロットで刻まれるタイムテーブルを備えるシェーピング装置と比較して、ハードウェア構成を比較的簡易にすることができる。例えば、最小パケット長（６４バイト）に固定されたサイズを有するタイムスロットで刻まれるタイムテーブルを備えるシェーピング装置では、１Ｇｂｐｓの伝送容量を有するネットワーク上で５０ミリ秒の時間幅のタイムテーブルを用意するためには、約１０万個のタイムスロット（つまり、１０万個のアドレス）が必要になる。一方で、第１実施形態のシェーピング装置１によれば、例えば１ミリ秒毎に切り替わる５０個の時刻バッファ（ＴＢｋ）１４１を用意すれば足りる。加えて、第１実施形態のパケットシェーピング装置１によれば、時刻バッファ（ＴＢｋ）１４１に書き込まれた入力パケットを管理するための管理情報のデータ量も削減することができる。
【００８９】
第１実施形態のパケットシェーピング装置１によれば、時刻バッファ（ＴＢｋ）１４１のキュー長情報１３３がバッファ上限値１３２を超える場合であっても、入力パケットの書き込みを許可することができる。例えば、バッファ上限値１３２が１２５ｋバイトであり且つキュー長情報１３３が１２４ｋバイトである時刻バッファ（ＴＢｋ）１４１に対して、新たに２ｋバイトの入力パケットの書き込みを許可することができる。従って、スループットの低下を抑えることができる。尚、を従って、スループットの低下を抑えることができる。尚、キュー長情報１３３がバッファ上限値１３２を超える場合に入力パケットの更なる書き込みを許可したとしても、次段以降の時刻バッファ（ＴＢｋ）１４１のバッファ上限値１３２を調整することができる。このため、パケットシェーピング装置１全体として、キュー長情報１３３がバッファ上限値１３２を超える影響が蓄積されることはない。
【００９０】
第１実施形態のパケットシェーピング装置１によれば、入力パケットが時刻バッファ（ＴＢｋ）に書き込まれた時点で、当該入力パケットがどのタイミングで読み出されるのかが確定する。つまり、入力パケットが読み出されるタイミングが意図せず遅延することは殆どない。加えて、第１実施形態のパケットシェーピング装置１によれば、入力パケットを新たに書き込んでから当該入力パケットが実際に読み出されるまでの遅延時間が許容遅延１２３を超える場合には、当該入力パケットを廃棄することができる。このため、入力パケットが時刻バッファ（ＴＢｋ）１４１内に意図せず長い間滞留してしまう不都合を好適に抑制することができる。
【００９１】
第１実施形態のパケットシェーピング装置１によれば、読出中の時刻バッファ（ＴＢｋ）１４１に対して入力パケットを書き込むことができる。従って、バッファリング遅延を少なく又は殆どなくすことができる。但し、読出中の時刻バッファ（ＴＢｋ）１４１に書込可能なサイズ（バイト数）は刻一刻と変化する。例えば、バッファ上限値１３２が１２５ｋバイト（言い換えれば、１ミリ秒で読出可能な上限サイズが１２５ｋバイト）である時刻バッファ（ＴＢｋ）１４１の読出しが始まってから０．５ミリ秒が経過した時点では、当該時刻バッファ（ＴＢｋ）１４１に書込可能なサイズ（バイト数）は、１２５ｋバイト×０．５＝６２．５ｋバイトとなっている。このため、フロー別シェーパ部１１は、読出中の時刻バッファ（ＴＢｋ）１４１に書込可能なサイズ（バイト数）は刻一刻と変化することを考慮しながら、読出中の時刻バッファ（ＴＢｋ）１４１に対して入力パケットを書き込むことが好ましい。
【００９２】
第１実施形態のパケットシェーピング装置１によれば、読出中の時刻バッファ（ＴＢｋ）１４１に対する入力パケットの書き込みを禁止することができる。このため、読出中の時刻バッファ（ＴＢｋ）１４１に書込可能なサイズ（バイト数）は刻一刻と変化することを考慮しながら入力パケットを書き込まなくともよくなる。
【００９３】
（２）第２実施形態
図９から図１４を参照して、第２実施形態のパケットシェーピング装置２について説明する。尚、上述した第１実施形態のパケットシェーピング装置２と同一の構成及び動作については、同一の参照符号及びステップ番号を付与することで、それらの詳細な説明については省略する。加えて、第２実施形態に対して、第１実施形態の構成及び動作の全部又は一部の各種態様を適宜適用してもよい。逆に、第１実施形態に対して、第２実施形態の構成及び動作の全部又は一部の各種態様を適宜適用してもよい。
【００９４】
（２−１）パケットシェーピング装置の構成
図９を参照して、第２実施形態のパケットシェーピング装置２の構成について説明する。図９は、第２実施形態のパケットシェーピング装置２の機能ブロックの一例を示すブロック図である。
【００９５】
図９（ａ）及び図９（ｂ）に示すように、第２実施形態のパケットシェーピング装置２は、第１実施形態のパケットシェーピング装置１と同様に、フロー別シェーパ部２１と、フロー情報テーブル２２と、バッファ管理テーブル２３と、バッファ部２４とを備えている。
【００９６】
フロー別シェーパ部２１は、上述のフロー別シェーパ部１１と同様である。具体的には、フロー別シェーパ部２１は、パケットシェーピング装置２に入力される入力パケットを、バッファ部２４が備えるｎ個の時刻バッファ（ＴＢｋ）２４１のいずれかに書き込む。
【００９７】
第２実施形態では、図９（ｂ）に示すように、ｎ個の時刻バッファ（ＴＢｋ）２４１の夫々は、ｂ（但し、ｂは１以上の整数）個のクラスｊ（但し、ｊは、１≦ｊ≦ｂを満たす整数）用バッファ２４１２を備えている。尚、第２実施形態における「クラス」とは、例えば、入力パケットが送信又は受信される契約者や入力パケットのサービス等に応じて個別に割り当てられる優先度を意味する趣旨である。従って、フロー別シェーパ部２１は、入力パケットを、ｂ個のクラスｊ用バッファ２４１２のうち、入力パケットのクラスに対応する少なくとも一つのクラスｊ用バッファ２４１２に書き込むことが好ましい。フロー別シェーパ部２１は、フロー情報テーブル２２及びバッファ管理テーブル２３の少なくとも一方に基づいて、ｎ個の時刻バッファ（ＴＢｋ）２４１のうちの入力パケットを書き込むべき少なくとも一つの時刻バッファ２４１を決定することが好ましい。加えて、フロー別シェーパ部２１は、フロー情報テーブル２２及びバッファ管理テーブル２３の少なくとも一方に基づいて、決定された一つの時刻バッファ２４１が備えるｂ個のクラスｊ用バッファ２４１２のうちの入力パケットを書き込むべき少なくとも一つのクラスｊ用バッファ２４１２を決定することが好ましい。
【００９８】
尚、ｂ個のクラスｊ用バッファ２４１２は、時刻バッファ（ＴＢｋ）２４１内で物理的に又は論理的に区別されていてもよいし、物理的に又は論理的に区別されていなくともよい。ｂ種類のクラスに応じた入力パケットを区別して記録することができるのであれば、時刻バッファ（ＴＢｋ）２４１は、上述した時刻バッファ（ＴＢｋ）１４１と同一であってもよい。
【００９９】
フロー情報テーブル２２は、入力パケットのフローに関する情報を、フロー毎及びクラス毎に含むテーブルである。フロー情報テーブル２２の詳細については図１０を参照しながら後に詳述するため、ここでの詳細な説明については省略する。
【０１００】
バッファ管理テーブル２３は、ｎ個の時刻バッファ（ＴＢｋ）２４１をクラス毎に管理するための情報を含むテーブルである。バッファ管理テーブル２３の詳細については図１１を参照しながら後に詳述するため、ここでの詳細な説明については省略する。
【０１０１】
バッファ部２４は、ｎ個の時刻バッファ（ＴＢｋ）２４１と、セレクタ２４２とを備えている。
【０１０２】
ｎ個の時刻バッファ（ＴＢｋ）２４１の夫々は、セレクタ２４１１と、ｂ個のクラスｊ用バッファ２４１２とを備えている。ｂ個のクラスｊ用バッファ２４１２の夫々は、フロー別シェーパ部２１によって書き込まれた入力パケットを一時的に格納する。セレクタ２４１１は、ｂ個のクラスｊ用バッファ２４１２の中から、入力パケットを書き込むべき少なくとも一つのクラスｊ用バッファ２４１２を選択する。また、セレクタ２４１１は、ｂ個のクラスｊ用バッファ２４１２の中から、入力パケットを読み出すべき少なくとも一つのクラスｊ用バッファ２４１２を選択する。セレクタ２４１１は、選択した少なくとも一つのクラスｊ用バッファ２４１２に書き込まれている入力パケットを、出力パケットとして読み出す。
【０１０３】
ｎ個の時刻バッファ（ＴＢｋ）２４１の夫々の上限サイズは、各時刻バッファ（ＴＢｋ）２４１から所定時間Ｔ１内に読出可能な最大のデータ量に設定されている。但し、ｎ個の時刻バッファ（ＴＢｋ）２４１の夫々の上限サイズは、各時刻バッファ（ＴＢｋ）２４１から所定時間Ｔ１以内に読出可能な最大のデータ量に対して所定のマージン（例えば、１パケットに相当するサイズのマージン）を加味した値に設定されていてもよい。
【０１０４】
セレクタ２４２は、上述したセレクタ１４２と同様に、所定時間Ｔ１毎に、ｎ個の時刻バッファ（ＴＢｋ）２４１の中から書き込まれている入力パケットを読み出す一つの時刻バッファ（ＴＢｋ）２４１を順次選択する。また、セレクタ２４２は、所定時間Ｔ１が経過する間、選択した一つの時刻バッファ（ＴＢｋ）２４１に書き込まれている入力パケットを、出力パケットとして読み出す。
【０１０５】
尚、第２実施形態のパケットシェーピング装置２のハードウェア構成は、第１実施形態のパケットシェーピング装置１のハードウェア構成と同様であってもよい。
【０１０６】
（２−２）フロー情報テーブル及びバッファ管理テーブルのデータ構造
図１０及び図１１を参照して、第２実施形態のフロー情報テーブル２２及びバッファ管理テーブル２３のデータ構造について説明する。図１０は、第２実施形態のフロー情報テーブル２２のデータ構造を示すテーブル図である。図１１は、第２実施形態のバッファ管理テーブル２３のデータ構造を示すテーブル図である。
【０１０７】
図１０に示すように、フロー情報テーブル２２は、フローＩＤ２２１と、クラスＩＤ２２７と、入力可能上限バイト数２２２と、許容遅延２２３と、次時刻バッファ番号２２４と、入力可能残りバイト数２２５とを含むフロー情報レコード２２６を、フロー毎及びクラス毎に備えている。
【０１０８】
フローＩＤ２２１は、上述したフローＩＤ１２１と同様の情報であり、フロー情報レコード２２６に対応するフローを識別するための識別情報（ＩＤ）を示す。
【０１０９】
クラスＩＤ２２７は、フロー情報レコード２２６に対応するクラスを識別するための識別情報（ＩＤ）を示す。
【０１１０】
入力可能上限バイト数２２２は、上述した入力可能上限バイト数１２２と同様の情報である。第２実施形態では、入力可能上限バイト数２２２は、各時刻バッファ（ＴＢｋ）２４１に書込可能な上限バイト数を、フロー毎且つクラス毎に示す。例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「１」となる入力パケットが、各時刻バッファ（ＴＢｋ）２４１に最大３００バイト書込可能であることを示す入力可能上限バイト数２２２の例を示している。同様に、例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「２」となる入力パケットが、各時刻バッファ（ＴＢｋ）２４１に最大５００バイト書込可能であることを示す入力可能上限バイト数２２２の例を示している。同様に、例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「ｂ」となる入力パケットが、各時刻バッファ（ＴＢｋ）２４１に最大２０００バイト書込可能であることを示す入力可能上限バイト数２２２の例を示している。
【０１１１】
或いは、第２実施形態では、入力可能上限バイト数２２２は、各時刻バッファ（ＴＢｋ）２４１に書込可能な上限バイト数を、フロー毎に個別に且つ優先度の高いクラス順にまとめて示す。例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「１」以下となる入力パケットが、各時刻バッファ（ＴＢｋ）２４１に最大３００バイト書込可能であることを示す入力可能上限バイト数２２２の例を示している。同様に、例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「２」以下となる入力パケットが、各時刻バッファ（ＴＢｋ）２４１に最大５００バイト書込可能であることを示す入力可能上限バイト数２２２の例を示している。同様に、例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「ｂ」以下となる入力パケットが、各時刻バッファ（ＴＢｋ）２４１に最大２０００バイト書込可能であることを示す入力可能上限バイト数２２２の例を示している。
【０１１２】
尚、入力可能上限バイト数２２２には、各フロー及び各クラスの帯域（レート）に応じて固定的なバイト数が設定されてもよい。或いは、入力可能上限バイト数２２２は、適宜変更されてもよい。
【０１１３】
許容遅延２２３は、上述した許容遅延１２３と同様の情報である。第２実施形態では、許容遅延２２３は、入力パケットを新たに書き込んでから当該入力パケットが実際に読み出されるまでの遅延時間の許容値を、フロー毎に且つクラス毎に示す。
【０１１４】
例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「１」となる入力パケットの許容遅延２２３が３０ミリ秒である例を示している。従って、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「１」となる入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が３０ミリ秒以下であれば、ｎ個の時刻バッファ（ＴＢｋ）２４１のいずれかに書き込まれることが好ましい。他方で、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「１」となる入力パケットは、入力パケットを書き込んでから実際に読み出されるまでの遅延時間が３０ミリ秒を超えるのであれば、ｎ個の時刻バッファ（ＴＢｋ）２４１のいずれかに書き込まれない（例えば、破棄される）ことが好ましい。
【０１１５】
次時刻バッファ番号２２４は、上述した次時刻バッファ番号１２４と同様の情報である。第２実施形態では、次時刻バッファ番号２２４は、入力パケットを書き込むべき一つの時刻バッファ（ＴＢｋ）２４１の識別番号を、フロー毎に且つクラス毎に個別に示す。例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「１」となる入力パケットが、時刻バッファ（ＴＢ１）２４１に書き込まれるべきであることを示す次時刻バッファ番号２２４の例を示している。
【０１１６】
入力可能残りバイト数２２５は、上述した入力可能残りバイト数１２５と同様の情報である。第２実施形態では、入力可能残りバイト数２２５は、次時刻バッファ番号２２４によって特定される一つの時刻バッファ（ＴＢｋ）２４１に書込可能な残りのバイト数を、フロー毎に且つクラス毎に示す。例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「１」となる入力パケットが、次時刻バッファ番号２２４によって特定される時刻バッファ（ＴＢｋ）２４１にあと１００バイト書込可能であることを示す入力可能残りバイト数２２５の例を示している。同様に、例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「ｂ」となる入力パケットが、次時刻バッファ番号２２４によって特定される時刻バッファ（ＴＢｋ）２４１にあと１５２０バイト書込可能であることを示す入力可能残りバイト数２２５の例を示している。
【０１１７】
或いは、第２実施形態では、入力可能残りバイト数２２５は、次時刻バッファ番号２２４によって特定される一つの時刻バッファ（ＴＢｋ）２４１に書込可能な残りのバイト数を、フロー毎に個別に且つ優先度の高いクラス順にまとめて示す。例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「１」以下となる入力パケットが、次時刻バッファ番号２２４によって特定される時刻バッファ（ＴＢｋ）２４１にあと１００バイト書込可能であることを示す入力可能残りバイト数２２５の例を示している。同様に、例えば、図１０は、フローＩＤ２２１が「＃１」となるフローの入力パケットのうちクラスＩＤ２２７が「ｂ」以下となる入力パケットが、次時刻バッファ番号２２４によって特定される時刻バッファ（ＴＢｋ）２４１にあと１５２０バイト書込可能であることを示す入力可能残りバイト数２２５の例を示している。
【０１１８】
図１１に示すように、バッファ管理テーブル２３は、時刻バッファ識別番号２３１と、クラスＩＤ２３６と、バッファ上限値２３２と、クラス上限値２３７と、クラスキュー長２３３と、加算クラス２３８と、判定キュー長２３９と、読出中フラグ２３４とを含むバッファ管理レコード２３５を、時刻バッファ（ＴＢｋ）２４１毎に且つクラス毎に備えている。
【０１１９】
時刻バッファ識別番号２３１は、上述した時刻バッファ識別番号１３１と同様の情報であり、バッファ管理レコード２３５に対応する時刻バッファ（ＴＢｋ）２４１を識別するための識別番号を示す。
【０１２０】
クラスＩＤ２２７は、バッファ管理レコード２３５に対応するクラスを識別するための識別情報（ＩＤ）を示す。
【０１２１】
バッファ上限値２３２は、上述したバッファ上限値１３２と同様の情報であり、各時刻バッファ（ＴＢｋ）２４１に書込可能な上限バイト数を示す。
【０１２２】
クラス上限値２３７は、各時刻バッファ（ＴＢｋ）２４１に書込可能な上限バイト数を、優先度の高いクラス順にまとめて示す。つまり、クラス上限値２３７は、各時刻バッファ（ＴＢｋ）２４１が備えるｂ個のクラスｊ用バッファ２４１２の夫々に書き込み可能な上限バイト数を、優先度の高いクラス順にまとめて示す。例えば、図１１は、時刻バッファ（ＴＢ１）２４１に対して、クラスＩＤ２３６が「１」以下となる入力パケットを最大７００００バイト書込可能であり、クラスＩＤ２３６が「２」以下となる入力パケットを最大１０００００バイト書込可能であり、クラスＩＤ２３６が「ｂ」以下となる入力パケットを最大１２５０００バイト書込可能であることを示すクラス上限値２３２の例を示している。
【０１２３】
クラスキュー長２３３は、上述したキュー長１３３と同様の情報である。第２実施形態では、クラスキュー長２３３は、各時刻バッファ（ＴＢｋ）２４１に既に書き込まれている入力パケットのバイト数を、クラス毎に示す。つまり、クラスキュー長２３３は、各時刻バッファ（ＴＢｋ）２４１が備えるｂ個のクラスｊ用バッファ２４１２の夫々に既に書き込まれている入力パケットのバイト数を示す。例えば、図１１は、時刻バッファ（ＴＢ１）２４１に対して、クラスＩＤ２３６が「１」となる入力パケットが既に３４０００バイト書き込まれており、クラスＩＤ２３６が「２」となる入力パケットが既に１２０００バイト書き込まれており、クラスＩＤ２３６が「ｂ」となる入力パケットが既に１１７８００バイト書き込まれていることを示すクラスキュー長２３３の例を示している。
【０１２４】
加算クラス２３８は、判定用キュー長２３９を算出するために用いられるクラスキュー長２３３を特定するためのクラスＩＤ２３６を示す。具体的には、加算クラス２３８は、判定用キュー長２３９を算出するために加算されるクラスキュー長２３３を特定するためのクラスＩＤ２３６を示す。
【０１２５】
判定キュー長２３９は、加算クラス２３８によって示されるクラスＩＤ２３６に対応するクラスキュー長２３３が加算された値を有している。例えば、図１１は、「１」というクラスＩＤ２３６に対応する時刻バッファ（ＴＢ１）の判定キュー長２３９が、クラスＩＤ２３６が「１」となるクラスキュー長２３３の値「３４００」となる例を示している。同様に、例えば、図１１は、「２」というクラスＩＤ２３６に対応する時刻バッファ（ＴＢ１）の判定キュー長２３９が、クラスＩＤ２３６が「１」又は「２」となるクラスキュー長２３３の値「３４００」及び「１２０００」和である「１５４００」となる例を示している。同様に、例えば、図１１は、「ｂ」というクラスＩＤ２３６に対応する時刻バッファ（ＴＢ１）の判定キュー長２３９が、クラスＩＤ２３６が「１」、「２」、・・・、又は「ｂ」となるクラスキュー長２３３の値「３４００」、「１２０００」、・・・、及び「１１７８００」和である「１４３５００」となる例を示している。
【０１２６】
読出中フラグ２３４は、上述した読出中フラグ１３４と同様の情報であり、ｎ個の時刻バッファ（ＴＢｋ）２４１のうちの読出中の一つの時刻バッファ（ＴＢｋ）２４１を識別するフラグである。
【０１２７】
（２−３）パケットシェーピング装置の動作
図１２から図１４を参照して、第２実施形態のパケットシェーピング装置２の動作について説明する。図１２は、第２実施形態のパケットシェーピング装置２の動作の一部の流れを示すフローチャートである。図１３は、第２実施形態のパケットシェーピング装置２の動作の他の一部の流れを示すフローチャートである。図１４は、第２実施形態のパケットシェーピング装置２の動作の他の一部の流れを示すフローチャートである。
【０１２８】
図１２に示すように、フロー別シェーパ部２１は、入力パケットを取得する（ステップＳ１０１）。その後、フロー別シェーパ部２１は、取得した入力パケットに含まれるパケット管理情報を取得する（ステップＳ２０２）。パケット管理情報は、例えば、入力パケットのフローを識別する変数ＦＩＤ（フローＩＤ）や、入力パケットのクラスを識別する変数ＣＬＡＳＳ（クラスＩＤ）や、入力パケットのサイズ（バイト数）を示す変数ＰＬＥＮ（Packet LENgth）等を含んでいる。
【０１２９】
その後、フロー別シェーパ部２１は、フロー情報テーブル２２から、ステップＳ２０２で取得したＦＩＤと一致するフローＩＤ２２１及びステップＳ２０２で取得したＣＬＡＳＳと一致するクラスＩＤ２２７を有するフロー情報レコード２２６を取得する（ステップＳ２０３）。以降、第１実施形態と同様に、「変数ＴＢｘ」、「変数Ｎ」、「変数Ｂ１」及び「変数Ｂ２」という表記を使用する。
【０１３０】
ステップＳ２０３の動作に続いて、相前後して又は並行して、フロー別シェーパ部２１は、バッファ管理テーブル２３から、バッファ管理レコード２３５を取得する（ステップＳ１０４）。例えば、フロー別シェーパ部２１は、読出中フラグ２３４を取得することで、現在読出中の時刻バッファ（ＴＢｋ）２４１を認識する。以降、第１実施形態と同様に、「変数ＴＢｙ」という表記を使用する。
【０１３１】
続いて、フロー別シェーパ部２１は、第１実施形態と同様の動作（具体的には、ステップＳ１０５からステップＳ１１２の動作）を行うことで、ステップＳ１０１で取得した入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）２４１を設定する。
【０１３２】
続いて、フロー別シェーパ部２１は、時刻バッファ（ＴＢｚ）２４１内に、入力パケットのクラスに対応する空きがあるか否かを判定する（ステップＳ２１３）。つまり、フロー別シェーパ部２１は、時刻バッファ（ＴＢｚ）２４１が備えるｂ個のクラスｊ用バッファ２４１２のうちの入力パケットのクラスに対応する少なくとも一つのクラスｊ用バッファ２４１２に空きがあるか否かを判定する。具体的には、フロー別シェーパ部２１は、バッファ管理テーブル２３から、時刻バッファ識別番号２３１が「ＴＢｚ」となり且つクラスＩＤ２３６が「ＣＬＡＳＳ」となるバッファ管理レコード２３５を取得する。フロー別シェーパ部２１は、取得したバッファ管理レコード２３５の判定キュー長２３９がクラス上限値２３７よりも小さいか否かを判定する。判定キュー長２３９がクラス上限値２３７よりも小さいと判定される場合には、フロー別シェーパ部２１は、時刻バッファ（ＴＢｚ）２４１内に、入力パケットのクラスに対応する空きがあると判定してもよい。他方で、判定キュー長２３９がクラス上限値２３７よりも小さくないと判定される場合には、フロー別シェーパ部２１は、時刻バッファ（ＴＢｚ）２４１内に、入力パケットのクラスに対応する空きがないと判定してもよい。
【０１３３】
ステップＳ２１３における判定の結果、時刻バッファ（ＴＢｚ）２４１内に、入力パケットのクラスに対応する空きがないと判定される場合には（ステップＳ２１３：Ｎｏ）、フロー別シェーパ部２１は、ＴＢｚ（言い換えれば、ｚ）を１だけインクリメントした後（ステップＳ１１４）、ステップＳ２１３の動作を繰り返す。
【０１３４】
他方で、ステップＳ２１３における判定の結果、時刻バッファ（ＴＢｚ）２４１内に、入力パケットのクラスに対応する空きがあると判定される場合には（ステップＳ２１３：Ｙｅｓ）、フロー別シェーパ部２１は、図１３に示す動作を行う。
【０１３５】
図１３に示すように、フロー別シェーパ部２１は、入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）２４１の読出時間と、現在読出中の時刻バッファ（ＴＢｙ）２４１の読出時間との間の差分が、変数Ｎ（つまり、許容遅延２２３）よりも大きいか否かを判定する（ステップＳ１１５）。
【０１３６】
ステップＳ１１５における判定の結果、ＴＢｚ−ＴＢｙ（つまり、遅延時間）が変数Ｎよりも大きいと判定される場合には（ステップＳ１１５：Ｙｅｓ）、フロー別シェーパ部２１は、ステップＳ１０１で取得した入力パケットを廃棄する（ステップＳ１１６）。その後、パケットシェーピング装置２は、動作を終了してもよいし、図１２のステップＳ１０１以降の動作を再度繰り返してもよい。
【０１３７】
他方で、ステップＳ１１５における判定の結果、ＴＢｚ−ＴＢｙ（つまり、遅延時間）が変数Ｎよりも大きくないと判定される場合には（ステップＳ１１５：Ｎｏ）、フロー別シェーパ２１は、ステップＳ１０１で取得した入力パケットを、時刻バッファ（ＴＢｚ）２４１のうちの入力パケットのクラスに対応する領域に書き込む（ステップＳ２１７）。より具体的には、フロー別シェーパ２１は、ステップＳ１０１で取得した入力パケットを、時刻バッファ（ＴＢｚ）２４１が備えるクラスｊ（但し、ｊ＝ＣＬＡＳＳ）用バッファ２４１２に書き込む。
【０１３８】
続いて、フロー別シェーパ部２１は、時刻バッファ識別番号２３１が「ＴＢｚ」となり且つクラスＩＤ２３６が「ＣＬＡＳＳ」となるバッファ管理レコード２３５のクラスキュー長２３３を更新する（ステップＳ２１８）。具体的には、フロー別シェーパ部２１は、更新前のクラスキュー長２３３に対して変数ＰＬＥＮ（つまり、今回書き込んだ入力パケットのサイズ（バイト数））を加算した値を、更新後のキュー長２３３としてバッファ管理テーブル２３に書き込む。
【０１３９】
続いて、フロー別シェーパ部２１は、バッファ管理テーブル２３から、時刻バッファ識別番号２３１が「ＴＢｚ」となるバッファ管理レコード２３５に含まれる各クラスの加算クラス２３８及び判定キュー長２３９を取得する（ステップＳ２３１）。つまり、図１１に示すバッファ管理テーブル２３を例にあげれば、時刻バッファ識別番号２３１が「ＴＢｚ」となり且つクラスＩＤ２３６が「１」から「ｂ」となるｂ個のバッファ管理レコード２３５の夫々の加算クラス２３８及び判定キュー長２３９を取得する。
【０１４０】
続いて、フロー別シェーパ部２１は、変数ｉに初期値「１」を設定する（ステップＳ２３２）。
【０１４１】
その後、フロー別シェーパ部２１は、時刻バッファ識別番号２３１が「ＴＢｚ」となり且つクラスＩＤ２３６が「ｉ」となるバッファ管理レコード２３５の加算クラス２３８に、変数ＣＬＡＳＳが含まれているか否かを判定する（ステップＳ２３３）。
【０１４２】
ステップＳ２３３における判定の結果、クラスＩＤ２３６が「ｉ」となるバッファ管理レコード２３５の加算クラス２３８に変数ＣＬＡＳＳが含まれていると判定される場合には（ステップＳ２３３：Ｙｅｓ）、フロー別シェーパ部２１は、判定キュー長２３９を更新する（ステップＳ２３４）。具体的には、フロー別シェーパ部２１は、時刻バッファ識別番号２３１が「ＴＢｚ」となり且つクラスＩＤ２３６が「ｉ」となるバッファ管理レコード２３５の判定キュー長２３９を更新する。このとき、フロー別シェーパ部２１は、更新前の判定キュー長２３９に対して変数ＰＬＥＮ（つまり、今回書き込んだ入力パケットのサイズ（バイト数））を加算した値を、更新後の判定キュー長２３９としてバッファ管理テーブル２３に書き込む。
【０１４３】
他方で、ステップＳ２３３における判定の結果、クラスＩＤ２３６が「ｉ」となるバッファ管理レコード２３５の加算クラス２３８に変数ＣＬＡＳＳが含まれていないと判定される場合には（ステップＳ２３３：Ｎｏ）、フロー別シェーパ部２１は、ステップＳ２３４の動作を行わなくともよい。
【０１４４】
その後、フロー別シェーパ部２１は、変数ｉがクラスの種類数（つまり、クラスｊ用バッファ２４１２の数）ｂと一致するか否か（つまり、ｉ＝ｂとなるか否か）を判定する（ステップＳ２３５）。
【０１４５】
ステップＳ２３５における判定の結果、変数ｉがクラスの種類数ｂと一致しない場合には（ステップＳ２３５：Ｎｏ）、フロー別シェーパ部２１は、変数ｉを１だけインクリメントした後（ステップＳ２３６）、ステップＳ２３３の動作を繰り返す。
【０１４６】
他方で、ステップＳ２３５における判定の結果、変数ｉがクラスの種類数ｂと一致する場合には（ステップＳ２３５：Ｙｅｓ）、フロー別シェーパ部２１は、図１４に示す動作を行う。
【０１４７】
図１４に示すように、フロー別シェーパ部２１は、時刻バッファ識別番号２３１が「ＴＢｚ」となるバッファ管理レコード２３５のクラスキュー長２３３の総和が、時刻バッファ識別番号２３１が「ＴＢｚ」となるバッファ管理レコード２３５のバッファ上限値２３２よりも大きいか否かを判定する（ステップＳ２１９）。
【０１４８】
ステップＳ２１９における判定の結果、クラスキュー長２３３の総和がバッファ上限値２３２よりも大きいと判定される場合には（ステップＳ２１９：Ｙｅｓ）、フロー別シェーパ部２１は、時刻バッファ（ＴＢｚ）の次段以降の空きがある時刻バッファ（ＴＢｚ＋ａ（但し、ａは、１≦ａ＜ｎを満たす整数））２４１のバッファ上限値２３２を更新する（ステップＳ２２０）。具体的には、フロー別シェーパ部２１は、時刻バッファ番号が「ＴＢｚ＋ａ」となるバッファ管理レコード２３５のバッファ上限値２３２から、クラスキュー長２３３の総和がバッファ上限値２３２を超過したバイト数だけ減算する。フロー別シェーパ部２１は、減算の結果得られた値を、時刻バッファ識別番号２３１が「ＴＢｚ＋ａ」となるバッファ管理レコード２３５の更新後のバッファ上限値２３２としてバッファ管理テーブル２３に書き込む。
【０１４９】
加えて、ステップＳ２１９における判定の結果、クラスキュー長２３３の総和がバッファ上限値２３２よりも大きいと判定される場合には（ステップＳ２１９：Ｙｅｓ）、フロー別シェーパ部２１は、時刻バッファ（ＴＢｚ）の次段以降の空きがある時刻バッファ（ＴＢｚ＋ａ）２４１のクラスであって且つ予め指定されたクラスのクラス上限値２３７を更新する（ステップＳ２２０）。具体的には、フロー別シェーパ部２１は、時刻バッファ番号が「ＴＢｚ＋ａ」となり且つ予め指定されたクラスに対応するバッファ管理レコード２３５のクラス上限値２３７から、クラスキュー長２３３の総和がバッファ上限値２３２を超過したバイト数だけ減算する。フロー別シェーパ部２１は、減算の結果得られた値を、時刻バッファ識別番号２３１が「ＴＢｚ＋ａ」となり且つ予め指定されたクラスに対応するバッファ管理レコード２３５の更新後のクラス上限値２３７としてバッファ管理テーブル２３に書き込む。
【０１５０】
尚、ステップＳ２２０における「クラスの予めの指定」は、フロー別シェーパ部２１によって任意に行われてもよいし、パケットシェーピング装置２のユーザないしはオペレータの指示によって行われてもよい。いずれにせよ、超過したバイト数を減算するクラスが予め何らかの方法によって指定されていればよい。
【０１５１】
他方で、ステップＳ２１９における判定の結果、クラスキュー長２３３の総和がバッファ上限値２３２よりも大きくないと判定される場合には（ステップＳ２１９：Ｎｏ）、フロー別シェーパ部２１は、ステップＳ２２０の動作を行わなくともよい。
【０１５２】
続いて、フロー別シェーパ部２１は、第１実施形態と同様の動作（具体的には、ステップＳ１２１からステップＳ１２７の動作）をクラスＩＤ２２７が「ＣＬＡＳＳ」となるフロー情報レコード２２６に対して行う。その結果、クラスＩＤ２２７が「ＣＬＡＳＳ」となるフロー情報レコード２２６を含むフロー情報テーブル２２が更新される。
【０１５３】
以上説明したように、第２実施形態のパケットシェーピング装置２によれば、第１実施形態のパケットシェーピング装置１が行う動作を、更に入力パケットのクラス毎に区別しながら行うことができる。このため、第２実施形態のパケットシェーピング装置２は、クラス毎の区別を行いながら、第１実施形態のパケットシェーピング装置１が享受する効果と同様の効果を好適に享受することができる。
【０１５４】
例えば、遅延に対する許容度が相対的に小さいサービス（例えば、音声トラヒック）における入力パケットと、遅延に対する許容度が相対的に大きいサービス（例えば、データ通信トラヒック）における入力パケットとの双方を、夫々のサービスに対応するクラスを考慮しながら好適にシェーピングすることができる。より具体的には、例えば、音声トラヒックを優先度が高いクラス１用バッファ２４１２に書き込み且つデータ通信トラヒックを優先度が相対的に低いクラス２用バッファ２４１２に書き込むことができる。その結果、データ通信トラヒックの輻輳により音声トラヒックが遅延を被ることが殆ど或いは全くなくなる。
【０１５５】
（２−４）変形動作例
続いて、図１５から図１９を参照して、第２実施形態のパケットシェーピング装置２が行う変形動作例について説明する。
【０１５６】
（２−４−１）フロー情報テーブル及びバッファ管理テーブルのデータ構造
図１５及び図１６を参照して、変形動作例に用いられるフロー情報テーブル３２及びバッファ管理テーブル３３のデータ構造について説明する。図１５は、変形動作例に用いられるフロー情報テーブル３２のデータ構造を示すテーブル図である。図１６は、変形動作例に用いられるバッファ管理テーブル３３のデータ構造を示すテーブル図である。
【０１５７】
図１５に示すように、変形動作例に用いられるフロー情報テーブル３２は、上述したフロー情報テーブル１２と同様に、フローＩＤ３２１と、レート情報３２７と、入力可能上限バイト数３２２と、許容遅延３２３と、次時刻バッファ番号３２４と、入力可能残りバイト数３２５とを含むフロー情報レコード３２６を、フロー毎に備えている。
【０１５８】
フローＩＤ３２１は、上述したフローＩＤ１２１と同様の情報であり、フロー情報レコード３２６に対応するフローを識別するための識別情報（ＩＤ）を示す。
【０１５９】
レート情報３２７は、フロー情報レコード３２６内でのレートを識別するための識別情報（ＩＤ）を示す。尚、変形動作例では、レートとして、高レート（ＨＩＧＨ：ハイレート）と低レート（ＬＯＷ：ローレート）の２種類を用いているが、更に多種類のレートを用いてもよい。
【０１６０】
尚、変形動作例における「低レート」は、例えば、時刻バッファ（ＴＢｋ２４１）に対する書き込みが最低源保証されているデータ量の入力パケットの書き込みに対応するレートを示している。他方で、変形動作例における「高レート」は、例えば、時刻バッファ（ＴＢｋ２４１）に対する書き込みが最低源保証されているデータ量とは別の余剰分のデータ量の入力パケットの書き込みに対応するレートを示している。
【０１６１】
入力可能上限バイト数３２２は、上述した入力可能上限バイト数１２２と同様の情報である。変形動作例では、入力可能上限バイト数３２２は、各時刻バッファ（ＴＢｋ）２４１に書込可能な上限バイト数を、フロー毎且つレート毎に示す。
【０１６２】
許容遅延３２３は、上述した許容遅延１２３と同様の情報である。
【０１６３】
次時刻バッファ番号３２４は、上述した次時刻バッファ番号１２４と同様の情報である。
【０１６４】
入力可能残りバイト数３２５は、上述した入力可能残りバイト数１２５と同様の情報である。変形動作例では、入力可能残りバイト数３２５は、次時刻バッファ番号３２４によって特定される一つの時刻バッファ（ＴＢｋ）２４１に書込可能な残りのバイト数を、フロー毎に且つレート毎に示す。
【０１６５】
図１６に示すように、バッファ管理テーブル３３は、時刻バッファ識別番号３３１と、バッファ閾値３３２と、キュー長３３３と、読出中フラグ３３４とを含むバッファ管理レコード３３５を、時刻バッファ（ＴＢｋ）２４１毎に備えている。
【０１６６】
時刻バッファ識別番号３３１は、上述した時刻バッファ識別番号１３１と同様の情報である。
【０１６７】
バッファ閾値３３２は、上述したバッファ上限値１３２と同様の情報である。但し、変形動作例では、ｎ個の時刻バッファ（ＴＢｋ）２４１の夫々の上限サイズは、各時刻バッファ（ＴＢｋ）２４１から所定時間Ｔ１以内に読出可能な最大のデータ量に対して所定のマージン（例えば、１パケットに相当するサイズのマージン）を加味した値に設定されていることが好ましい。バッファ閾値３３２は、時刻バッファ（ＴＢｋ）２４１の上限サイズ（つまり、マージンを加味した上限サイズ）に代えて、時刻バッファ（ＴＢｋ）２４１から所定時間Ｔ１以内に読出可能な最大のデータ量（つまり、マージンを加味しない上限サイズ）を示す。
【０１６８】
キュー長３３３は、上述したキュー長１３３と同様の情報である。
【０１６９】
読出中フラグ３３４は、上述した読出中フラグ１３４と同様の情報である。
【０１７０】
（２−４−２）パケットシェーピング装置の動作
図１７から図１９を参照して、第２実施形態のパケットシェーピング装置２の変形動作例の流れについて説明する。図１７は、第２実施形態のパケットシェーピング装置２の変形動作例の一部の流れを示すフローチャートである。図１８は、第２実施形態のパケットシェーピング装置２の変形動作例の他の一部の流れを示すフローチャートである。図１９は、第２実施形態のパケットシェーピング装置２の変形動作例の他の一部の流れを示すフローチャートである。
【０１７１】
図１７に示すように、フロー別シェーパ部２１は、入力パケットを取得する（ステップＳ１０１）。その後、フロー別シェーパ部２１は、取得した入力パケットに含まれるパケット管理情報を取得する（ステップＳ１０２）。パケット管理情報は、例えば、入力パケットのフローを識別する変数ＦＩＤ（フローＩＤ）や、入力パケットのサイズ（バイト数）を示す変数ＰＬＥＮ（Packet LENgth）等を含んでいる。
【０１７２】
その後、フロー別シェーパ部２１は、フロー情報テーブル３２から、ステップＳ２０２で取得したＦＩＤと一致するフローＩＤ３２１を有するフロー情報レコード３２６を取得する（ステップＳ３０３）。以降、第１実施形態と同様に、「変数ＴＢｘ」及び「変数Ｎ」という表記を使用する。加えて、フロー情報レコード３２６に含まれ且つ低レートに対応する入力可能上限バイト数３２２を、「最低保証上限バイト数」と適宜称すると共に、「変数Ｂ１Ｌ」と表記する。同様に、フロー情報レコード３２６に含まれ且つ高レートに対応する入力可能上限バイト数３２２を、「余剰帯域上限バイト数」と適宜称すると共に「変数Ｂ１Ｈ」と表記する。同様に、フロー情報レコード３２６に含まれ且つ低レートに対応する入力可能残りバイト数３２５を、「最低保証残りバイト数」と適宜称すると共に、「変数Ｂ２Ｌ」と表記する。同様に、フロー情報レコード３２６に含まれ且つ高レートに対応する入力可能残りバイト数３２５を、「余剰帯域残りバイト数」と適宜称すると共に「変数Ｂ２Ｈ」と表記する。
【０１７３】
ステップＳ３０３の動作に続いて、相前後して又は並行して、フロー別シェーパ部２１は、バッファ管理テーブル３３から、バッファ管理レコード３３５を取得する（ステップＳ１０４）。例えば、フロー別シェーパ部２１は、読出中フラグ３３４を取得することで、現在読出中の時刻バッファ（ＴＢｋ）２４１を認識する。以降、第１実施形態と同様に、「変数ＴＢｙ」という表記を使用する。
【０１７４】
続いて、フロー別シェーパ部２１は、第１実施形態と同様の動作（具体的には、ステップＳ１０５からステップＳ１１２の動作）を行うことで、ステップＳ１０１で取得した入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）２４１を設定する。その後、フロー別シェーパ部２１は、図１８に示す動作を行う。
【０１７５】
図１８に示すように、フロー別シェーパ部２１は、入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）２４１の読出時間と、現在読出中の時刻バッファ（ＴＢｙ）２４１の読出時間との間の差分が、変数Ｎ（つまり、許容遅延３２３）よりも大きいか否かを判定する（ステップＳ１１５）。
【０１７６】
ステップＳ１１５における判定の結果、ＴＢｚ−ＴＢｙ（つまり、遅延時間）が変数Ｎよりも大きいと判定される場合には（ステップＳ１１５：Ｙｅｓ）、フロー別シェーパ部２１は、ステップＳ１０１で取得した入力パケットを廃棄する（ステップＳ１１６）。その後、パケットシェーピング装置２は、動作を終了してもよいし、図１７のステップＳ１０１以降の動作を再度繰り返してもよい。
【０１７７】
他方で、ステップＳ１１５における判定の結果、ＴＢｚ−ＴＢｙ（つまり、遅延時間）が変数Ｎよりも大きくないと判定される場合には（ステップＳ１１５：Ｎｏ）、フロー別シェーパ２１は、時刻バッファ識別番号３３１が「ＴＢｚ」となるバッファ管理レコード３３５のキュー長３３３が、時刻バッファ識別番号３３１が「ＴＢｚ」となるバッファ管理レコード３３５のバッファ閾値３３２よりも大きいか否かを判定する（ステップＳ３１１）。つまり、フロー別シェーパ部２１は、入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）２４１に空きがあるか否かを判定する。
【０１７８】
ステップＳ３１１における判定の結果、キュー長３３３がバッファ閾値３３２よりも大きくないと判定される場合には（ステップＳ３１１：Ｎｏ）、フロー別シェーパ２１は、時刻バッファ識別番号３３１が「ＴＢｚ」となるバッファ管理レコード３３５のキュー長３３３に変数ＰＬＥＮを加算した値が、時刻バッファ識別番号３３１が「ＴＢｚ」となるバッファ管理レコード３３５のバッファ閾値３３２よりも大きいか否かを判定する（ステップＳ３１２）。つまり、フロー別シェーパ部２１は、入力パケットを書き込むべき候補となる時刻バッファ（ＴＢｚ）２４１に、ＰＬＥＮのサイズを有する入力パケットを書き込むだけの空きがあるか否かを判定する。
【０１７９】
ステップＳ３１２における判定の結果、キュー長３３３に変数ＰＬＥＮを加算した値がバッファ閾値３３２よりも大きくないと判定される場合には（ステップＳ３１２：Ｎｏ）、フロー別シェーパ部２１は、補正値を示す変数ａｍｄに「０」を設定する（ステップＳ３１３）。尚、変形動作例における「変数ａｍｄ」は、例えば、時刻バッファ（ＴＢｋ）２４１のマージンを考慮しない上限値（具体的には、所定時間Ｔ１以内に読出可能な最大のデータ量）を超えて入力パケットを書き込む場合の超過量に相当する。ステップＳ３１３の動作が行われる場合は、入力パケットを書き込んだ後であってもキュー長３３３（つまり、更新前のキュー長３３３＋ＰＬＥＮ）がバッファ閾値３３２を超えることがない。このため、変数ａｍｄは「０」となる。
【０１８０】
他方で、ステップＳ３１２における判定の結果、キュー長３３３に変数ＰＬＥＮを加算した値がバッファ閾値３３２よりも大きいと判定される場合には（ステップＳ３１２：Ｎｏ）、フロー別シェーパ部２１は、変数ａｍｄに「時刻バッファ識別番号３３１が「ＴＢｚ」となるバッファ管理レコード３３５のキュー長３３３＋ＰＬＥＮ−時刻バッファ識別番号３３１が「ＴＢｚ」となるバッファ管理レコード３３５のバッファ閾値３３２」を設定する（ステップＳ３１４）。具体的には、ステップＳ３１３の動作が行われる場合は、入力パケットを書き込んだ後に、キュー長３３３（つまり、更新前のキュー長３３３＋ＰＬＥN）がバッファ閾値３３２を超える。このため、変数ａｍｄは「バッファ閾値３３２を超えて書き込まれた一部の入力パケットのサイズ（つまり、更新前のキュー長＋ＰＬＥＮ−バッファ閾値）」となる。
【０１８１】
他方で、ステップＳ３１１における判定の結果、キュー長３３３がバッファ閾値３３２よりも大きいと判定される場合には（ステップＳ３１１：Ｙｅｓ）、フロー別シェーパ２１は、変数Ｂ２Ｌが０よりも大きいか否かを判定する（ステップＳ３１５）。つまり、フロー別シェーパ部２１は、最低限の書き込みが保証されているデータ量の入力パケットが、時刻バッファ（ＴＢｚ）２４１に既に書き込まれているか否かを判定する。
【０１８２】
ステップＳ３１５における判定の結果、変数Ｂ２Ｌが０よりも大きくないと判定される場合には（ステップＳ３１５：Ｎｏ）、時刻バッファ（ＴＢｚ）２４１には、最低限の書き込みが保証されているだけのデータ量以上の入力パケットが既に書き込まれていると想定される。従って、フロー別シェーパ部２１は、ＴＢｚ（言い換えれば、ｚ）を１だけインクリメントした後（ステップＳ３１６）、ステップＳ１１５の動作を繰り返す。つまり、フロー別シェーパ部１１は、最低限の書き込みが保証されているだけのデータ量以上の入力パケットが既に書き込まれていると判定された時刻バッファ（ＴＢｚ）２４１の次段の時刻バッファ（ＴＢｚ＋１）２４１を新たな時刻バッファ（ＴＢｚ）２４１に設定した上で、ステップＳ１１５の動作を繰り返す。尚、フロー別シェーパ部２１は、ＴＢｚを１だけインクリメントすると共に、変数Ｂ２Ｌに変数Ｂ１Ｌを設定し、且つ変数Ｂ２Ｈに変数Ｂ１Ｈを設定する（ステップＳ３１６）。つまり、フロー別シェーパ部２１は、旧変数Ｂ１Ｌを新変数Ｂ２Ｌに設定し、且つ旧変数Ｂ１Ｈを新変数Ｂ２Ｈに設定する。
【０１８３】
他方で、ステップＳ３１５における判定の結果、変数Ｂ２Ｌが０よりも大きいと判定される場合には（ステップＳ３１５：Ｎｏ）、時刻バッファ（ＴＢｚ）２４１には、最低限の書き込みが保証されているだけのデータ量未満の入力パケットしか書き込まれていないと想定される。従って、この場合には、時刻バッファ（ＴＢｚ）２４１に対して入力パケットを書き込むと判定される。従って、フロー別シェーパ部２１は、変数ａｍｄに、今回書き込む入力パケットのサイズ「ＰＬＥＮ」を設定する（ステップＳ３１７）。但し、この場合、時刻バッファ（ＴＢｚ）２４１には、余剰分の入力パケットを書き込む領域がないものとして扱われることが好ましい。従って、フロー別シェーパ部２１は、変数Ｂ２Ｈに「０」
を設定する（ステップＳ３１７）。
【０１８４】
その後、フロー別シェーパ部２１は、ステップＳ１０１で取得した入力パケットを、時刻バッファ（ＴＢｚ）２４１に書き込む（ステップＳ１１７）。
【０１８５】
続いて、フロー別シェーパ部２１は、時刻バッファ識別番号３３１が「ＴＢｚ」となるバッファ管理レコード３３５のキュー長３３３を更新する（ステップＳ１１８）。具体的には、フロー別シェーパ部２１は、更新前のキュー長３３３に対して変数ＰＬＥＮ（つまり、今回書き込んだ入力パケットのサイズ（バイト数））を加算した値を、更新後のキュー長３３３としてバッファ管理テーブル３３に書き込む。
【０１８６】
加えて、フロー別シェーパ部２１は、時刻バッファ（ＴＢｚ）２４１の次段以降の空きがある時刻バッファ（ＴＢｚ＋ａ）２４１のバッファ閾値３３２を更新する（ステップＳ３２０）。具体的には、フロー別シェーパ部２１は、時刻バッファ識別番号３３１が「ＴＢｚ＋ａ」となるバッファ管理レコード３３５のバッファ閾値３３２から、補正値を示す変数ａｍｄだけ減算する。フロー別シェーパ部２１は、減算の結果得られた値を、時刻バッファ識別番号３３１が「ＴＢｚ＋ａ」となるバッファ管理レコード３３５の更新後のバッファ閾値３３２としてバッファ管理テーブル３３に書き込む。
【０１８７】
尚、時刻バッファ識別番号３３１が「ＴＢｚ＋ａ」となるバッファ管理レコード３３５の更新後のバッファ閾値３３２が、更新前のバッファ閾値３３２と比較して著しく小さくなる場合（例えば、更新後のバッファ閾値３３２／更新前のバッファ閾値３３２＜０．５となる場合）には、以下の動作が行われてもよい。例えば、フロー別シェーパ部２１は、時刻バッファ識別番号３３１が「ＴＢｚ＋ａ」となるバッファ管理レコード３３５のバッファ閾値３３２から変数ａｍｄのうちの一部だけを減算し、時刻バッファ識別番号３３１が「ＴＢｚ＋ａ＋１」となる（つまり、更に次段の）バッファ管理レコード３３５のバッファ閾値３３２から変数ａｍｄのうちの他の一部をを減算してもよい。
【０１８８】
その後、フロー別シェーパ部２１は、図１９に示す動作を行うことで、フロー情報テーブル３２の更新動作（ステップＳ３２１からステップＳ３３５）を行う。具体的には、フロー別シェーパ部２１は、変数Ｂ２Ｌ（つまり、入力可能残りバイト数３２５）が変数ＰＬＥＮ（つまり、今回書き込んだ入力パケットのサイズ（バイト数））よりも大きいか否かを判定する（ステップＳ３２１）。
【０１８９】
ステップＳ３２１における判定の結果、変数Ｂ２Ｌが変数ＰＬＥＮよりも大きいと判定される場合には（ステップＳ３２１：Ｙｅｓ）、フロー別シェーパ部２１は、変数Ｂ２Ｌ（つまり、入力可能残りバイト数３２５）を更新する（ステップＳ３２２）。具体的には、フロー別シェーパ部２１は、変数Ｂ２Ｌから変数ＰＬＥＮを減算した値を、更新後の変数Ｂ２Ｌ（つまり、更新後の入力可能残りバイト数３２５）としてフロー情報テーブル３２に書き込む。その後、パケットシェーピング装置２は、動作を終了してもよいし、図１７のステップＳ１０１以降の動作を再度繰り返してもよい。
【０１９０】
他方で、ステップＳ３２１における判定の結果、変数Ｂ２Ｌが変数ＰＬＥＮよりも大きくないと判定される場合には（ステップＳ３２１：Ｎｏ）、フロー別シェーパ部２１は、変数ＰＬＥＮ及び変数Ｂ２Ｌを更新する（ステップＳ３２３）。具体的には、フロー別シェーパ部２１は、変数ＰＬＥＮから更新前の変数Ｂ２Ｌを減算した値を、更新後の変数ＰＬＥＮとする。加えて、フロー別シェーパ部２１は、「０」を、更新後の変数Ｂ２Ｌとしてフロー情報テーブル３２に書き込む。
【０１９１】
続いて、フロー別シェーパ部２１は、変数Ｂ２Ｈ（つまり、入力可能残りバイト数３２５）が変数ＰＬＥＮ（つまり、今回書き込んだ入力パケットのサイズ（バイト数））よりも大きいか否かを判定する（ステップＳ３３１）。
【０１９２】
ステップＳ３３１における判定の結果、変数Ｂ２Ｈが変数ＰＬＥＮよりも大きいと判定される場合には（ステップＳ３３１：Ｙｅｓ）、フロー別シェーパ部２１は、変数Ｂ２Ｈ（つまり、入力可能残りバイト数３２５）を更新する（ステップＳ３３２）。具体的には、フロー別シェーパ部２１は、変数Ｂ２Ｈから変数ＰＬＥＮを減算した値を、更新後の変数Ｂ２Ｈ（つまり、更新後の入力可能残りバイト数３２５）としてフロー情報テーブル３２に書き込む。その後、パケットシェーピング装置２は、動作を終了してもよいし、図１７のステップＳ１０１以降の動作を再度繰り返してもよい。
【０１９３】
他方で、ステップＳ３３１における判定の結果、変数Ｂ２Ｈが変数ＰＬＥＮよりも大きくないと判定される場合には（ステップＳ３３１：Ｎｏ）、フロー別シェーパ部２１は、変数ＴＢｘ（つまり、次時刻バッファ番号３２４）、変数ＰＬＥＮ及び変数Ｂ２Ｌを更新する（ステップＳ３２４）。具体的には、フロー別シェーパ部２１は、変数ＴＢｘ（言い換えれば、ｘ）を１だけインクリメントした値を、更新後の次時刻バッファ番号３２４としてフロー情報テーブル３２に書き込む。つまり、フロー別シェーパ部３１は、時刻バッファ（ＴＢｘ）２４１の次段の時刻バッファ（ＴＢｘ＋１）２４１を、新たな時刻バッファ（ＴＢｘ）２４１として取り扱う。加えて、フロー別シェーパ部２１は、変数ＰＬＥＮから更新前の変数Ｂ２Ｈを減算した値を、更新後の変数ＰＬＥＮとする。加えて、フロー別シェーパ部２１は、変数Ｂ１Ｌを、更新後の変数Ｂ２Ｌとしてフロー情報テーブル３２に書き込む。
【０１９４】
続いて、フロー別シェーパ部２１は、時刻バッファ識別番号３３１が「ＴＢｘ」となるバッファ管理レコード３３５のキュー長３３３が、時刻バッファ識別番号３３１が「ＴＢｘ」となるバッファ管理レコード３３５のバッファ閾値３３２よりも大きいか否かを判定する（ステップＳ３３３）。つまり、フロー別シェーパ部２１は、更新後の時刻バッファ（ＴＢｘ）２４１（つまり、入力パケットを書き込むべき候補となる新たな時刻バッファ（ＴＢｚ）２４１）に空きがあるか否かを判定する。
【０１９５】
ステップＳ３３３における判定の結果、キュー長３３３がバッファ閾値３３２よりも大きいと判定される場合には（ステップＳ３３３：Ｙｅｓ）、余剰帯域のこれ以上の書き込みを行う余裕がないと想定される。従って、フロー別シェーパ部２１は、変数Ｂ２Ｈ（つまり、入力可能残りバイト数３２５）を更新する（ステップＳ３３４）。具体的には、フロー別シェーパ部２１は、「０」を、更新後の変数Ｂ２Ｈとしてフロー情報テーブル３２に書き込む。その後、フロー別シェーパ部２１は、ステップＳ３２１以降の動作を繰り返す。
【０１９６】
他方で、ステップＳ３３３における判定の結果、キュー長３３３がバッファ閾値３３２よりも大きくないと判定される場合には（ステップＳ３１１：Ｎｏ）、フロー別シェーパ部２１は、変数Ｂ２Ｈ（つまり、入力可能残りバイト数３２５）を更新する（ステップＳ３３５）。具体的には、フロー別シェーパ部２１は、変数Ｂ１Ｈを、更新後の変数Ｂ２Ｈとしてフロー情報テーブル３２に書き込む。その後、フロー別シェーパ部２１は、ステップＳ３２１以降の動作を繰り返す。
【０１９７】
以上説明したように、変形動作例によれば、第１実施形態のパケットシェーピング装置１が享受する効果と同様の効果を好適に享受することができる。
【０１９８】
加えて、変形動作例によれば、同一優先度（同一クラス）のトラヒックにおいて、複数レートのサービス（例えば、最低帯域保証サービスや最大帯域制限サービス等）をサポートすることができる。具体的には、例えば、キュー長３３３が本来の上限値（つまり、バッファ閾値３３２）に達している場合であっても、最低保証分の入力パケットは、時刻バッファ（ＴＢｚ）２４１に書き込むことができる。このため、輻輳が発生している場合であっても、最低帯域を保証することができる。一方で、輻輳が発生していない場合には、各フローは最低保証分の入力パケットに加えて余剰帯域分の入力パケットを書き込むことができるため、入力パケットの送信レートを増大させることができる。
【０１９９】
尚、変形動作例は、第１実施形態のパケットシェーピング装置１によって行われてもよい。この場合も、上述した各種効果を享受することができる。
【０２００】
以上説明した実施形態に関して、更に以下の付記を開示する。
【０２０１】
（付記１）
所定時間内に読出可能なデータ量を書込可能な上限サイズとする複数のバッファであって、読出処理が行われる一のバッファが前記所定時間毎に順次切り替えられる複数のバッファと、
(i)入力データを書き込むべきバッファを、当該入力データのフロー毎に特定する特定情報、(ii)前記複数のバッファの夫々に書込可能な最大のデータ量を前記フロー毎に示す最大量情報及び(ii)前記特定情報により特定されるバッファに書込可能な残りのデータ量を前記フロー毎に示す残量情報を含むフロー情報テーブルと、
前記入力データを、当該入力データのフロー毎に、前記複数のバッファのうちの前記特定情報により特定されるバッファに書き込むシェーパと
を備え、
前記シェーパは、前記フロー毎に、(i)前記残量情報を、前記入力データを書き込む前の前記残量情報から新たに書き込んだ前記入力データのデータ量を減算した値に更新し、(ii)更新後の前記残量情報が負の値になる場合には、前記特定情報を前記特定情報により特定されるバッファの次段以降の他のバッファを特定する情報に更新する動作及び前記特定情報の更新の都度前記最大量情報を前記残量情報に加算する動作の夫々を、前記残量情報が正の値になるまで繰り返すことを特徴とするシェーピング装置。
【０２０２】
（付記２）
前記複数のバッファの夫々毎に、(i)各バッファの上限サイズを示す上限情報及び(ii)各バッファに既に書き込まれているデータの総量を示すキュー長情報を含むバッファ管理テーブルを更に備え、
前記シェーパは、前記入力データを書き込む前の前記キュー長情報が前記上限情報を超えていない場合に、前記入力データを前記特定情報により特定されるバッファに書込可能であると判定し、
前記シェーパは、前記フロー毎に、(i)前記入力データを前記特定情報により特定されるバッファに書込可能な場合には、前記入力データを前記特定情報により特定されるバッファに書き込み、(ii)前記入力データを前記特定情報により特定されるバッファに書込可能でない場合には、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する書込可能な他のバッファに書き込むことを特徴とする付記１に記載のシェーピング装置。
【０２０３】
（付記３）
前記シェーパは、前記入力データを書き込んだ後の前記キュー長情報が前記上限情報を超えている場合には、前記入力データを前記特定情報により特定されるバッファに書き込むと共に、前記特定情報により特定されるバッファの次段以降に位置する他のバッファの前記上限情報を、前記他のバッファの上限サイズから前記キュー長情報が前記上限情報を超えている分のデータ量を減算した値に更新することを特徴とする付記２に記載のシェーピング装置。
【０２０４】
（付記４）
前記複数のバッファの夫々は、前記上限サイズに対して所定のマージンを持ったサイズを有することを特徴とする付記３に記載のシェーピング装置。
【０２０５】
（付記５）
前記シェーパは、前記入力データを、現在読出処理が行われているバッファを基準として許容遅延時間以上経過した後に読出処理が行われるバッファに書き込むべきであると判定される場合には、前記入力データを廃棄することを特徴とする付記１から４のいずれか一項に記載のシェーピング装置。
【０２０６】
（付記６）
前記フロー情報テーブルは、前記許容遅延時間を前記フロー毎に示す遅延時間情報を更に含むことを特徴とする付記５に記載のシェーピング装置。
【０２０７】
（付記７）
前記シェーパは、前記特定情報により特定されるバッファが、読出処理が行われているバッファである場合に、前記入力データを前記特定情報により特定されるバッファに書き込むことを特徴とする付記１から６のいずれか一項に記載のシェーピング装置。
【０２０８】
（付記８）
前記シェーパは、前記特定情報により特定されるバッファが、読出処理が行われているバッファである場合に、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する他のバッファに書き込むことを特徴とする付記１から６のいずれか一項に記載のシェーピング装置。
【０２０９】
（付記９）
前記複数のバッファの少なくとも一つは、複数種類の優先度に夫々対応する複数の優先度バッファ部を備えており、
前記フロー情報テーブルは、(i)前記入力データを書き込むべきバッファを、前記フロー毎及び前記優先度毎に特定する前記特定情報、(ii)前記複数のバッファの夫々に書込可能な最大のデータ量を前記フロー毎及び前記優先度毎に示す前記最大量情報及び(iii)前記特定情報により特定されるバッファに書込可能な残りのデータ量を前記フロー毎及び前記優先度毎に示す前記残量情報を含み、
前記シェーパは、前記入力データを、当該入力データのフロー毎及び優先度毎に、前記複数のバッファのうちの前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書き込み、
前記シェーパは、前記フロー毎及び前記優先度毎に、(i)前記残量情報を、前記入力データを書き込む前の前記残量情報から新たに書き込んだ前記入力データのデータ量を減算した値に更新し、(ii)更新後の前記残量情報が負の値になる場合には、前記特定情報を前記特定情報により特定されるバッファの次段以降の他のバッファを特定する情報に更新する動作及び前記特定情報の更新の都度前記最大量情報を前記残量情報に加算する動作の夫々を、前記残量情報が正の値になるまで繰り返すことを特徴とする付記１から８のいずれか一項に記載のシェーピング装置。
【０２１０】
（付記１０）
前記複数のバッファの夫々毎に、(i)各バッファの上限サイズを前記優先度毎に示す上限情報及び(ii)各バッファに既に書き込まれているデータの総量を前記優先度毎に示すキュー長情報を含むバッファ管理テーブルを更に備え、
前記シェーパは、前記入力データを書き込む前の前記キュー長情報が前記上限情報を超えていない場合に、前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に前記入力データを書込可能であると判定し、
前記シェーパは、前記フロー毎及び前記優先度毎に、(i)前記入力データを前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書込可能な場合には、前記入力データを前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書き込み、(ii)前記入力データを前記特定情報により特定されるバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書込可能でない場合には、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する書込可能な他のバッファが備え且つ前記入力データの優先度に対応する前記優先度バッファ部に書き込むことを特徴とする付記９に記載のシェーピング装置。
【０２１１】
（付記１１）
前記複数のバッファの少なくとも一つは、前記所定時間内に読出可能なデータ量に所定のマージン量を加えたデータ量を書込可能な上限サイズとし、
前記フロー情報テーブルは、前記最大量情報及び前記残量情報を、前記複数のバッファの夫々に書込可能なデータ量として最低限保証される最低保証レベル及び前記複数のバッファの夫々に書込可能なデータ量として余剰に確保される余剰帯域レベルの夫々に対応付けて含んでおり、
前記複数のバッファの夫々毎に、(i)各バッファから前記所定時間内に読出可能なデータ量を示す閾値情報及び(ii)各バッファに既に書き込まれているデータの総量を示すキュー長情報を含むバッファ管理テーブルを更に備え、
前記シェーパは、(i)前記入力データを書き込む前の前記キュー長情報が前記閾値情報を超えていないか、又は(ii)前記入力データを書き込む前の前記キュー長情報が前記閾値情報を超えており且つ前記最低保証レベルに対応する前記残量情報が正の値を有する場合に、前記特定情報により特定されるバッファに前記入力データを書込可能であると判定し、
前記シェーパは、前記入力データを書き込む前の前記キュー長情報が前記閾値情報を超えており且つ前記最低保証レベルに対応する前記残量情報が負の値を有する場合に、前記特定情報により特定されるバッファに前記入力データを書込可能でないと判定し、
前記シェーパは、前記フロー毎に、(i)前記入力データを前記特定情報により特定されるバッファに書込可能な場合には、前記入力データを前記特定情報により特定されるバッファに書き込み、(ii)前記入力データを前記特定情報により特定されるバッファに書込可能でない場合には、前記入力データを前記特定情報により特定されるバッファの次段以降に位置する書込可能な他のバッファに書き込むことを特徴とする付記１０に記載のシェーピング装置。
【０２１２】
（付記１２）
前記シェーパは、前記特定情報により特定されるバッファに前記入力データを書込可能であると判定され且つ前記入力データを書き込んだ後の前記キュー長情報が前記閾値情報を超えている場合には、前記特定情報により特定されるバッファの次段以降に位置する他のバッファの前記閾値情報を、前記他のバッファの前記閾値情報から前記キュー長情報が前記閾値情報を超えている分のデータ量を減算した値に更新することを特徴とする付記１１に記載のシェーピング装置。
【０２１３】
（付記１３）
前記シェーパは、前記特定情報により特定されるバッファに前記入力データを書込可能でない場合には、(i)前記余剰帯域レベルに対応する前記残量情報を、前記余剰帯域レベルに対応する前記最大量情報に更新し、且つ(ii)前記最低保証レベルに対応する前記残量情報を、前記最低保証レベルに対応する前記最大量情報に更新することを特徴とする付記１１又は１２に記載のシェーピング装置。
【０２１４】
（付記１４）
所定時間内に読出可能なデータ量を書込可能な上限サイズとする複数のバッファであって、読出処理が行われる一のバッファが前記所定時間毎に順次切り替えられる複数のバッファと、
(i)入力データを書き込むべきバッファを、当該入力データのフロー毎に特定する特定情報、(ii)前記複数のバッファの夫々に書込可能な最大のデータ量を前記フロー毎に示す最大量情報及び(ii)前記特定情報により特定されるバッファに書込可能な残りのデータ量を前記フロー毎に示す残量情報を含むフロー情報テーブルと
を備えるシェーピング装置におけるシェーピング方法であって、
前記入力データを、当該入力データのフロー毎に、前記複数のバッファのうちの前記特定情報により特定されるバッファに書き込む書込工程と、
前記フロー毎に、(i)前記残量情報を、前記入力データを書き込む前の前記残量情報から新たに書き込んだ前記入力データのデータ量を減算した値に更新し、(ii)更新後の前記残量情報が負の値になる場合には、前記特定情報を前記特定情報により特定されるバッファの次段以降の他のバッファを特定する情報に更新する動作及び前記特定情報の更新の都度前記最大量情報を前記残量情報に加算する動作の夫々を、前記残量情報が正の値になるまで繰り返す更新工程と
を備えることを特徴とするシェーピング方法。
【０２１５】
本発明は、上述した実施形態に限られるものではなく、請求の範囲及び明細書全体から読み取れる発明の要旨或いは思想に反しない範囲で適宜変更可能であり、そのような変更を伴なうシェーピング装置及び方法もまた本発明の技術的範囲に含まれるものである。
【符号の説明】
【０２１６】
１、２  パケットシェーピング装置
１１、２１  フロー別シェーパ部
１２、２２、３２  フロー情報テーブル
１２１、２２１、３２１  フローＩＤ
１２２、２２２、３２２、Ｂ１、Ｂ１Ｈ、Ｂ１Ｌ  入力可能上限バイト数
１２３、２２３、３２３、Ｎ  許容遅延
１２４、２２４、３２４、ＴＢｘ  次時刻バッファ番号
１２５、２２５、３２５、Ｂ２、Ｂ２Ｈ、Ｂ２Ｌ  入力可能残りバイト数
２２７  クラスＩＤ
３２７  レート情報
１３、２３、３３  バッファ管理テーブル
１３１、２３１、３３１  時刻バッファ番号
１３２、２３２、２３２  バッファ上限値
１３３、２３３、３３３  キュー長
１３４、２３４、３３４  読出中フラグ
２３６  クラスＩＤ
２３７  クラス上限値
２３８  加算クラス
２３９  判定キュー長
１４、２４  バッファ部
１４１、２４１  時刻バッファ
２４１２  クラスｊ用バッファ
１４２、２４２  セレクタ
【図１】
0005609584.tif 000002
【図２】
0005609584.tif 000003
【図３】
0005609584.tif 000004
【図４】
0005609584.tif 000005
【図５】
0005609584.tif 000006
【図６】
0005609584.tif 000007
【図７】
0005609584.tif 000008
【図８】
0005609584.tif 000009
【図９】
0005609584.tif 000010
【図１０】
0005609584.tif 000011
【図１１】
0005609584.tif 000012
【図１２】
0005609584.tif 000013
【図１３】
0005609584.tif 000014
【図１４】
0005609584.tif 000015
【図１５】
0005609584.tif 000016
【図１６】
0005609584.tif 000017
【図１７】
0005609584.tif 000018
【図１８】
0005609584.tif 000019
【図１９】
0005609584.tif 000020