以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の中継装置を示す図である。中継装置1は、識別子が付与されたデータの転送に用いられる。識別子は、フローを識別するための情報である。例えば事前の契約などによって、識別子(フロー)ごとに保証される転送レートが定められる。識別子と保証される転送レートとの対応関係を示す情報は中継装置1に予め与えられる。識別子は、中継装置1内の処理に用いるために付加されるものでもよい。中継装置1から送出されるデータには当該識別子が付加されていなくてもよい。
中継装置1は、転送レートを調整するために転送対象のデータを保持し得る。このような機能はシェーピングと呼ばれることもある。中継装置1は、記憶部1a、バッファ群1bおよび制御部1cを有する。
記憶部1aは、バッファ群1bに含まれる複数のバッファを管理するための情報を記憶する。記憶部1aに記憶される情報は、複数のバッファと現時点以降で順次読み出しの対象となる複数の時間領域との対応関係を示す情報を含む。また、記憶部1aに記憶される情報は、1つのバッファに格納できるフローごとのデータ量を示す情報を含む。これらの情報は制御部1cにより生成されて記憶部1aに格納されてもよい。
1つのバッファに格納できるフローごとのデータ量は、各フローの転送レートに応じて定められる。相対的に転送レートが高いフロー(以下、高レートのフローということがある)は、相対的に転送レートが低いフロー(以下、低レートのフローということがある)よりも格納できるデータ量は多い。各フローにおいて契約などで保証される転送レートを実現できるようにするためである。
バッファ群1bは、複数のバッファの集合である。1つのバッファは1つのキューでもよい。バッファ群1bは、バッファKt1,Kt2,Kt3,Kt4,Kt5,Kt6を含む。バッファKt1,Kt2,Kt3,Kt4,Kt5,Kt6には、複数のフローのデータを格納できる。
バッファKt1,Kt2,Kt3,Kt4,Kt5,Kt6は、上述のように現時点以降で順次読み出しの対象となる時間領域t1,t2,t3,t4,t5,t6に対応付けられている。時間領域t1,t2,t3,t4,t5,t6はこの順に連続している。例えば、時間領域t1の次が時間領域t2であり、時間領域t2の次が時間領域t3であるというように連続している。時間領域t1は現時点に最も近く、現時点を含んでもよい。
各バッファは現時点を基準として、対応する各時間領域で読み出されることになる。具体的には、バッファKt1は時間領域t1で読み出される。バッファKt2は時間領域t2で読み出される。バッファKt3は時間領域t3で読み出される。バッファKt4は時間領域t4で読み出される。バッファKt5は時間領域t5で読み出される。バッファKt6は時間領域t6で読み出される。
制御部1cは、記憶部1aに記憶された情報を参照し、現時点とある時間領域との時間差に基づいて、当該時間領域よりも前の時間領域に対応するバッファのサイズよりも、当該時間領域に対応するバッファのサイズを小さくする。あるいは、制御部1cは、現時点と時間領域との時間差が相対的に大きいほど、当該時間領域に対応するバッファのサイズを相対的に小さくする、ともいえる。
例えば、制御部1cは、現時点と各時間領域との時間差を、現時点と各時間領域内の何れかの時点(例えば、時間領域の開始時点、中央の時点または終了時点)との差により求めてもよい。
現時点との時間差が小さい順に各時間領域を並べると、時間領域t1,t2,t3,t4,t5,t6の順となる。すなわち、相対的な時間差が最小であるのは時間領域t1である。相対的な時間差が最大であるのは時間領域t6である。したがって、制御部1cは、バッファKt1のサイズを最大とし、バッファKt6のサイズを最小とする。制御部1cは、各バッファのサイズを段階的に小さくするように制御してもよい。
例えば、現時点とある時間領域との時間差が閾値を超えると、当該時間領域よりも前の時間領域に対応するバッファよりも、当該時間領域に対応するバッファのサイズを小さくする。より具体的には、バッファKt1,Kt2のサイズを同一とする。現時点と時間領域t3,t4との時間差は第1の閾値以上である。よって、バッファKt3,Kt4のサイズをバッファKt1,Kt2よりも一段階小さいサイズとする。現時点と時間領域t5,t6との時間差は第2の閾値以上である。ここで、第2の閾値は第1の閾値よりも大きい。よって、バッファKt5,Kt6のサイズをバッファKt3,Kt4よりも一段階小さいサイズとする。
中継装置1によれば、制御部1cにより、現時点とある時間領域との時間差に基づいて、当該時間領域よりも前の時間領域に対応するバッファのサイズよりも、当該時間領域に対応するバッファのサイズが小さくなるように制御される。
ここで、例えば各バッファを同一のサイズとすることも考えられる。しかし、この場合、メモリ領域の割り当てが非効率となる可能性がある。具体的には次の通りである。
高レートのフローのデータは、1つのバッファにより多く格納できる。このため、ある時点においてトラフィックが集中して発生しても、直近のバッファに4個、次のバッファに1個というように現在時刻付近に対応するバッファを用いて多くのデータをスケジューリングできる。一方、低レートのフローのパケットは、1つのバッファに格納できるデータ量が、高レートのフローよりも小さい。未来側のバッファに対して飛び飛び(例えば、複数のバッファに対して、現時点に近い方から1個目、6個目、11個目のように格納)でしか格納できないこともある。このようなスケジューリングの特性によれば、より未来側のバッファは、現時刻付近のバッファよりも、実際に格納されるデータ量が小さい可能性が高く、容量が余る可能性が高いことになる。このため、各バッファを全て同一のサイズとするのは非効率的となる。
そこで、中継装置1は、現時点と時間領域との時間差が相対的に大きいほど、当該時間領域に対応するバッファのサイズを相対的に小さくする。これにより、限られたメモリサイズの中で、低レートのフローに対するバッファ容量を効率的に確保できる。より未来側のバッファのサイズを小さくすることで、各バッファを同一サイズにした場合に使用される可能性の低いサイズ分を、更に未来側のバッファに割り当てることができる。すなわち、スケジューリングできる時間軸を延長できる。
例えば、バッファ群1bで利用できるメモリサイズが12である場合に、各バッファのサイズを3に統一すると、カバーできる時間軸の範囲は時間領域t1〜t4である。また、上述のように、時間領域t3,t4ではバッファの容量が余る可能性がある。そこで、例えば、バッファKt1,Kt2のサイズを3、バッファKt3,Kt4のサイズを2、バッファKt5,Kt6のサイズを1とする。すると、時間領域t6までカバーできることになる。
例えば、バッファKt1には、第1の転送レートのフロー(フローXと称する)のデータX1、フローXよりも低い転送レートのフロー(フローYと称する)のデータY1およびフローYよりも低い転送レートのフローZのデータZ1が格納される。フローXは1つのバッファに対して格納できるデータ量が最大である。フローYは1つのバッファに対して格納できるデータ量がフローXよりも小さい。フローZは1つのバッファに対して格納できるデータ量がフローYよりも小さい。
例えば、バッファKt2にはフローXのデータX2、フローYのデータY2およびフローZのデータZ2が格納される。バッファKt3にはフローYのデータY3およびフローZのデータZ3が格納される。バッファKt4にはフローZのデータZ4が格納される。バッファKt5にフローZのデータZ5が格納される。バッファKt6にフローZのデータZ6が格納される。一方、全てのバッファを同一サイズとすると時間軸の時間領域t4までしかカバーできないから、データZ5,Z6はスケジューリングできずに、破棄されることになる。バッファKt6までスケジューリングできれば、より未来側のバッファに格納され得る低レートのフローが、スケジューリングできずに破棄されてしまう可能性を低減できる。
例えば、あるフローで短時間に不規則なトラフィックが集中して発生することがある。このような現象をバーストということがある。また、不規則なトラフィックが短時間に集中し易いことをバースト性が高いということがある。バースト性の高いフローに対処するために、比較的大きなバッファ容量を確保しておきたいことがある。第1の実施の形態によれば、低レートのフローに対して比較的大きなバッファ容量を確保できる。よって、低レートのフローでも、バーストに対してデータを収容できる可能性を高められる。すなわち、低レートのフローに対するバースト耐力を向上することができる。
[第2の実施の形態]
図2は、第2の実施の形態の中継装置のハードウェア例を示す図である。中継装置100は、種々の装置(例えば、コンピュータや携帯端末装置)の間の通信を中継する。中継装置100は、例えば、スイッチ装置やルータ装置である。中継装置100は、インタフェースカード101,102,103、スイッチカード104,105およびコントロールカード106を有する。
インタフェースカード101,102,103は、中継装置100に対してデータを入出力するためのインタフェースを備える。当該インタフェースは、物理リンク(ここでは、光ファイバ)に直接接続される。当該インタフェースは、例えばSFP(Small Form factor Pluggable)である。当該インタフェースは、銅線ケーブルなど他の種類の物理リンクと接続するものでもよい。
スイッチカード104,105は、インタフェースカード101,102,103の間でデータを入出力するためのスイッチである。
コントロールカード106は、インタフェースカード101,102,103およびスイッチカード104,105に対して制御用の情報を入出力する。コントロールカード106は、インタフェースカード101,102,103およびスイッチカード104,105の稼働状態を管理する。
図3は、第2の実施の形態のインタフェースカードを示す図である。インタフェースカード101は、CPU(Central Processing Unit)110、ASIC(Application Specific Integrated Circuit)111、メモリ112、PHY/MAC(Media Access Control)デバイス113および光モジュール114,115,116を有する。インタフェースカード102,103もインタフェースカード101と同様のユニットにより実現できる。
CPU110は、ASIC111と通信して所定のソフトウェア処理(例えば、統計上の収集)を行ったり、ユーザがASIC111に対する設定を行うためのGUI(Graphical User Interface)を提供したりする。
ASIC111は、スイッチカード104,105やPHY/MACデバイス113から入力されたパケットに対するシェーピングを行いフローごとの転送レートを調整するプロセッサ(演算部)である。ASIC111は、PHY/MACデバイス113にパケットを出力する。また、ASIC111は、PHY/MACデバイス113から入力されたパケットをスイッチカード104,105に出力することもある。中継装置100は、ASIC111に代えて、または、ASIC111と併せて、FPGA(Field Programmable Gate Array)などの他の種類のプロセッサを備えてもよい。
メモリ112は、ASIC111の処理に用いられる各種のデータを記憶する。
PHY/MACデバイス113は、ASIC111から入力されたパケットに対してPHY/MAC処理を行い、光モジュール114,115,116の何れかへ出力する。PHY/MACデバイス113は、光モジュール114,115,116から入力された電気信号からパケットを抽出してASIC111へ出力する。
光モジュール114,115,116は、PHY/MACデバイス113から入力されたフレームを光信号に変換して光ファイバへ出力する。光モジュール114,115,116は、光ファイバより入力される光信号を電気信号に変換してPHY/MACデバイス113へ出力する。
図4は、第2の実施の形態のインタフェースカードを示す図(続き)である。インタフェースカード101は、記憶部120、バッファ部130、制御部140、セレクタ150および時計部160を有する。記憶部120およびバッファ部130は、メモリ112の記憶領域を用いて実現されてもよい。制御部140、セレクタ150および時計部160は、ASIC111によって実現されてもよい。あるいは、制御部120、セレクタ150および時計部160を個別のASICなどとして実現してもよい。
記憶部120は、バッファ部130におけるバッファを管理するための情報やフローを管理するための情報を記憶する。ここで、フローは、例えば、中継装置100に到着したデータに含まれるVLAN ID(Virtual Local Area Network IDentifier)や、到着時の中継装置100におけるポート番号に対応する情報である。VLAN IDとポート番号との組み合わせでもよいし、当該組み合わせに対応するIDを、入口側のインタフェースカードが、抽出したパケットに付与してもよい。
バッファ部130は、パケットをバッファリングするためのバッファ131,132,133の集合である。各バッファはキューである。各バッファは、複数のフローのパケットを格納できる。
制御部140は、記憶部120に記憶された情報を参照してシェーピングを行う。具体的には、制御部140は、受け付けたパケットをバッファ131,132,133,・・・に格納する。各バッファからパケットを読み出す時間帯は予め定められる。制御部140は、フローごとの転送レートに応じて格納するバッファを決めたり(スケジューリング)、当該転送レートに応じて格納するデータ量を決めたりする。
このようなスケジューリングの方法は、バッファの格納時にスケジューリングを行うので、入力型のスケジューリングと呼ばれることがある。一方で、フローごとに格納するバッファを固定的に割り当て、出力時にどのバッファからデータを出力するかを選択することでスケジューリングを行う方法を出力型のスケジューリングと呼ぶことがある。
セレクタ150は、時計部160により入力された時刻の情報に基づいて、当該時刻を含む時間帯に対応するバッファからパケットを読み出す。
時計部160は、現在の時刻をセレクタ150に出力する。
図5は、第2の実施の形態のタイムテーブルの例を示す図である。タイムテーブル121は、各時間帯と読み出し対象とするバッファとの対応関係を定めた情報である。バッファは例えば、メモリ112上のアドレスを示すポインタによって指定される。タイムテーブル121は、記憶部120に格納される。第2の実施の形態では、現時点から35ms後までを0.1ms単位の時間帯に区切って、読み出し対象とするバッファを切り替える。
ここで、現時刻(0秒の時点)〜0.1ms後の時間帯は時間領域TR1である(TRは、Time Regionの略)。タイムテーブル121では、時間領域TR1に対してバッファ部130の何れかのバッファ(例えば、バッファ131)が対応付けられる。0.1〜0.2ms後の時間帯は時間領域TR2である。タイムテーブル121では、時間領域TR2に対してバッファ部130の何れかのバッファ(例えば、バッファ132)が対応付けられる。このように、35ms後までに0.1ms単位で区切られた時間領域を合計350個定義できる。すなわち、時間領域TR1,TR2,・・・,TR350が存在する。
このとき、各バッファのサイズは、対応する時間領域と現時点との時間差が大きいほど、小さくなるように制御される。具体的には、時間領域TR1〜TR50の各バッファのサイズを100kbitsとする。時間領域TR51〜TR100の各バッファのサイズを50kbitsとする。時間領域TR101〜TR350の各バッファのサイズを10kbitsとする。各バッファのサイズは、バッファ管理テーブルによって管理される。ここで、バッファ部130の各バッファの合計のバッファ容量は10Mbitsである。
図6は、第2の実施の形態のバッファ管理テーブルの例を示す図である。バッファ管理テーブル122は、記憶部120に格納される。バッファ管理テーブル122は、TR、上限値、現在キュー長および読み出し中フラグの項目を含む。
TRの項目は、各バッファに対応する時間領域を示す情報が登録される。上限値の項目には、当該バッファのサイズ(当該バッファで利用できる容量の上限値)が登録される。上限値の項目の単位はbitである。現在キュー長の項目には、格納済みのデータサイズが登録される。現在キュー長の項目の単位はbitである。読み出し中フラグの項目には、当該バッファから現在パケットが読み出されているか否かを示すフラグが登録される。読み出されている場合、trueである。読み出されていない場合、falseである。
例えば、バッファ管理テーブル122には、TRが“1”、上限値が“100k”、現在キュー長が“95k”、読み出し中フラグが“true”という情報が登録されている。これは、時間領域TR1に対応するバッファのサイズが100kbitsであり、現在既に95kbits分のパケットが格納済みであること、当該バッファが現在読み出しの対象となっていることを示す。第2の実施の形態では、1つずつバッファを読み出していくので、他のバッファの読み出し中フラグは“false”となる。
図7は、第2の実施の形態のフロー情報テーブルの例を示す図である。フロー情報テーブル123は、記憶部120に格納される。フロー情報テーブル123は、フロー番号、バッファ当たりデータ量、許容遅延、TR、残り容量の項目を含む。
フロー番号の項目には、フローを識別するための番号が登録される。バッファ当たりデータ量の項目には、当該フローに関して1つのバッファに格納できるデータ量が登録される。当該データ量は、フローごとに保証される転送レートに応じて定められる。許容遅延の項目には、許容される遅延が時間領域何個分であるかを示す情報が登録される。以下の説明において、許容遅延をNと表記することがある。TRの項目には、当該フローのパケットが最後にスケジューリングされた時間領域(すなわち、最後に格納されたバッファ)を示す情報が登録される。当該フローのパケットが最後に格納されたバッファをTBxと表記することがある。あるフローでバッファリングがされていなければ、TRの項目は設定なしとなる。残り容量の項目には、最後に格納されたバッファに対して、当該フローが格納できる残りのデータ量(残り容量)を示す情報が登録される。残り容量の最大値は、バッファ当たりデータ量に等しい。
例えば、フロー情報テーブル123には、フロー番号が“1”、バッファ当たりデータ量が“50k”、許容遅延が“30TR”、TRが“TR3”、残り容量が“40k”という情報が登録されている。これは、フロー番号“1”で識別されるフローが、バッファ1つに対して50kbitsのデータを格納でき、スケジューリングの際に現時点から30TR分先までは遅延が許容されていることを示す。また、当該フローのパケットが時間領域TR3に対応するバッファに最後に格納されており、当該バッファに対して当該フローが格納できる残りのデータ量が40kbitsであることを示す(すなわち、当該フローは、TR3に対応するバッファに既に10kbits分を格納済みである)。
ここで、バッファ当たりのデータ量は、フローごとに保証される転送レートに応じて定まる。当該転送レートは、契約などによって事前に定められる。例えば、フロー番号“1”に対して保証される転送レートは、500Mbpsである。この場合、時間領域当たりの時間幅は0.1msなので、500Mbps×0.1ms=50kbitsがバッファ当たりのデータ量となる。同様に、保証される転送レートが100Mbpsであれば、100Mbps×0.1ms=10kbitsがバッファ当たりのデータ量となる。また、保証される転送レートが10Mbpsであれば、10Mbps×0.1ms=1kbitsがバッファ当たりのデータ量となる。また、許容遅延も同様に契約などによって事前に定められる。
図8は、第2の実施の形態のパケットの例を示す図である。制御部140によって処理されるパケット20は、フロー番号およびデータ本体のフィールドを含む。フロー番号のフィールドには、フローを識別するためのフロー番号が設定される。フロー番号は、フローを識別するための識別子といえる。フロー番号は、到着したデータを受け付けた入口側のインタフェースカードによって付与されるものでもよい。例えば、フロー番号は、前述のようにVLAN IDと受信したポートのポート番号との組み合わせに応じた番号でもよい。あるいは、フロー番号は、送信元/宛先のIP(Internet Protocol)アドレスやTCP(Transmission Control Protocol)ポート番号などの何れか、または、これらのうちの2以上の組み合わせに対応付けられるものでもよい。
データ本体のフィールドには、データ本体が設定される。インタフェースカード101から他の装置へ向けてパケットを送出する際には、インタフェースカード101によりフロー番号が除去されてもよい。
図9は、第2の実施の形態のバッファリングの例を示すフローチャートである。以下、図9に示す処理をステップ番号に沿って説明する。
(ステップS11)制御部140は、転送対象のパケットを取得する(以下では、当該パケットを指して、到着したパケットということがある)。
(ステップS12)制御部140は、当該パケットのフロー番号を取得する。制御部140は、記憶部120に記憶されたタイムテーブル121およびフロー情報テーブル123を参照して、当該フロー番号に対して現在パケットを格納中のバッファTBxを示す情報を取得する。バッファTBxは、フロー情報テーブル123のTRの項目に設定された時間領域を示す情報、あるいは、当該時間領域に対応するバッファを示すポインタにより示される。
(ステップS13)制御部140は、バッファTBxを示す情報が有効値であるか否かを判定する。有効値である場合、処理をステップS14に進める。有効値でない場合、処理をステップS15に進める。有効値である場合とは、同一フローにおいて過去に到着したパケットがあり、その際のバッファリングによりバッファTBxが指定されている場合である。有効値でない場合とは、同一フローについてバッファリングされておらず、今回新規にバッファリングを行うような場合(最初のパケットの場合)やバッファTBxが現在読み出し中のバッファの時刻よりも過去のものである場合である。
(ステップS14)制御部140は、バッファTBxを到着したパケットを格納する候補のバッファ(以下、バッファTBzと表記することがある)とする。そして、処理をステップS16に進める。
(ステップS15)制御部140は、セレクタ150が現在読み出し中のバッファ(以下、バッファTByと表記することがある)の次のバッファをバッファTBzとする。そして、処理をステップS16に進める。
(ステップS16)制御部140は、記憶部120に記憶されたバッファ管理テーブル122およびフロー情報テーブル123を参照して、候補のバッファTBzに空きがあるか否かを判定する。空きがある場合、処理をステップS18に進める。空きがない場合、処理をステップS17に進める。空きがある場合とは、バッファ管理テーブル122において、バッファTBzの現在キュー長が上限値に達しておらず、かつ、フロー情報テーブル123において対象のフローがバッファTBzに格納できる残り容量が0より大きい場合である。
(ステップS17)制御部140は、バッファTBzの次の時間帯(バッファTBzと隣接した時間帯でなくてもよい。以下、同様)のバッファを、候補のバッファTBzとする。転送レートやパケット長によっては、次の時間帯のバッファが1以上の時間領域を飛ばした時間領域に対応するバッファになることもある。そして、処理をステップS16に進める。
(ステップS18)制御部140は、タイムテーブル121およびフロー情報テーブル123を参照して、バッファTBzとバッファTByとの時間差が、許容遅延N以下であるか否かを判定する。当該時間差が許容遅延N以下である場合、処理をステップS20に進める。当該時間差が許容遅延よりも大きい場合、処理をステップS19に進める。
(ステップS19)制御部140は、到着したパケットを破棄する。そして、処理を終了する。
(ステップS20)制御部140は、バッファTBzに到着したパケット(既に格納された部分があれば、未格納の部分のみ)を格納する。制御部140は、バッファ管理テーブル122を更新する。具体的には、ステップS20におけるパケットの格納結果をバッファ管理テーブル122に反映させる。すなわち、到着したパケットのうち新たに格納されたデータ長を現在キュー長の値に加算する。
(ステップS21)制御部140は、到着したパケットの全体を格納済であるか否かを判定する。格納済でない(すなわち、超過分がある)場合、処理をステップS22に進める。格納済である場合、処理をステップS23に進める。
(ステップS22)制御部140は、バッファTBzの次の空きのあるバッファをバッファTBzとする。転送レートやパケット長によっては、次の(時間帯の)バッファが1以上の時間領域を飛ばした時間領域に対応するバッファになることもある。また、そのバッファに空きがなければ、更にその次のバッファがバッファTBzとして選ばれる。ここで、バッファ空きの有無は、ステップS16と同様に判定できる。
(ステップS23)制御部140は、フロー情報テーブル123を更新する。具体的には、到着したパケット(またはその一部)を最後に格納したバッファTBzをバッファTBxとし、当該バッファTBxに対応する時間領域をフロー情報テーブル123のTRの項目に設定する。また、同一フローの残り容量から最後にバッファTBxに格納したデータ量を減算した値をフロー情報テーブル123の残り容量の項目に設定する。
図10は、第2の実施の形態のパケットの格納例を示す図である。図10(A)では、3段階の転送レートのフローに対するパケットの格納方法を例示している。系列HのパケットH1,H2,・・・は、第1の転送レートのフローに対してバッファリングされたものである。系列MのパケットM1,M2,・・・,M50,M51,M52,・・・は、第1の転送レートよりも低い第2の転送レートのフローに対してバッファリングされたものである。系列LのパケットL1,L2,・・・,L50,L51,L52,・・・,L100,L101,L102,・・・は、第2の転送レートよりも低い第3の転送レートのフローに対してバッファリングされたものである。
例えば、系列Hでは、時間領域TR50まではフルにスケジューリングされていない。また、系列Mでは、時間領域TR100まではフルにスケジューリングされていない。系列Lでは、時間領域TR101以降にもスケジューリングされている。
図10(B)は、横軸を時間とし、縦軸を各バッファのサイズとして、現時点(横軸の0の時点)からの時間差によりバッファのサイズを段階的に小さくしている様子を例示している。バッファのサイズをこのように設けることで、35ms後までスケジューリングできる。ここで、現時点と時間領域との時間差は第1の実施の形態と同様の考え方で求めることができる。例えば、現時点と各時間領域の開始時点との時間差とすると、当該時間差が閾値以上になった場合に、バッファのサイズを1段階ずつ小さくしているといえる。具体的には、現時点と各時間領域との時間差が閾値5ms以上になると当該時間領域に対応するバッファのサイズを1段階小さくしている。更に、現時点と各時間領域との時間差が閾値10ms以上になると、当該時間領域に対応するバッファのサイズを更に1段階小さくしている。次に、バッファのサイズをこのように維持するための方法を説明する。
図11は、第2の実施の形態のバッファ再分配の例を示すフローチャートである。以下、図11に示す処理をステップ番号に沿って説明する。
(ステップS31)セレクタ150は、記憶部120に記憶されたタイムテーブル121を参照して、現時刻に対応するバッファ(バッファ管理テーブル122の読み出し中フラグがtrueのバッファ)からパケットを抽出して送信する。本例では、1つのバッファが0.1msの時間幅で読み出される。すなわち、1つのバッファについて、読み出し開始から0.1ms後に読み出し完了となる。セレクタ150は、読み出しが完了すると、読み出し完了したバッファについて、バッファ管理テーブル122の読み出し中フラグをtrueからfalseに変更する。また、当該読み出し完了したバッファについて、現在キュー長を0に更新する。更に、次の時間領域(例えば、時間領域TR1での読み出しが完了すれば時間領域TR2)の読み出し中フラグをfalseからtrueに変更する。
(ステップS32)制御部140は、読み出し完了したバッファのメモリ領域を解放する。
(ステップS33)制御部140は、解放されたメモリ領域を再分配する。具体例は後述する。
(ステップS34)制御部140は、何れかのフローでバッファに格納されたパケットが全て送信されたか否かを判定する。何れかのフローでバッファに格納されたパケットが全て送信された場合、処理をステップS35に進める。何れのフローでもバッファに格納されたパケットが全て送信されていない場合、処理を終了する。例えば、フロー情報テーブル123で何れかのフローのTRの項目で示される時間領域のバッファについて、ステップS31で読み出しが完了した場合に、何れかのフローでバッファに格納されたパケットが全て送信されたことになる。
(ステップS35)制御部140は、バッファリングされたパケットを全て送信済のフローにつき、フロー情報テーブル123のTRの項目をクリアする。TRの項目がクリアされると、当該TRの項目に基づいて、タイムテーブル121から対応するバッファのポインタを求めようとしても有効値は得られないことになる。
図12は、第2の実施の形態のバッファ再分配の例を示す図である。図12では、時間領域TR1(図12では旧TR1と表記している)に対応するバッファの読み出しが完了した場合を例示している。この場合、タイムテーブル121上では、時間領域TR2以降の時間領域の開始時点(現時点との時間差)が現時点側に0.1msずつシフトすることになる。すなわち、時間領域TR2は、0.1〜0.2ms後の時間帯から0〜0.1ms後の時間帯へ変更され読み出し対象となる。同様に時間領域TR3は、0.2〜0.3ms後の時間帯から0.1〜0.2ms後の時間帯へ変更される。
時間領域TR1(旧TR1)に対応するバッファのサイズは、100kbitsである。そのうち、50kbitsの領域R1を時間領域TR51に対応するバッファに分配する。すると、時間領域TR51に対応するバッファのサイズは100kbitsとなる。また、時間領域TR1に対応するバッファのうち、40kbitsの領域R2を時間領域TR101に対応するバッファに分配する。すると、時間領域TR101に対応するバッファのサイズは50kbitsとなる。更に、時間領域TR1に対応するバッファのうち、10kbitsの領域R3を新たな時間領域TR1(図12では新TR1と表記している)に分配する。すると、新たな時間領域TR1に対応するバッファは10kbtisとなる。新たな時間領域TR1は、34.9〜35ms後の時間帯に割り当てられることになる。このようにして、図10(B)で示した各バッファのサイズを維持できる。
図13は、スケジューリングの典型例を示す図である。時間軸上に実際にスケジューリングされるパケット量には疎密がある。具体的には、現在時刻近傍は密にスケジューリングされるが、時間軸が未来になるにつれて疎になっていくケースが多い。また、現在時刻近傍の時間にスケジューリングされているパケットは高レート系のフローのものが多く、逆に未来側の時間にスケジューリングされているパケットは低レート系のフローのものが多いと考えられる。
例えば、高レートのフローのパケットが5個と低レートのフローのパケットが5個到着したとする。高レートのフローのパケットは1つの時間領域(TR)により多くのパケットをスケジューリングできる。よって、時間領域TR1に4個、時間領域TR2に1個というように現在時刻付近に多くのパケットがスケジューリングされる。一方、低レートのフローのパケットは、複数の時間領域(TR)に1つのパケットしかスケジューリングできないこともある。この場合、時間領域TR1,TR6,TR11,TR16,TR21などのように未来側の時間帯に1個ずつスケジューリングされる。
このように、高レートのフローは現在時間付近に多くスケジューリングされ、低レートのフローは未来側の時間帯に分散してスケジューリングされ易いという傾向がある。
図14は、バッファのサイズの比較例を示す図である。図14(A)は、比較例における、時間軸に対する各バッファのサイズを示している。比較例では、10Mbitsというバッファ部130の合計サイズに対してバッファのサイズを均等にする。この場合、各バッファのサイズは100kbitsである。各バッファは0.1msの時間幅に対応するから、スケジューリングできるのは10ms後までである。
図14(B)では図10(A)と同様に3段階のレートのフローが例示されている。系列H,M,Lの意味は、図10(A)と同様である。この場合、低レートのフローにおけるパケットL101以降のパケットは、スケジューリングできずに破棄されてしまうことになる。一方で、図13で説明したように、高レート系のフローは、現在時間付近に多くスケジューリングされる傾向にある。このため、図14(A)(B)における領域Eの部分は、バッファリングに利用されない可能性が高い。
そこで、図10(B)で示したように、現時点と時間領域(TR)との相対的な時間差が大きいほど、当該時間領域に対応するバッファのサイズを相対的に小さくする。すなわち、現在時刻近傍には十分なバッファ容量を用意するが、未来側になるにつれて用意するバッファのサイズを減らす。すると、比較例に対して利用できるメモリサイズに余剰分ができる。この余剰分を時間軸の拡張に回せることになる。具体的には、比較例では10ms後までしかタイムテーブルをもてないが、第2の実施の形態の方法によれば、35msまで拡張できることになる。これにより、低レートのフローについて、バースト耐力を向上することができる。
なお、第2の実施の形態では、バッファのサイズを3段階としているが、2段階としてもよいし、4段階以上としてもよい。
[第3の実施の形態]
以下、第3の実施の形態を説明する。前述の第2の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
第2の実施の形態では、各バッファに対して読み出しを行う時間幅を同一にして、現時点との時間差に応じて各バッファのサイズを異なるものとした。一方、読み出しを行う時間幅をバッファごとに変えることで、単位時間に割り当てられるバッファのサイズを変えることが考えられる。ここで、第3の実施の形態の中継装置は、第2の実施の形態と同様である。そこで、第3の実施の形態では第2の実施の形態と同様の名称・符号を用いる。
図15は、第3の実施の形態のタイムテーブルの例を示す図である。図15(A)は、現時点から5ms後までを示している。図15(B)は、5msより後を示している。タイムテーブル121aは、タイムテーブル121に代えて、記憶部120に格納される。第3の実施の形態では、2つのグループのバッファ群を用いる。
第1のグループの各バッファは、現時点から10ms後までを0.1ms単位で区切った各時間領域に対応付けられる。第2のグループの各バッファは、現時点から35ms後までを1ms単位で区切った各時間領域に対応付けられる。第1のグループの各バッファでは、0.1ms刻みで読み出し対象のバッファが切り替えられる。第2のグループの各バッファでは、1ms刻みで読み出し対象のバッファが切り替えられる。
ここで、現時刻(0秒の時点)〜0.1ms後の時間帯は時間領域TR1である。0.1〜0.2ms後の時間帯は時間領域TR2である。このように10ms後までを0.1ms単位で区切られた時間領域を合計100個定義できる。すなわち、時間領域TR1,T2,・・・,TR100が存在する。このように、第1のグループの各バッファは、第2のグループの各バッファよりも短い時間幅の時間領域に対応付けられる。したがって、第1のグループの各バッファが割り当てられる現時点〜10ms後までの時間を短TR領域と呼ぶことができる。
また、現時点(0秒の時点)〜1.0ms後の時間帯は時間領域TR101である。1.0〜2.0ms後の時間帯は時間領域TR102である。このように、35ms後までを1.0ms単位で区切られた時間領域を合計35個定義できる。すなわち、時間領域TR101,TR102,・・・,TR135が存在する。このように、第2のグループの各バッファは、第1のグループの各バッファよりも長い時間幅の時間領域に対応付けられる。したがって、第2のグループの各バッファが割り当てられる10〜35ms後までの時間を長TR領域と呼ぶことができる。
このとき、第1のグループのバッファのサイズは、対応する時間領域と現時点との時間差が大きいほど、小さくなるように制御される。具体的には、時間領域TR1〜TR50の各バッファのサイズを90kbitsとする。時間領域TR51〜TR100の各バッファのサイズを40kbitsとする。第2のグループのバッファのサイズは、100kbitsである。第1のグループのバッファのサイズは、第2の実施の形態で説明したサイズよりも10kbitsずつ小さくする。同じ時間帯に、第2のグループのバッファからも読み出しを行うためである。ここで、バッファ部130の各バッファの合計のバッファ容量は10Mbitsである。
図16は、第3の実施の形態のセレクタの例を示す図である。セレクタ150は、0.1ms(読み出しの1単位時間)の間に2つのバッファからパケットを読み出して出力することになる。セレクタ150は、例えば、第1のグループのバッファを完全優先として読み出しを行うことが考えられる。例えば、ある時間帯で、時間領域TR1,TR101に対応する2つのバッファからパケットを読み出すとき、時間領域TR1に対応するバッファからの読み出しが完了した後に、時間領域TR101に対応するバッファからの読み出しを行う。
ただし、セレクタ150は、1単位時間において、WFQ(Weighted Fair Queuing)によって2つのバッファからパケットを読み出してもよい。例えば、時間領域TR1に対応するバッファに対して9という重み付けをし、時間領域TR101に対応するバッファに対して1という重み付けをして読み出しを行うことが考えられる。この場合、時間領域TR1に対応するバッファから所定の9単位分のデータを読み出した後に、時間領域TR101に対応するバッファから所定の1単位分のデータを読み出す。その後、時間領域TR1に対応するバッファから9単位分のデータを読み出した後に、時間領域TR101に対応するバッファから1単位分のデータを読み出すというように0.1msの間に繰り返して読み出すことになる。重み付けにより読み出し元を切り替えるので、完全優先で読み出すよりもバースト性を緩和し得る。
図17は、第3の実施の形態のバッファ管理テーブルの例を示す図である。バッファ管理テーブル122aは、バッファ管理テーブル122に代えて、記憶部120に格納される。バッファ管理テーブル122aは、TR、上限値、現在キュー長、読み出し中フラグおよびTRタイプの項目を含む。ここで、TR、上限値、現在キュー長および読み出し中フラグの項目に登録される内容は、バッファ管理テーブル122と同様である。TRタイプの項目には、対応する時間領域の時間幅を示す情報が登録される。
例えば、バッファ管理テーブル122aには、TRが“1”、上限値が“90k”、現在キュー長が“87k”、読み出し中フラグが“true”、TRタイプが“0.1ms”という情報が登録されている。これは、時間領域TR1に対応するバッファのサイズが90kbitsであり、現在既に87kbits分のパケットが格納済みであること、当該バッファが現在読み出しの対象となっていることを示す。また、時間領域TR1の時間幅が0.1msであることを示す。
なお、第3の実施の形態では、TRタイプが0.1msおよび1msの2つのバッファを読み出す。このため、例えば、時間領域TR101に対応するバッファについても、読み出し中フラグが“true”となっている。それ以外のバッファの読み出し中フラグは“false”となる。
以下の説明では、TRタイプ“0.1ms”のバッファを短TRのバッファということがある。また、TRタイプ“1ms”のバッファを長TRのバッファということがある。
図18は、第3の実施の形態のフロー情報テーブルの例を示す図である。フロー情報テーブル123aは、フロー情報テーブル123に代えて、記憶部120に格納される。フロー情報テーブル123aは、フロー番号、短TR用バッファ当たりデータ量、長TR用バッファ当たりデータ量、許容遅延、TRおよび残り容量の項目を含む。フロー番号、許容遅延、TRおよび残り容量の項目に登録される内容は、フロー情報テーブル123と同様である。ただし、第3の実施の形態では、同一のフローでもパケットの格納先が長TRおよび短TRのバッファの両方となり得る。そこで、許容遅延の項目には、長TR換算での値を保持するものとする。
短TR用バッファ当たりデータ量の項目には、対応するフローに関して、TRタイプ“0.1ms”のバッファに格納できるデータ量が登録される。長TR用バッファ当たりデータ量の項目には、当該フローに関して、TRタイプ“1ms”のバッファに格納できるデータ量が登録される。
例えば、フロー情報テーブル123aには、フロー番号が“1”、短TR用バッファ当たりデータ量が“50k”、長TR用バッファ当たりデータ量が“100k”、許容遅延が“3TR”、TRが“TR3”、残り容量が“40k”という情報が登録されている。これは、フロー番号“1”で識別されるフローが、TRタイプ“0.1ms”の1つのバッファに対して50kbitsのデータを格納でき、また、TRタイプ“1ms”の1つのバッファに対して100kbitsのデータを格納できることを示す。また、当該フローに対して、スケジューリングの際に現時点から長TR換算で3TR分先(短TR換算では10倍の30TR)までは遅延が許容されていることを示す。また、当該フローのパケットが時間領域TR3に対応するバッファに最後に格納されており、当該バッファに対して当該フローが格納できる残りのデータ量が40kbitsであることを示す。
図19は、第3の実施の形態のバッファリングの例を示すフローチャートである。以下、図19に示す処理をステップ番号に沿って説明する。
(ステップS41)制御部140は、転送対象のパケットを取得する(以下では、当該パケットを指して、到着したパケットということがある)。
(ステップS42)制御部140は、当該パケットのフロー番号を取得する。制御部140は、記憶部120に記憶されたタイムテーブル121aおよびフロー情報テーブル123aを参照して、現在パケットを格納中のバッファTBxを示す情報を取得する。バッファTBxは、フロー情報テーブル123aのTRの項目に設定された時間領域を示す情報、あるいは、当該時間領域に対応するバッファを示すポインタにより示される。
(ステップS43)制御部140は、バッファTBxを示す情報が有効値であるか否かを判定する。有効値である場合、処理をステップS44に進める。有効値でない場合、処理をステップS47に進める。
(ステップS44)制御部140は、バッファTBxを、到着したパケットを格納する候補のバッファTBzとする。
(ステップS45)制御部140は、バッファTBzが長TRのバッファであるか否かを判定する。長TRのバッファである場合、ステップS46に進める。長TRのバッファでない場合、処理をステップS48に進める。バッファTBzが長TRであるか否かは、バッファ管理テーブル122aに基づいて判定できる。
(ステップS46)制御部140は、長TRベースの処理を行う。詳細は後述する。
(ステップS47)制御部140は、現在読み出し中のバッファTByの次の短TRのバッファをバッファTBzとする。転送レートやパケット長によっては、次の時間帯の短TRのバッファが1以上の時間領域を飛ばした時間領域に対応するバッファになることもある。
(ステップS48)制御部140は、記憶部120に記憶されたバッファ管理テーブル122aおよびフロー情報テーブル123aを参照して、候補のバッファTBzに空きがあるか否かを判定する。空きがある場合、処理をステップS51に進める。空きがない場合、処理をステップS49に進める。空きがある場合とは、バッファ管理テーブル122aにおいて、バッファTBzの現在キュー長が上限値に達しておらず、かつ、フロー情報テーブル123aにおいて対象のフローがバッファTBzに格納できる残り容量が0より大きい場合である。
(ステップS49)制御部140は、バッファTBzの次の空きのあるバッファをバッファTBzとする。転送レートやパケット長によっては、次の(時間帯の)バッファが1以上の時間領域を飛ばした時間領域に対応するバッファになることもある。また、そのバッファに空きがなければ、更にその次のバッファがバッファTBzとして選ばれる。ここで、バッファ空きの有無は、ステップS48と同様に判定できる。なお、短TR領域からバッファを選択する場合には、長TRのバッファは選択されない。短TR領域に候補となるバッファが存在しない場合には、長TR領域からバッファを選択することになる。
(ステップS50)制御部140は、バッファTBzが長TRのバッファであるか否かを判定する。長TRのバッファである場合、処理をステップS46に進める。長TRのバッファでない場合、処理をステップS51に進める。
(ステップS51)制御部140は、短TRベースの処理を行う。詳細は後述する。
次に、ステップS46の長TRベースの処理の手順を説明する。
図20は、第3の実施の形態の長TRベースの処理例を示すフローチャートである。以下、図20に示す処理をステップ番号に沿って説明する。
(ステップS61)制御部140は、記憶部120に記憶されたバッファ管理テーブル122aおよびフロー情報テーブル123aを参照して、候補のバッファTBzに空きがあるか否かを判定する。空きがある場合、処理をステップS63に進める。空きがない場合、処理をステップS62に進める。空きがある場合とは、バッファ管理テーブル122aにおいて、バッファTBzの現在キュー長が上限値に達しておらず、かつ、フロー情報テーブル123aにおいて対象のフローがバッファTBzに格納できる残り容量が0より大きい場合である。
(ステップS62)制御部140は、バッファTBzの次の時間帯のバッファを、候補のバッファTBzとする。転送レートやパケット長によっては、次の時間帯のバッファが1以上の時間領域を飛ばした時間領域に対応するバッファになることもある。そして、処理をステップS61に進める。ここで、バッファTBzが長TR領域に含まれる長TRのバッファであれば、制御部140は、次の時間帯のバッファとして長TRのバッファを選択する。他方、バッファTBzが短TR領域に含まれる長TRのバッファであれば、制御部140は、次の時間帯のバッファとして短TRのバッファを選択する。
(ステップS63)制御部140は、タイムテーブル121aおよびフロー情報テーブル123aを参照して、バッファTBzと現在読み出し中のバッファTByとの時間差が、許容遅延N以下であるか否かを判定する。当該時間差が許容遅延N以下である場合、処理をステップS65に進める。当該時間差が許容遅延Nよりも大きい場合、処理をステップS64に進める。
(ステップS64)制御部140は、到着したパケットを破棄する。そして、処理を終了する。
(ステップS65)制御部140は、バッファTBzに到着したパケットを格納する。制御部140は、バッファ管理テーブル122aを更新する。具体的には、ステップS65におけるパケットの格納結果をバッファ管理テーブル122aに反映させる。すなわち、到着したパケットのうち新たに格納されたデータ長を現在キュー長の値に加算する。ステップS65のバッファTBzは、ステップS61,S62の処理に応じて、長TRのバッファである場合もあるし、短TRのバッファである場合もある。
(ステップS66)制御部140は、到着したパケットの全体を格納済であるか否かを判定する。格納済でない(すなわち、超過分がある)場合、処理をステップS67に進める。格納済である場合、処理をステップS72に進める。
(ステップS67)制御部140は、バッファTBzの次の空きのあるバッファをバッファTBzとする。転送レートやパケット長によっては、次の(時間帯の)バッファが1以上の時間領域を飛ばした時間領域に対応するバッファになることもある。また、そのバッファに空きがなければ、更にその次のバッファがバッファTBzとして選ばれる。ここで、バッファ空きの有無は、ステップS61と同様に判定できる。また、制御部140は、バッファTBzが短TR領域に含まれる長TRのバッファである場合、次のバッファとして短TRを選択する。
(ステップS68)制御部140は、バッファTBzが短TRのバッファであるか否かを判定する。短TRのバッファである場合、処理をステップS69に進める。短TRのバッファでない場合、処理をステップS65に進める。
(ステップS69)制御部140は、バッファTBz(ここでは、短TRのバッファとなる)に到着したパケット(ただし、未格納の部分)を格納する。制御部140は、バッファ管理テーブル122aを更新する。すなわち、到着したパケットのうち新たに格納されたデータ長を現在キュー長の値に加算する。
(ステップS70)制御部140は、到着したパケットの全体を格納済であるか否かを判定する。格納済でない場合、処理をステップS71に進める。格納済である場合、処理をステップS72に進める。
(ステップS71)制御部140は、バッファTBzの次の空きのある短TRのバッファをバッファTBzとする。そして、処理をステップS69に進める。
(ステップS72)制御部140は、フロー情報テーブル123aを更新する。具体的には、到着したパケット(またはその一部)を最後に格納したバッファTBzをバッファTBxとして、当該バッファTBxに対応する時間領域をフロー情報テーブル123aのTRの項目に設定する。また、当該バッファTBxについて、同一フローの残り容量から最後にバッファTBxに格納された分のデータ量を減算した値をフロー情報テーブル123aの残り容量の項目に設定する。ここで、バッファTBxが短TRのバッファであれば、残り容量の最大値は短TR用バッファ当たりデータ量の設定値である。バッファTBxが長TRのバッファであれば、残り容量の最大値は長TR用バッファ当たりデータ量の設定値である。
この処理は、長TRベースのスケジューリングともいえる。次に、長TRベースのスケジューリングの具体例を説明する。
図21は、第3の実施の形態の長TRベースのスケジューリング例を示す図である。図21(A)は長TR領域における長TRのバッファが格納の起点となる場合を例示している。例えば、長TR領域に、時間領域TR111,TR112,TR113,TR114の長TRに対応するバッファが存在しており、到着したパケットを時間領域TR111から順に格納していくとする。このとき、到着したパケットは、例えば、最初に、時間領域TR111に対応するバッファに格納される。超過分があれば、次に、時間領域TR112に対応するバッファに格納される。更に超過分があれば、次に、時間領域TR113に対応するバッファに格納される。各バッファは何れも長TRのバッファである。
一方、図21(B)は短TR領域における長TRのバッファが格納の起点となる場合を例示している。例えば、短TR領域に、時間領域TR10,TR101,TR11,TR12の短TRと長TRとに対応するバッファが混在しており、到着したパケットを時間領域TR101から格納していくとする。このとき、到着したパケットは、例えば、最初に、時間領域TR101に対応するバッファに格納される。超過分があれば、次に、時間領域TR11に対応するバッファに格納される。更に超過分があれば、次に、時間領域TR12に対応するバッファに格納される。ここで、時間領域TR101に対応するバッファは、長TRのバッファである。時間領域TR11,TR12に対応する各バッファは、短TRのバッファである。
制御部140によるこのような制御はフローごとに行われる。次に、図19のステップS51の短TRベースの処理の手順を説明する。
図22は、第3の実施の形態の短TRベースの処理を示すフローチャートである。以下、図22に示す処理をステップ番号に沿って説明する。
(ステップS81)制御部140は、記憶部120に記憶されたバッファ管理テーブル122aおよびフロー情報テーブル123aを参照して、候補のバッファTBzに空きがあるか否かを判定する。空きがある場合、処理をステップS83に進める。空きがない場合、処理をステップS82に進める。空きがある場合とは、バッファ管理テーブル122aにおいて、バッファTBzの現在キュー長が上限値に達しておらず、かつ、フロー情報テーブル123aにおいて対象のフローがバッファTBzに格納できる残り容量が0より大きい場合である。
(ステップS82)制御部140は、バッファTBzの次の時間帯のバッファを候補のバッファTBzとする。転送レートやパケット長によっては、次の時間帯のバッファが1以上の時間領域を飛ばした時間領域に対応するバッファになることもある。そして、処理をステップS81に進める。ここで、制御部140は、原則として短TRのバッファから次の時間帯のバッファを選択する。ただし、バッファTBzが短TR領域と長TR領域との境界付近の短TRのバッファであれば、制御部140は、次の時間帯のバッファとして長TRのバッファを選択することもある。
(ステップS83)制御部140は、タイムテーブル121aおよびフロー情報テーブル123aを参照して、バッファTBzと現在読み出し中のバッファTByとの時間差が、許容遅延N×10以下であるか否かを判定する。当該時間差が許容遅延N×10以下である場合、処理をステップS85に進める。当該時間差が許容遅延N×10よりも大きい場合、処理をステップS84に進める。許容遅延Nを10倍するのは、前述のようにフロー情報テーブル123aに設定される許容遅延Nは、長TR換算だからである。ただし、ステップS82で長TRのバッファが選択されているときは、許容遅延Nを10倍しなくてよい。
(ステップS84)制御部140は、到着したパケットを破棄する。そして、処理を終了する。
(ステップS85)制御部140は、バッファTBzに到着したパケットを格納する。制御部140は、バッファ管理テーブル122aを更新する。具体的には、ステップS85におけるパケットの格納結果をバッファ管理テーブル122aに反映させる。すなわち、到着したパケットのうち新たに格納されたデータ長を現在キュー長の値に加算する。ステップS85のバッファTBzは、ステップS81,S82の処理に応じて、短TRのバッファである場合もあるし、長TRのバッファである場合もある。
(ステップS86)制御部140は、到着したパケットの全体を格納済であるか否かを判定する。格納済でない(すなわち、超過分がある)場合、処理をステップS87に進める。格納済である場合、処理をステップS93に進める。
(ステップS87)制御部140は、バッファTBzの次の空きのあるバッファとして、短TRのバッファを利用可能であるか否かを判定する。利用可能である場合、処理をステップS88に進める。利用可能でない場合、処理をステップS89に進める。ここで、次の空きのあるバッファとして短TRのバッファを利用可能であるか否かは、タイムテーブル121aを参照して判定できる。タイムテーブル121aの例でいえば、時間領域TR100が短TR領域の最後の時間領域である。よって、バッファTBzの次の空きのあるバッファとして、時間領域TR100以前に対応するバッファを選べるとき、バッファTBzの次の空きのあるバッファとして短TRのバッファを利用可能である。時間領域TR111以降に対応するバッファしか選べないとき、次の空きのあるバッファとして短TRを利用可能でない。
(ステップS88)制御部140は、バッファTBzの次の短TRの空きバッファをバッファTBzとする。転送レートやパケット長によっては、次の(時間帯の)バッファが1以上の時間領域を飛ばした時間領域に対応するバッファになることもある。そして、処理をステップS85に進める。
(ステップS89)制御部140は、バッファTBzの次の長TRの空きバッファをバッファTBzとする。ステップS88と同様に、転送レートやパケット長によっては、次の(時間帯の)バッファが1以上の時間領域を飛ばした時間領域に対応するバッファになることもある。
(ステップS90)制御部140は、バッファTBz(ここでは、長TRのバッファとなる)に到着したパケット(ただし、未格納の部分)を格納する。制御部140は、バッファ管理テーブル122aを更新する。すなわち、到着したパケットのうち新たに格納されたデータ長を現在キュー長の値に加算する。
(ステップS91)制御部140は、到着したパケットの全体を格納済であるか否かを判定する。格納済でない場合、処理をステップS92に進める。格納済である場合、処理をステップS93に進める。
(ステップS92)制御部140は、バッファTBzの次の長TRの空きバッファをバッファTBzとする。そして、処理をステップS90に進める。
(ステップS93)制御部140は、フロー情報テーブル123aを更新する。具体的には、到着したパケット(またはその一部)を最後に格納したバッファTBzをバッファTBxとして、当該バッファTBxに対応する時間領域をフロー情報テーブル123aのTRの項目に設定する。また、当該バッファTBxについて、同一フローの残り容量から最後にバッファTBxに格納された分のデータ量を減算した値をフロー情報テーブル123aの残り容量の項目に設定する。ここで、バッファTBxが短TRのバッファであれば、残り容量の最大値は短TR用バッファ当たりデータ量の設定値である。バッファTBxが長TRのバッファであれば、残り容量の最大値は長TR用バッファ当たりデータ量の設定値である。
この処理は、短TRベースのスケジューリングともいえる。短TR領域では、短TRのバッファを用いてスケジューリングを行い、短TR領域で短TRのバッファが利用できなくなると、長TR領域において長TRのバッファを用いてスケジューリングを行う。次に、短TRベースのスケジューリングの具体例を説明する。
図23は、第3の実施の形態の短TRベースのスケジューリング例を示す図である。図23(A)は第1のケースである。例えば、短TR領域に、時間領域TR10,TR101,TR11,TR12の短TRと長TRとに対応するバッファが混在しており、到着したパケットを時間領域TR10から順に格納していくとする。このとき、到着したパケットは、例えば、最初に、時間領域TR10に対応するバッファに格納される。超過分があれば、次に、時間領域TR11に対応するバッファに格納される。更に超過分があれば、次に、時間領域TR12に対応するバッファに格納される。パケットが格納される各バッファは何れも短TRのバッファである。
一方、図23(B)は短TR領域と長TR領域との境界にある短TRのバッファが格納の起点となる場合を例示している。例えば、短TR領域および長TR領域との境界において、時間領域TR100,TR110,TR111,TR112に対応するバッファが混在しており、到着したパケットを時間領域TR100から格納していくとする。このとき、到着したパケットは、例えば、最初に、時間領域TR100に対応するバッファに格納される。超過分があれば、次に、時間領域TR111に対応するバッファに格納される。更に超過分があれば、次に、時間領域TR112に対応するバッファに格納される。ここで、時間領域TR100に対応するバッファは、短TRのバッファである。時間領域TR111,TR112に対応する各バッファは、長TRのバッファである。時間領域TR110に対応するバッファを飛ばすのは、当該バッファが時間領域TR100に対応するバッファと読み出しの時間帯が重複しているからである。
図24は、第3の実施の形態のバッファ再分配の例を示すフローチャートである。以下、図24に示す処理をステップ番号に沿って説明する。
(ステップS101)セレクタ150は、記憶部120に記憶されたタイムテーブル121aを参照して、現時刻に対応する短TRのバッファ(バッファ管理テーブル122aでTRタイプが0.1ms、かつ、読み出し中フラグがtrueのバッファ)からパケットを抽出して送信する。例えば、セレクタ150は短TRのバッファを完全優先で読み出す。
(ステップS102)セレクタ150は、タイムテーブル121aを参照して、現時刻に対応する長TRのバッファ(バッファ管理テーブル122aでTRタイプが1ms、かつ、読み出し中フラグがtrueのバッファ)からパケットを抽出して送信する。
(ステップS103)制御部140は、読み出し完了したバッファのメモリ領域を解放する。0.1msごとに1つの短TRのバッファの読み出しが完了する。1msごとに1つの長TRのバッファの読み出しが完了する。タイムテーブル121aにおいて、例えば、時間領域TR1に対応するバッファからの読み出しが完了したとする。この場合、90kbits分のメモリ領域が解放される。また、例えば、時間領域TR101に対応するバッファからの読み出しが完了したとする。この場合、100kbits分のメモリ領域が解放される。
(ステップS104)制御部140は、解放されたメモリ領域を再分配する。例えば、時間領域TR1に対応するバッファのメモリ領域が解放されとする。すると、制御部140は、時間領域TR51に対応するバッファに、解放されたメモリ領域のうち50kbits分を追加する(当該バッファの容量は計90kbitsとなる)。また、制御部140は、新たな時間領域TR1(9.9−10ms後)に対応するバッファに、解放されたメモリ領域のうち40kbits分を割り当てる(当該バッファの容量は計40kbitsとなる)。また、別の例として、時間領域TR101に対応するバッファのメモリ領域が解放されたとする。すると、制御部140は、新たな時間領域TR101(34−35ms後)に対応するバッファに、解放されたメモリ領域のうちの全て(100kbits)を割り当てる。
(ステップS105)制御部140は、何れかのフローでバッファに格納されたパケットが全て送信されたか否かを判定する。何れかのフローでバッファに格納されたパケットが全て送信された場合、処理をステップS106に進める。何れのフローでもバッファに格納されたパケットが全て送信されていない場合、処理を終了する。例えば、フロー情報テーブル123aで何れかのフローのTRの項目で示される時間領域のバッファについて、ステップS101またはステップS102で読み出しが完了した場合に、何れかのフローでバッファに格納されたパケットが全て送信されたことになる。
(ステップS106)制御部140は、バッファリングされたパケットを全て送信済のフローにつき、フロー情報テーブル123aのTRの項目をクリアする。TRの項目がクリアされると、当該TRの項目に基づいて、タイムテーブル121aから対応するバッファのポインタを求めようとしても有効値は得られないことになる。
このようにして、図15で示した各バッファのサイズを維持できる。なお、読み出し対象の短TRのバッファを切り替えるタイミングと読み出し対象の長TRのバッファを切り替えるタイミングとを整合させて、読み出されるバッファの時系列が崩れないようにする。また、ステップS101,S102では、前述のようにWFQの方法を用いて短TRのバッファおよび長TRのバッファからパケットを読み出してもよい。
第3の実施の形態では、短TRと長TRとの2つのグループのバッファを設ける。第3の実施の形態では、長TRの各バッファの読み出しの時間幅を、短TRの各バッファの読み出しの時間幅の10倍の1msとしている。そして、第2の実施の形態で設けていたサイズ10kbitsの代わりに、長TRの各バッファを用いる。すると、第2の実施の形態では時間領域を350個管理していたのに対し、第3の実施の形態では時間領域を135個管理すればよくなる。しかも、第2,第3の実施の形態の何れも35ms秒後までスケジューリングできる。このため、第3の実施の形態でも、低レートのフローに対して効率的にバッファ容量を確保することができ、バースト耐力を向上できる。また、管理対象となる時間領域の数を低減できるので、バッファ管理の演算コストを軽減できる。
[第4の実施の形態]
以下、第4の実施の形態を説明する。前述の第2,第3の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
第3の実施の形態では、フローの転送レートに関わらず、短TRと長TRとの両方のバッファを利用してスケジューリングを行うものとした。したがって、第3の実施の形態では、1つのフローのパケットが、短TRのバッファおよび長TRのバッファの両方に格納され得る。一方、フローに応じて、短TRか長TRかの何れのバッファに格納するかを決定してもよい。そこで、第4の実施の形態ではそのための方法を説明する。
ここで、第4の実施の形態の中継装置は、第2の実施の形態と同様である。そこで、第4の実施の形態では第2の実施の形態と同様の名称・符号を用いる。ただし、第4の実施の形態では、図15で示したタイムテーブル121aおよび図17で示したバッファ管理テーブル122aを用いる。また、第4の実施の形態では、セレクタ150は、図16で示したように短TRおよび長TRの両方から読み出しを行う。
図25は、第4の実施の形態のフロー情報テーブルの例を示す図である。フロー情報テーブル123bは、フロー情報テーブル123に代えて、記憶部120に格納される。フロー情報テーブル123bは、フロー番号、バッファ当たりデータ量、許容遅延、TR、残り容量およびTRタイプの項目を含む。フロー番号、バッファ当たりデータ量、許容遅延、TRおよび残り容量の項目に登録される内容は、フロー情報テーブル123と同様である。
TRタイプの項目には、短TRおよび長TRの何れのバッファを用いてスケジューリングを行うかを示す情報が登録される。第3の実施の形態と同様に、短TRのバッファは読み出しの時間幅が0.1msのバッファである。また、長TRのバッファは読み出しの時間幅が1msのバッファである。
例えば、フロー情報テーブル123bには、フロー番号が“1”、バッファ当たりデータ量が“50k”、許容遅延が“30TR”、TRが“TR3”、残り容量が“40k”、TRタイプが“0.1ms”という情報が登録されている。これは、フロー番号“1”で識別されるフローが、1つのバッファに対して50kbitsのデータを格納でき、スケジューリングの際に現時点から30TR分先までは遅延が許容されていることを示す。また、当該フローのパケットが時間領域TR3に対応するバッファに最後に格納されており、当該バッファに対して当該フローが格納できる残りのデータ量が40kbitsであることを示す。また、スケジューリングに用いるのが短TRのバッファであることを示す。
ここで、フロー情報テーブル123bでは、比較的高レートのフローに対して短TRのバッファを用いるようにする。また、比較的低レートのフローに対して長TRのバッファを用いるようにする。時間軸に対する各バッファのサイズを図13で説明したスケジューリングの典型例に対応させるためである。
制御部140は、フローごとの転送レートに応じて、短TRのバッファを用いるか長TRのバッファを用いるかを自動的に決定してもよい。例えば、全体のフローの中で、相対的に高レートのフロー(例えば、合計で10個のフローがあれば転送レートの高い方から5個目までのフロー)に対して短TRのバッファを用いると決定する。また、相対的に低レートのフロー(例えば、合計で10個のフローがあれば転送レートの低い方から5個目までのフロー)に対して長TRのバッファを用いると決定する。制御部140は、決定結果をフロー情報テーブル123bに設定してもよい。
図26は、第4の実施の形態のバッファリングの例を示すフローチャートである。以下、図26に示す処理をステップ番号に沿って説明する。なお、第4の実施の形態のバッファリングの手順では、図9で説明した第2の実施の形態のバッファリングの手順に対して、ステップS12とステップS13との間にステップS12aを実行する点が異なる。それ以外のステップについては、第2の実施の形態のバッファリングの手順と同様であるため、説明を省略する。ただし、何れの処理においても、制御部140はタイムテーブル121a、バッファ管理テーブル122aおよびフロー情報テーブル123bを参照して処理を行う点が異なる。
(ステップS12a)制御部140は、フロー情報テーブル123bを参照して、到着したパケットのフローに対応するTRタイプを決定する。制御部140は、ステップS12a以降では、ステップS12aで決定されたTRタイプに対応するバッファ(短TRのバッファか長TRのバッファの何れか)を用いることになる。
図27は、第4の実施の形態の高レートフローのスケジューリングを示す図である。制御部140は、短TRのバッファのみを用いて高レートのフローのスケジューリングを行う。例えば、図27において、短TRのバッファは、時間領域TR1,TR2,・・・,TR10,TR11,・・・,TR51,・・・,TR100に対応するバッファである。例えば、フロー情報テーブル123bによれば、フロー番号“1”のパケットは、これら短TRのバッファのみを用いてスケジューリングされることになる。
図28は、第4の実施の形態の低レートフローのスケジューリングを示す図である。制御部140は、長TRのバッファのみを用いて低レートのフローのスケジューリングを行う。例えば、図28において、長TRのバッファは、時間領域TR101,TR102,・・・,TR110,TR111,・・・,TR135に対応するバッファである。例えば、フロー情報テーブル123bによれば、フロー番号“3”のパケットは、これら長TRのバッファのみを用いてスケジューリングされることになる。
このようにすることで、第3の実施の形態に比べて、短TRのバッファと長TRのバッファとを個別に管理できる。例えば、短TRのバッファの切り替えタイミングと長TRのバッファの切り替えタイミングとの整合を考えなくてもよい。また、第3の実施の形態のように、短TRと長TRとの何れのバッファに格納するかに応じた格納可能なデータ量の判断を行わなくてもよい。したがって、スケジューリングにおける制御を容易に行える。また、高レートのフローと低レートのフローとで使用するバッファを分けるので、高レートのフローにより、未来側(長TR領域)のバッファが占有されてしまうことの防止も図れる。
なお、第3,第4の実施の形態では、短TRのバッファのサイズを2段階としているが、3段階以上としてもよい。
[第5の実施の形態]
以下、第5の実施の形態を説明する。前述の第2〜第4の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
第3,第4の実施の形態では、タイムテーブル121aの短TR領域にサイズの異なる2種類のバッファを設けた。ただし、そのうちの一方だけにしてもよい。第5の実施の形態では、この場合を例示する。ここで、第5の実施の形態の中継装置は、第2の実施の形態と同様である。そこで、第5の実施の形態では第2の実施の形態と同様の名称・符号を用いる。ただし、第5の実施の形態では、スケジューリングに用いるタイムテーブルおよびバッファ管理テーブルが第2の実施の形態と異なる。また、第5の実施の形態では、セレクタ150は、図16で示したように短TRおよび長TRの両方から読み出しを行う。
図29は、第5の実施の形態のタイムテーブルの例を示す図である。図29(A)は、現時点から5ms秒後までを示している。図(B)は、5msより後を示している。タイムテーブル121bは、タイムテーブル121に代えて、記憶部120に格納される。第5の実施の形態では、2つのグループのバッファ群を用いる。
第1のグループの各バッファは、現時点から5ms後までを0.1ms単位で区切った各時間領域に対応付けられる。第2のグループの各バッファは、現時点から5ms後までを1ms単位で区切った各時間領域に対応付けられる。第1のグループの各バッファでは、0.1ms刻みで読み出し対象のバッファが切り替えられる。第2のグループの各バッファでは、1ms刻みで読み出し対象のバッファが切り替えられる。
ここで、現時刻(0秒の時点)〜0.1ms後の時間帯は時間領域TR1である。0.1〜0.2ms後の時間帯は時間領域TR2である。このように5ms後までを0.1ms単位で区切った時間領域を合計50個定義できる。すなわち、時間領域TR1,TR2,・・・,TR50が存在する。このように、第1のグループの各バッファは、第2のグループの各バッファよりも短い時間幅の時間領域に対応付けられる。したがって、第1のグループの各バッファが割り当てられる現時点〜5ms後までの時間を短TR領域と呼ぶことができる。
また、現時点(0秒の時点)〜1.0ms後の時間帯は時間領域TR51である。1.0〜2.0ms後の時間帯は時間領域TR52である。このように、50ms後までを1.0ms単位で区切った時間領域を合計50個定義できる。すなわち、時間領域TR51,TR52,・・・,TR100が存在する。このように、第2のグループの各バッファは、第1のグループの各バッファよりも長い時間幅の時間領域に対応付けられる。したがって、第2のグループの各バッファが割り当てられる10〜50ms後までの時間を長TR領域と呼ぶことができる。
第1のグループに属するバッファのサイズは、90kbitsである。第2のグループに属するバッファのサイズは、100kbitsである。第1のグループのバッファのサイズは、第2のグループのバッファサイズよりも10kbitsずつ小さくする。同じ時間帯に、第2のグループのバッファからも読み出しを行うためである。ここで、バッファ部130の各バッファの合計のサイズは9.5Mbitsである。
図30は、第5の実施の形態のバッファ管理テーブルの例を示す図である。バッファ管理テーブル122bは、バッファ管理テーブル122に代えて、記憶部120に格納される。バッファ管理テーブル122bは、TR、上限値、現在キュー長、読み出し中フラグおよびTRタイプの項目を含む。ここで、TR、上限値、現在キュー長および読み出し中フラグの項目に登録される内容は、バッファ管理テーブル122と同様である。TRタイプの項目には、対応する時間領域の時間幅を示す情報が登録される。バッファ管理テーブル122bの設定内容は、バッファ管理テーブル122aと同様である。ただし、バッファ管理テーブル122bでは、短TR領域に1つの種類のサイズ(90kbits)のバッファを設けている点が異なる。
このように短TR領域を複数の種類のサイズに分けなくてもよい。なお、バッファリングの手順は、第3,第4の実施の形態と同じ手順を用いることができる。例えば、1つのフローを短TRおよび長TRの両方のバッファを用いてスケジューリングしてもよいし、フローに応じて決定される短TRおよび長TRの何れか一方のバッファを用いてスケジューリングしてもよい。
[第6の実施の形態]
以下、第6の実施の形態を説明する。前述の第2〜第5の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
例えば、中継装置に設定されるフローに対する転送レートは、ユーザとの契約やサービスの利用状況になどによっても変更され得る。例えば、フローを新規に追加したり、削除したりすることもあるし、予め設定されたフローの転送レートを増減することもある。このような設定変更に応じて、各バッファのサイズを変更してもよい。
ここで、第6の実施の形態の中継装置は、第2の実施の形態と同様である。そこで、第6の実施の形態では第2の実施の形態と同様の名称・符号を用いる。ただし、記憶部120が、中継装置100における帯域を管理するための帯域管理テーブルを記憶する点が第2の実施の形態と異なる。また、制御部140が、帯域管理テーブルに基づいて各時間領域に対応するバッファのサイズを変更する点が第2の実施の形態と異なる。
図31は、第6の実施の形態の帯域管理テーブルの例を示す図である。帯域管理テーブル124は、記憶部120に記憶される。帯域管理テーブル124は、レート区分、レート上限値、ユーザ数カウンタおよび累積帯域カウンタの項目を含む。
レート区分の項目には、レート区分を示す番号が登録される。レート上限値の項目には、当該レート区分における転送レートの上限値が登録される。ユーザは、レート区分ごとのレート上限値に達しない範囲で、上限の転送レートを契約できる。ユーザ数カウンタの項目には、当該レート区分で通信するユーザの数が登録される。累積帯域カウンタの項目には、当該レート区分において、各ユーザにより契約された転送レートの累積の帯域を示す情報が登録される。
例えば、帯域管理テーブル124には、レート区分が“1”、レート上限値が“500Mbps”、ユーザ数カウンタが“3”、累積帯域カウンタが“912Mbps”という情報が登録される。これは、レート区分“1”では転送レートの上限値が500Mbpsであり、契約しているユーザが3人であり、当該3人のユーザにより契約されている転送レートの累積が912Mbpsであることを示している。
なお、帯域管理テーブル124において、レート上限値の値が大きい程、高レートのフローであるといえる。例えば、レート区分“1”〜“3”のうちでは、レート区分“1”に属するフローが最高レートである。レート区分“2”に属するフローはその次に高レートであり、レート区分“3”に属するフローは最低レートである。
図32は、第6の実施の形態のバッファ容量変更例を示すフローチャートである。以下、図32に示す処理をステップ番号に沿って説明する。
(ステップS111)制御部140は、フローの設定変更を受け付ける。
(ステップS112)制御部140は、記憶部120に記憶された帯域管理テーブル124を更新する。例えば、新たにレート上限値が9Mbpsの契約が追加された場合には、レート区分“3”のユーザ数カウンタに1を加算する。そして、累積帯域カウンタの設定値に9Mbpsを加算する。
(ステップS113)制御部140は、変更後の帯域管理テーブル124に基づいて、記憶部120に記憶されたバッファ管理テーブル122の設定を変更する。例えば、次のような変更が考えられる。記憶部120に記憶されたタイムテーブル121において、時間領域TR1〜TR50をレート区分“1”に、時間領域TR51〜TR100をレート区分“2”に、時間領域TR101〜TR350をレート区分“3”にそれぞれ対応付ける。そして、それぞれのレート区分に対して、帯域管理テーブル124に記憶された累積帯域カウンタの値に応じたバッファ容量を割り当てる。
具体的には、レート区分“3”で累積帯域カウンタが85.5Mbpsであれば、時間領域TR101〜TR350において0.1msごとに8.55kbits分のバッファを用意すればよい。そこで、時間領域TR101〜TR350に格納され得るパケット量と同じ量のバッファを用意しておく。例えば、レート区分“3”において、9Mbpsのフローが追加された場合には、累積帯域は94.5Mbpsになる。すると、時間領域TR101〜TR350において0.1msごとに9.45kbits分のバッファを用意すればよいことになる。したがって、制御部140は、時間領域TR101〜TR350のバッファのサイズを0.9kbits分増加させる。
図33は、第6の実施の形態のバッファ容量変更例を示す図である。図33(A)は変更前を示している。図33(B)は変更後を示している。例えば、図33(A)の変更前の状態では、レート区分“3”の累積帯域カウンタ85.5Mbpsである。変更前では時間領域TR101〜TR350(時間軸の10〜35ms後)に対応する各バッファにおいて、0.1msごとに8.55kbitsのサイズのバッファを用意している。レート区分“3”で9Mbpsのフローが追加された場合、時間領域TR101〜TR350に対応する各バッファにおいて、前述のように0.9kbits分だけ増加させる。
すると、図33(B)で示すように、時間領域TR101〜TR350に対応する各バッファにおいて、0.1msごとに9.45kbitsのサイズのバッファが用意されることになる。この場合、時間領域TR101〜TR350において、合計で225kbitsを更に割り当てることになる。すると、バッファ部130で利用可能な容量を超過する可能性もある。そこで、例えば、レート区分“1”に対応する時間領域TR1〜TR50(時間軸の0〜5ms)の一部(時間領域TR50側)のサイズを減少させてもよい。図33(B)の例では、時間領域TR41〜TR50(4〜5ms後)に対応するバッファのサイズを100kbitsから56.75kbitsに変更する。すなわち、バッファのサイズが変更される境界の時間を5ms後から4ms後へシフトする。このようにして、低レートのフローに対する容量を確保している。制御部140は、境界の時間のシフト量を、確保したい容量に合わせて制御してもよい。例えば、225kbits分を確保したければ、0.3msのシフト量としてもよい。利用可能なメモリ領域を効率的に利用するためである。
このようにして、制御部140は、フローの設定変更に応じてバッファのサイズも変更する。例えば、低レートのフローが比較的多い場合に、未来側のバッファを比較的多めに設定すれば、低レートの各フローについてバッファが不足することの防止を図れる。
ここで、上記の説明では、時間領域TR1,TR2,・・・それぞれに対して1つのバッファを対応付けて説明したが、各バッファを複数のスロットの集合と考えてもよい。
図34は、バッファの他の例を示す図である。例えば、時間領域TR1に対応するバッファが、固定長の複数のスロット(図34の例ではslot1,slot2,・・・,slot100)の集合と考えてもよい。すると、当該バッファのサイズは複数のスロットのサイズの合計ということになる。その場合でも、時間領域TR1,TR2,・・・に対してスロットの数を増減することで各バッファのサイズを調整し得る。したがって、スロットを用いてスケジューリングを行う場合にも第2〜第6の実施の形態の方法を適用することができる。