2004年 7月 7日 初版 |
2009年11月30日 ポートの範囲指定の注意追記 |
本資料は、
1 はじめに
2 優先制御(PRIQ)
3 帯域制御(CBQ)
で構成しています。
FITELnet-F100(以後、F100と称します)およびFITELnet-F1000(以後、F1000と称します)に実装されている「優先制御(CoS:Class of Service)」および「帯域制御(QoS:Quality of Service)」機能は、ネットワーク上で、データの種類に優先度を設けてデータを送信したり、ある特定の通信の為に帯域を予約し、一定の通信速度を確保する技術です。
これらの、帯域確保の機能である「帯域制御」「優先制御」と呼ばれる機能の概要を以下に記します。
1.優先制御(CoS):
F100およびF1000の優先制御は、PRIQ(Priority Queueing)の
アルゴリズムを採用しています。
これは、パケットが送信されるとき、パケットの種類毎に優先順位
の高いものが優先(priority)されます。優先順位の高いパケットが
多くなると、優先順位の低いパケットは「大きな遅延」もしくは
「送信されない」こともあります。
なお、F100およびF1000の優先制御のPRIQは、送信時にのみ適用
されます。
2.帯域制御(QoS):
F100およびF1000の帯域制御 は、CBQ(Class-Based Queueing)の
アルゴリズムを採用しています。これは、パケットが送信されるとき、
パケットの種類に応じて回線の帯域を確保する機能です。
帯域に上限を設け、特定の種類のパケットが流れる量を制限
することも可能です。
なお、F100およびF1000の帯域制御のCBQは、送信時にのみ適用
されます。
F100およびF1000では、各インタフェース毎に、PRIQ あるいは CBQ のいずれかを設定することが可能です。また、PRIQ および CBQ の設定は、VPN との併用も可能です。
*注意
VPN 対象通信に対して PRIQ 、CBQ を適用する場合、TCP パケットが非優先、あるいは帯域が狭いと、Replay Attack が発生することがあります。
図 2.1-1 PRIQの概念図
図 2.1-1のように、パケットに優先順位を付け、その優先順位に基づいてパケットを出力する方法です。
図 2.1-1 の設定を示します。また、表 2-1にqos-class priqコマンドのパラメータを示します。
interface pppoe 1
PRIQを適用したいインターフェースの設定モードへ移行します。
qos bandwidth 10M priq
PRIQの使用を宣言します。
PRIQの場合、帯域制御は行いませんので、帯域幅はredオプションを設定したときしか参照されません。
qos-class priq High-class priority 2
優先キューとして「High-clss」という名称のクラスを設定します。
qos-class priq Middle-class priority 1
通常キューとして「Middle-clss」という名称のクラスを設定します。
qos-class priq Low-class priority 0 default
非優先キューとして「Low-class」という名称のクラスを設定し、それをデフォルトのクラスとします。
qos-filter High-class access-group 100
「High-class」を適用する通信をアクセスリストの番号で指定します。
qos-filter Middle-class access-group 110
「Middle-class」を適用する通信をアクセスリストの番号で指定します。
exit
access-list 100 permit ip host 192.168.1.100 any
「High-class」を適用する通信として、送信元が 192.168.1.100( IP 電話アダプタ)の通信を指定します。
access-list 110 permit ip host 192.168.1.1 any
「Middle-class」を適用する通信として、送信元が 192.168.1.1( PC1 )の通信を指定します。
*注意
F100のV01.10のファームウェアまでと、F1000のV01.03のファームウェアまでは、
アクセスリストの番号の大きい方から順番にマッチングを見ていきます。
F100のV01.11以降のファームウェアと、F1000のV01.04以降のファームウェアでは、
アクセスリストの番号の小さい方から順番にマッチングを見ていきます。
どちらの場合も、順番に見ていって、最初にヒットしたアクセスリストのルールが
適用されます(ロンゲストマッチではありません)。
また、PRIQ/CBQでアクセスリストを使う場合、ポートを範囲指定することはできません。
※F100はV01.19(01)・F1000は(V01.11(01))より、ポートを範囲指定することが出来るようになりました。
表 2-1 qos-class priqコマンドのパラメータ
qos-class priq <クラス名> priority <優先度> [ qlimit <キュー限度値>] [ red ] [ default ]
パラメータ:クラス名
設定内容:任意の名称を設定できます。
設定範囲:-
Default値:省略不可
パラメータ:priority<優先度>
設定内容:3段階まで優先度が設定でき、数字が大きいほど優先度
は高くなります。
‘2’:優先キュー
‘1’:通常キュー
‘0’:非優先キュー
設定範囲:0-2
Default値:省略不可
パラメータ:qlimit<キュー限度値>
設定内容:キューにためることができるパケット数を指定します。
設定範囲:1-200
Default値:50
パラメータ:red
設定内容:キューバッファ管理方式に、RED(Random Early Detection)
を使用する場合に設定します。
・REDを使用しない場合は、キューバッファがいっぱいになって
からパケットを破棄(Tail-Drop)します。
・REDを使用した場合は、キューあふれによる輻輳が発生する
前にランダム破棄を開始するため、TCPのようなトラフィック
を変動できるようなプロトコルでは、より早く破棄を感知で
きるので、通信全体でみると効率が良くなります。
設定範囲:red
Default値:REDを使用しない
パラメータ:default
設定内容:デフォルトクラスの場合に指定します。
qos filterにヒットしなかったデータを、どのような優先度で
処理するか指定する場合に使用します。
設定範囲:default
Default値:defaultとはしない
CBQは、フィルタルールをクラスという単位で設定し、そのクラスを階層化することで帯域制御を行い、設定したパケット専用の帯域として指定する手段です。CBQを使った場合、オプションで優先制御も可能です。
データの処理としては、それぞれのクラスに対応したキューを用意し、送信すべきパケットを設定したアクセスリストに従い、各キューへパケットを振り分けます。各キューに分ける際、キューの容量を超えた場合は、超えた分のパケットはドロップします。
本節では、実際にCBQを設定するケースとして、次の3つの場合について説明します。
1.通信全体をシェーピングするケース
2.データの帯域を個別に確保するケース
3.データの帯域を個別に確保した上で優先度を設定するケース
F100およびF1000から送信されるデータ全体の帯域を制限します。例えば、拠点からの通信量を制限して、センター側の負荷を下げたいような場合に利用できます。
表 3.2-1の設定に従い、CBQを設定する例を示します。
表 3.2-1 クラス設定
クラス名(*1):Root-class
データ:F100およびF1000から送信されるデータ帯域全体
帯域(*2):5Mbps(100%)
クラス名:Default-class
データ:F100及びF1000のLAN側からのデータ
帯域:Root-classの95%
クラス名:Control-class
データ:ICMP、IGMP、RSVP等のデータ
帯域:Root-classの5%
*1:CBQを有効にするためには、ルート、デフォルト、コントロールの3つのクラスを設定することが必要です。
*2:Default-class 、Control-class の各帯域の合計は、100%(Root-classの帯域)を超えてはいけません。
次に、表 3.2-1の設定を階層化したものを図 3.2-1に示します。
図 3.2-1 表 3.2-1の設定の階層図
さらに、図 3.2-1で示した階層図を、図 3.2-2のCBQの概念図に示します。
図 3.2-2 CBQの概念図
図 3.2-2の構成にすることで、F100およびF1000から送信されるデータ全体の帯域を5Mbpsに制限することが可能となります。
図 3.2-2 の設定を示します。また、表 3-1にqos-class cbqコマンドのパラメータを示します
interface pppoe 1
CBQを適用したいインターフェースの設定モードへ移行します。
qos bandwidth 5M cbq
帯域を5Mとして、CBQの使用を宣言します。
qos-class cbq Root-class bandwidth 100 parent NULL
ルートクラスを「Root-class」という名称で設定します。
qos-class cbq Default-class bandwidth 95 parent Root-class default
デフォルトクラスを「Default-class」という名称として、ルートクラスの95%の帯域を割り当てます。
qos-class cbq Control-class bandwidth 5 parent Root-class control
コントロールクラスを「Control-class」という名称として、ルートクラスの5%の帯域を割り当てます。
exit
個別にデータの帯域を確保します。特定の通信のトラフィックを確保したい場合に使います。
表 3.3-1の設定に従いCBQを設定する例を示します。
表 3.3-1 クラス設定
クラス名(*1):Root-class
データ:F100およびF1000から送信されるデータ帯域全体
帯域(*2):40Mbps(100%)
クラス名:VoIP-class
データ:IP電話のデータ
帯域:Root-classの5%
クラス名:Default-class
データ:IP電話以外のデータ
帯域:Root-classの90%
クラス名:Control-class
データ:ICMP、IGMP、RSVP等のデータ
帯域:Root-classの5%
*1:CBQを有効にするためには、ルート、デフォルト、コントロールの3つのクラスを設定することが必要です。
*2:VoIP-class 、Default-class 、Control-class の各帯域の合計は、100%(Root-classの帯域)を超えてはいけません
次に、表 3.3-1の設定を階層化したものを図 3.3-1に示します。
図 3.3-1 表 3.3-1の設定の階層図
さらに、図 3.3-1で示した階層図を図 3.3-2に示します。
図 3.3-2 CBQの概念図(帯域確保のケース)
図 3.3-2の構成にすることで、PC1やPC2から大量にトラフィックが流れたとしても、VoIPの帯域(2Mbps:Root-class 40Mbpsの5%)は確保されます。
interface pppoe 1 CBQを適用したいインターフェースの設定モードへ移行します。
qos bandwidth 40M cbq 帯域を40Mとして、CBQの使用を宣言します。
qos-class cbq Root-class bandwidth 100 parent NULL ルートクラスを「Root-class」という名称で設定します。
qos-class cbq VoIP-class bandwidth 5 parent Root-class VoIPデータ用のクラスを「VoIP-class」という名称として、ルートクラスの5%の帯域を割り当てます。
qos-class cbq Default-class bandwidth 90 parent Root-class default デフォルトクラスを「Default-class」という名称として、ルートクラスの90%の帯域を割り当てます。
qos-class cbq Control-class bandwidth 5 parent Root-class control コントロールクラスを「Control-class」という名称として、ルートクラスの5%の帯域を割り当てます。
qos-filter VoIP-class access-group 100 「VoIP-class」を適用する通信をアクセスリストの番号で指定します。
exit
access-list 100 permit ip host 192.168.1.100 any 「VoIP-class」を適用する通信として、送信元が 192.168.1.100( IP 電話アダプタ)の通信を指定します。 *注意 PRIQ/CBQでアクセスリストを使う場合、ポートを範囲指定することはできません。
データの帯域を個別に確保した上で、優先度を設定します。さらにborrowオプションを使うことにより、設定した帯域以上のデータがある場合でも、空きのある帯域を一時的に借りて、設定帯域以上の送信が可能となります。
表 3.4-1の設定に従いCBQを設定する例を示します。
表 3.4-1 クラス設定
クラス名(*1):Root-class
データ:F100およびF1000から送信されるデータ帯域全体
帯域(*2):40Mbps(100%)
クラス名(*1):Data-class
データ:VoIP-classとTCP_data-classの親クラスとして設定
帯域(*2):Root-classの75%
クラス名(*1):VoIP-class
データ:IP電話のデータ(borrowオプション付き)
帯域(*2):Root-classの5%
クラス名(*1):TCP_data-class
データ:TCPのデータ
帯域(*2):Root-classの70%
クラス名(*1):Default-class
データ:IP電話のデータとTCPのデータ以外
帯域(*2):Root-classの20%
クラス名(*1):Control-class
データ:ICMP、IGMP、RSVP等のデータ
帯域(*2):Root-classの5%
*1:CBQを有効にするためには、ルート、デフォルト、コントロールの3つのクラスを設定することが必要です。
*2:Data-class 、Default-class 、Control-class の各帯域の合計は、100%(Root-classの帯域)を超えてはいけません。また、VoIP-class 、TCP_data-class の帯域は、Root-classに対する割合を指定します。そして、2つの帯域の合計は、親クラスとなるData-classの帯域である75%を超えてはいけません。
次に、表 3.4-1の設定を階層化したものを図 3.4-1に示します。
図 3.4-1 表 3.4-1の設定の階層図
CBQに優先度を加えたイメージ図を図 3.4-2に示します。
イタリック体の「Root-class」「Default-class」「Control-class」は、必ず、設定しなければならないクラスを表しています。
「Data-class」は、さらに、「TCP_data-class」と「VoIP-class」に分割しています。
優先度としては、「VoIP-class」は、優先( priority 2 )、「TCP_data-class」と「Control-class」は、通常( priority 1 )、「Default-class」は、非優先( priority 0 )としています。
図 3.4-2 CBQに優先度を加えたイメージ図
データ処理としては、まず、F100のLAN側から送られてきたデータを、一旦それぞれのClassに対応した‘キュー’に蓄え、優先度の高いデータから処理を行います。
それぞれ設定した帯域の範囲内で、キューに蓄えたデータを送出します。
ここで、優先度の高いClassのキュー内データが無くなった時に、初めて優先度の低いデータの処理に移行します。
キューイング
・ VoIPのパケットは、「VoIP-class」のキューへ振り分けられます。
・ TCPのパケットは、「TCP_data-class」のキューへ振り分けられます。
・ ICMP、IGMP、RSVPのパケットは、「Control-class」のキューへ
振り分けられます。
・ 上記以外のパケットは、「Default-class」のキューへ振り分けられます。
それぞれのキューが満杯の場合、他のキューへの振り分けは行わずドロップします。
次にborrowオプションの動作について、図 3.4-2で、VoIPを例に取り説明します。
VoIPのデータがきた場合、VoIP-classに割り当てられている帯域に余裕があるか確認し、余裕のある場合はデータを送信します。
余裕が無い場合は、上位層であるData-classで管理している帯域に余裕があるか確認します。この例では、TCP_data-classの帯域に余裕がある場合、VoIP-classのパケットをTCP_data-classの帯域を使って送信します。
TCP_data-classの帯域に余裕が無い場合は、Root-classで管理している帯域に余裕があるか確認します。この例では、Default-classあるいは、Control-classがそれに相当します。
Default-classあるいは、Control-classの帯域に余裕があれば、その帯域を使ってVoIPデータを送信し、それでも、余裕が無ければ、送信されずに次の機会まで待つことになります。
図 3.4-2 の設定を示します。また、表 3-1にqos-class cbqコマンドのパラメータを示します
interface pppoe 1
CBQを適用したいインターフェースの設定モードへ移行します。
qos bandwidth 40M cbq
帯域を40Mとして、CBQの使用を宣言します。
qos-class cbq Root-class bandwidth 100 parent NULL
ルートクラスを「Root-class」という名称で設定します。
qos-class cbq Data-class bandwidth 75 parent Root-class
データ用のクラスを「Data-class」という名称として、ルートクラスの75%の帯域を割り当てます。
qos-class cbq VoIP-class bandwidth 5 parent Data-class priority 2 borrow
VoIPデータ用のクラスを「VoIP-class」という名称として、ルートクラスの5%の帯域を割り当てます。
親クラスは「 Data-class 」、また、優先度を「優先」として、borrowオプションを付けます。
qos-class cbq TCP_data-class bandwidth 70 parent Data-class priority 1
TCP通信用のクラスを「TCP_data-class」という名称として、ルートクラスの70%の帯域を割り当てます。
親クラスは「 Data-class 」、また、優先度を「通常」とします。
qos-class cbq Control-class bandwidth 5 parent Root-class priority 1 control
コントロールクラスを「Control-class」という名称として、ルートクラスの5%の帯域を割り当てます。
また、優先度を「通常」とします。
qos-class cbq Default-class bandwidth 20 parent Root-class default
デフォルトクラスを「Default-class」という名称として、ルートクラスの20%の帯域を割り当てます。
qos-filter VoIP-class access-group 100
「VoIP-class」を適用する通信をアクセスリストの番号で指定します。
qos-filter TCP_data-class access-group 110
「TCP_data-class」を適用する通信をアクセスリストの番号で指定します。
exit
access-list 100 permit ip host 192.168.1.100 any
「VoIP-class」を適用する通信として 192.168.1.100( IP 電話アダプタ)からの通信を指定します。
access-list 110 permit tcp 192.168.1.0 0.0.0.255 any
「TCP_data-class」を適用する通信として 192.168.1.0/24 からのTCP通信を指定します。
*注意
F100のV01.10のファームウェアまでと、F1000のV01.03のファームウェアまでは、
アクセスリストの番号の大きい方から順番にマッチングを見ていきます。
F100のV01.11以降のファームウェアと、F1000のV01.04以降のファームウェアでは、
アクセスリストの番号の小さい方から順番にマッチングを見ていきます
(上の設定では、こちらのルールに従って、アクセスリストを書いています)。
どちらの場合も、順番に見ていって、最初にヒットしたアクセスリストのルールが
適用されます(ロンゲストマッチではありません)。
また、PRIQ/CBQでアクセスリストを使う場合、ポートを範囲指定することはできません。
表 3-1 qos-class cbqコマンドのパラメータ
qos-class cbq <クラス名> bandwidth <帯域使用率> parent <親クラス名>|NULL
[ priority <優先度>] [ delay <最大遅延時間>] [ borrow ] [ red ]
[ default ] [ control ]
パラメータ:クラス名*1
設定内容:任意の名称を設定できます。クラスは各インタフェース
ごとに16まで設定できます(かつ装置全体で64まで)。
設定範囲:-
Default値:省略不可
パラメータ:帯域使用率
設定内容:ルートクラスに対する帯域使用率(単位:%)を指定します。
帯域使用率の合計は、100%以下で設定します。
設定範囲:1-100
Default値:省略不可
パラメータ:親クラス名
設定内容:親クラス名を指定します。ルートクラスとする場合には
NULL と記述します。
設定範囲:-
Default値:省略不可
パラメータ:priority <優先度>
設定内容:3段階まで優先度が設定でき、数字が大きいほど優先度
は高くなります。
‘2’:優先キュー
‘1’:通常キュー
‘0’:非優先キュー
設定範囲:0-2
Default値:0
パラメータ:delay <最大遅延時間>
設定内容:このクラスの最大遅延時間(単位:m秒)を設定します。
この時間経過しても送信されない場合は廃棄されます。
設定範囲:1-9999
Default値:0
パラメータ:borrow
設定内容:帯域不足で送信できないときに、親クラスに空きがあれば、
その帯域を利用して送信する場合に指定します。
設定範囲:borrow
Default値:親クラスの帯域を利用しない
パラメータ:red
設定内容:キューバッファ管理方式に、RED(Random Early Detection)
を使用する場合に設定します。
・ REDを使用しない場合は、キューバッファがいっぱいに
なってからパケットを破棄(Tail-Drop)します。
・ REDを使用した場合は、キューあふれによる輻輳が発生
する前にランダム破棄を開始するため、TCPのような
トラフィックを変動できるようなプロトコルでは、
より早く破棄を感知できるので、通信全体でみると効率
が良くなります。
設定範囲:red
Default値:REDを使用しない
パラメータ:default
設定内容:デフォルトクラスとする場合に設定します。
デフォルトクラスは、ルートクラスに属している必要
があります。どのクラスにも該当しないパケットはこの
クラスで処理されます。
設定範囲:default
Default値:defaultとしない
パラメータ:control
設定内容:コントロールクラスとする場合に設定します。
コントロールクラスは、ルートクラスに属している必要が
あります。制御パケット用のクラスで、デフォルトで
ICMP、IGMP、RSVPが割り当て済みです。
設定範囲:control
Default値:controlとしない
*1:CBQを有効にするためには、ルート、デフォルト、コントロールの3つのクラスを設定することが必要です(それぞれ、NULL 、default 、control のオプションをつけることで設定します)。
また、ルートクラスに直接パケットを割り振ることはできません。