# トラフィック制御 / Quality of Service

QoS（Quality of Service）機能は、ユーザー定義のルールにしたがってIPv4/IPv6パケットを分類し、出力（送信）時に優先順位や帯域配分をコントロールする機能です。分類したパケットへのマーキングや、出力インターフェースの帯域を制限することも可能です。

## おもな構成要素

QoS機能の基本的な構成要素について説明します。

### インターフェース

QoS機能は、初期設定ではルーティング可能インターフェース（IPv4/IPv6インターフェース）からのパケット出力時に適用されます。
Note

ブリッジングパケットは初期設定では本機能の適用対象外ですが、ソフトウェアブリッジに l3-filtering enableを設定している場合は、該当ソフトウェアブリッジでブリッジされるL3トラフィックに対して本機能が適用されるようになります。

出力インターフェースではパケットの分類に基づくマーキングと帯域制御/優先制御が可能です。
また、出力インターフェースでは、インターフェース全体としての送信帯域を制限することも可能です。

### QoSポリシー

QoSポリシーは、おもにQoS機能で使用する出力キューの構造を定義します。
本製品のQoSはソフトウェアによって実現されるため、キュー制御方式（PQ、WRR、HTB）、キューの数、各キュー間の優先順位や帯域配分、最小・最大帯域、キュー長、DSCPマーキング値などを自由に設定できます。個々のキューは「クラス」という構成要素に対応し、QoSポリシーをルートとするツリー構造を形成します。また、ツリー内では最大3レベルまでクラスを階層化することが可能です。
QoSポリシー内には、下記のクラスが暗黙のうちに存在します。

- システムクラス
  ARP、NDP、PPPoEなどシステムの動作上重要なパケットは自動的にこのクラスに割り当てられ、最優先で処理されます。また、初期設定ではインターフェース帯域の5%がシステムクラス用に予約されます。
- デフォルトクラス
  ユーザー定義のクラスにもシステムクラスにも分類されなかったパケットはこのクラスに割り当てられます。

1つのQoSポリシーが持てるクラスは最大128個ですが、これにはデフォルトクラスが含まれるため、ユーザー定義可能なクラスは127個です。
1つのQoSポリシーは複数のインターフェースに関連付けられますが、1つの出力インターフェースに関連付けられるQoSポリシーは1つだけです。

### QoSルール

QoSルールは、パケットの分類条件と適用するキューを指定するものです。
分類条件の指定には、UTMのファイアウォール機能やNAT機能と同様、送信元と宛先のエンティティー定義、および、アプリケーション定義を用います。
また、条件にマッチしたパケットを格納するキューは、QoSポリシー内の末端クラス名によって指定します。
Note

AMF、BPDU、LACPなどのレイヤー2レベルのパケットを指定することはできません。

### キュー制御方式

QoSポリシーツリー内の同一階層にあるクラスの間では、次の3つのキュー制御方式のいずれかを使用してクラス間の制御が行われます。

- PQ（絶対優先キュー）
  各クラスの優先度設定に基づき、上位キューのパケットを最優先で送信する方式です。上位のキューが空になるまで下位のキューからはパケットを送信しません。クラスごとに最大送信レートを設定することも可能です。
- WRR（重み付きラウンドロビン）
  各クラスのウェイト（重み）設定の比率に基づき、ラウンドロビンでパケットを送信する方式です。
- HTB（階層型トークンバケット）
  各クラスの最小保証帯域、最大帯域設定に基づき、送信レートを制御する方式です。クラスごとに余剰帯域の割り当て優先度を設定することもできます。

## 基本設定

QoS機能の基本的な設定方法を示します。
QoSの具体的な使用例については「設定例集」をご覧ください。
QoS機能の設定を行うには、最初にtraffic-controlコマンドを実行してトラフィックコントロールモードに入り、traffic-control enableコマンドでQoS機能を有効化します。

    awplus(config)# traffic-control
    awplus(config-tc)# traffic-control enable

出力インターフェースの総帯域（最大送信レート）を制限するには、interfaceコマンドで仮想帯域を設定します。
たとえば、eth1インターフェースの最大送信レートを50Mbpsに制限するには次のようにします。

    awplus(config-tc)# interface eth1 virtual-bandwidth 50mbit

トラフィック単位でQoSを適用するには、QoSポリシーとQoSルールの設定が必要です。
QoSポリシーの設定はトラフィックコントロールモードのpolicyコマンドとサブモードの各種コマンドで行います。
QoSルールの設定はトラフィックコントロールモードのruleコマンドで行います。
QoSポリシーとQoSルールは両方そろって初めて意味をなしますので、以下ではいくつか具体的な例を挙げながら、QoSポリシーとQoSルールの設定方法を説明します。
なお、QoSルールの指定に使用する宛先エンティティーでは、出力インターフェースを特定するため、1つ以上のインターフェースと関連付けられている必要があります（ip subnet / ipv6 subnetコマンドで interface パラメーターが指定されていること）。
次に、以下の各例で使用しているゾーン「qos」の設定例を示します。

    zone qos
     network wan
      ip subnet 0.0.0.0/0 interface eth1
     network lan
      ip subnet 192.168.10.0/24 interface eth0

また、以下の各例において、アプリケーション定義は例示用の「AppA」、「AppB」、「AppC」（一部の例では「AppC1」、「AppC2」、「AppC3」）、を使用しています。これらはそれぞれ架空のアプリケーションA、B、C（C1、C2、C3）を表すものとお考えください。
Note

エンティティー定義、アプリケーション定義の詳細については、「UTM」/「エンティティー定義」、「UTM」/「アプリケーション定義」をご覧ください。

- PQ（絶対優先キュー）を使う例
  1. QoSポリシーを作成します。これには、policyコマンドを使います。ここでは第一階層のキュー間でPQを使うため、PQを表す「priority」を指定します。

         awplus(config-tc)# policy MYQOS priority

  2. QoSポリシー内に第一階層のクラス（キュー）を定義します。これには、トラフィックコントロール・ポリシーモードのclass(priority)コマンドを使います。優先度（priority-level）は0～15で15が最優先です。

         awplus(config-tc-policy)# class HIGH priority-level 11
         awplus(config-tc-policy)# class MED priority-level 10
         awplus(config-tc-policy)# class LOW priority-level 9
         awplus(config-tc-policy)# exit

  3. QoSルールを作成します。これには、トラフィックコントロールモードのruleコマンドを使います。アプリケーション定義とエンティティー定義でパケットの分類条件を指定し、QoSポリシー内のクラスでキューを指定します。

         awplus(config-tc)# rule 10 match AppA from qos.lan to qos.lan policy MYQOS.HIGH
         awplus(config-tc)# rule 20 match AppB from qos.lan to qos.lan policy MYQOS.MED
         awplus(config-tc)# rule 30 match AppC from qos.lan to qos.lan policy MYQOS.LOW

- WRR（重み付きラウンドロビン）を使う例
  1. QoSポリシーを作成します。これには、policyコマンドを使います。ここでは第一階層のキュー間でWRRを使うため、WRRを表す「wrr」を指定します。

         awplus(config-tc)# policy MYQOS wrr

  2. QoSポリシー内に第一階層のクラス（キュー）を定義します。これには、トラフィックコントロール・ポリシーモードのclass(wrr)コマンドを使います。ウェイト（weight）は1～100で指定します。

         awplus(config-tc-policy)# class A weight 6
         awplus(config-tc-policy)# class B weight 3
         awplus(config-tc-policy)# class C weight 1
         awplus(config-tc-policy)# exit

  3. QoSルールを作成します。これには、トラフィックコントロールモードのruleコマンドを使います。アプリケーション定義とエンティティー定義でパケットの分類条件を指定し、QoSポリシー内のクラスでキューを指定します。

         awplus(config-tc)# rule 10 match AppA from qos.lan to qos.lan policy MYQOS.A
         awplus(config-tc)# rule 20 match AppB from qos.lan to qos.lan policy MYQOS.B
         awplus(config-tc)# rule 30 match AppC from qos.lan to qos.lan policy MYQOS.C

- HTB（階層型トークンバケット）を使う例
  1. QoSポリシーを作成します。これには、policyコマンドを使います。ここでは第一階層のキュー間でHTBを使うため、HTBを表す「htb」を指定します。

         awplus(config-tc)# policy MYQOS htb

  2. QoSポリシー内に第一階層のクラス（キュー）を定義します。これには、トラフィックコントロール・ポリシーモードのclass(htb)コマンドを使います。最小帯域（cir）、最大帯域（pir）は「kbit」（Kbps）、「mbit」（Mbps）、「gbit」（Gbps）のいずれかの単位付きで指定してください。余剰帯域の割り当て優先度（preference）は0～7で7が最優先です。

         awplus(config-tc-policy)# class A cir 10mbit pir 20mbit preference 7
         awplus(config-tc-policy)# class B cir 1mbit pir 10mbit preference 4
         awplus(config-tc-policy)# class C cir 1kbit pir 1mbit preference 1
         awplus(config-tc-policy)# exit

  3. QoSルールを作成します。これには、トラフィックコントロールモードのruleコマンドを使います。アプリケーション定義とエンティティー定義でパケットの分類条件を指定し、QoSポリシー内のクラスでキューを指定します。

         awplus(config-tc)# rule 10 match AppA from qos.lan to qos.lan policy MYQOS.A
         awplus(config-tc)# rule 20 match AppB from qos.lan to qos.lan policy MYQOS.B
         awplus(config-tc)# rule 30 match AppC from qos.lan to qos.lan policy MYQOS.C

- PQ（絶対優先キュー）とWRR（重み付きラウンドロビン）の併用例
  QoSポリシー内のクラスは最大3レベルまで階層化できます。
  上記階層のキュー制御方式がWRRかHTBの場合は、下位の階層でも同じキュー制御方式を使う必要がありますが、上位階層のキュー制御方式がPQの場合は、下位の階層で任意のキュー制御方式（PQ、WRR、HTB）を使用できます。
  ここではこれを利用し、第一階層ではPQ、第二階層ではWRRを使うよう設定してみます。
  1. QoSポリシーを作成します。これには、policyコマンドを使います。ここでは第一階層のキュー間でPQを使うため、PQを表す「priority」を指定します。

         awplus(config-tc)# policy MYQOS priority

  2. QoSポリシー内に第一階層のクラス（キュー）を定義します。これには、トラフィックコントロール・ポリシーモードのclass(priority)コマンドを使います。優先度（priority-level）は0～15で15が最優先です。
     なお、LOWクラスの作成時には、sub-class-policyパラメーターで下位（第二階層）のクラス間におけるキュー制御方式を指定しています。
     sub-class-policyパラメーターを指定した場合、該当クラスは「中間クラス」となり、一つ下の階層にクラス（サブクラス）を作成するためのトラフィックコントロール・ポリシー・クラスモードに移動します。
     同モードでは、sub-class(wrr)コマンドを使って第二階層のクラス（サブクラス）を定義します。

         awplus(config-tc-policy)# class HIGH priority-level 11
         awplus(config-tc-policy)# class MED priority-level 10
         awplus(config-tc-policy)# class LOW priority-level 9 sub-class-policy wrr
         awplus(config-tc-class)# sub-class A weight 6
         awplus(config-tc-class)# sub-class B weight 3
         awplus(config-tc-class)# sub-class C weight 1
         awplus(config-tc-class)# exit
         awplus(config-tc-policy)# exit

  3. QoSルールを作成します。これには、トラフィックコントロールモードのruleコマンドを使います。アプリケーション定義とエンティティー定義でパケットの分類条件を指定し、QoSポリシー内のクラスでキューを指定します。
     なお、キューとして指定できるのは末端クラスのみです。下位にサブクラスを持つ「中間クラス」を指定することはできません。

         awplus(config-tc)# rule 10 match AppA from qos.lan to qos.lan policy MYQOS.HIGH
         awplus(config-tc)# rule 20 match AppB from qos.lan to qos.lan policy MYQOS.MED
         awplus(config-tc)# rule 30 match AppC1 from qos.lan to qos.lan policy MYQOS.LOW.A
         awplus(config-tc)# rule 31 match AppC2 from qos.lan to qos.lan policy MYQOS.LOW.B
         awplus(config-tc)# rule 32 match AppC3 from qos.lan to qos.lan policy MYQOS.LOW.C

DSCPマーキングの設定は、QoSポリシー内の各クラスで優先度やウェイト、最小・最大帯域の設定と同時に行います。
class(htb)、class(priority)、class(wrr)、sub-class(htb)、sub-class(priority)、sub-class(wrr)、sub-sub-class(htb)、sub-sub-class(priority)、sub-sub-class(wrr)の各コマンドにおいて、set-dscpパラメーターで対象パケットにセットするDSCP値を指定してください。
DSCPマーキングの設定は、PQ、WRR、HTBいずれのキュー管理方式でも行えます。

    awplus(config-tc)# policy MYQOS priority
    awplus(config-tc-policy)# class HIGH priority-level 11 set-dscp 31
    awplus(config-tc-policy)# class MED priority-level 10 set-dscp 30
    awplus(config-tc-policy)# class LOW priority-level 9 set-dscp 29

RED（Random Early Detection/Discard）は、キュー長が上限に達する前にパケットを徐々に破棄していくことで、キューの枯渇を予防したり、トランスポート層の輻輳回避メカニズムを有効に機能させたりするためのアルゴリズムです。REDを使用すれば、より細やかな帯域制御を実現できます。
Note

REDアルゴリズムは流量制御や輻輳回避の機能を持つTCPトラフィックに対してもっとも効果を発揮します。UDPのように輻輳制御機能を持たないプロトコルに対しては効果がありませんのでご注意ください。

REDの設定は、キュー長とパケット破棄率の関係を示す「REDカーブテンプレート」を定義し、QoSポリシー内の各末端クラスに適用することで行います。
REDカーブテンプレートは以下のパラメーターによって定義されます。

- MIN：破棄開始点（パケットを破棄し始めるポイント）
- MAX：完全破棄点（パケットを完全に破棄し始めるポイント）
- LIMIT：キュー長
- probability：キュー長がMAXのときに破棄するパケットの割合

各パラメーターを図示すると次のようになります。キュー長が MIN から MAX の間にある場合、パケットは 0 から probability（%）の間の確率でランダムに破棄されます。パケットの破棄率はキュー長が MAX に近づくにつれ高くなっていき、MAX のとき probability（%）となります。キュー長が MAX を超えると、すべてのパケットが破棄されます。キュー長が MIN 以下のときはパケットは破棄されません。

なお、REDアルゴリズムの動作上、MIN、MAX、LIMIT はバイト数として扱われますが、本製品の設定コマンドではこれらをパケット数 min、max、limit として指定し、それぞれに平均パケットサイズ avpkt（バイト）をかけることで、最終的な MIN、MAX、LIMIT を算出する仕組みになっています。

- REDカーブテンプレートは、red-curveコマンドで作成します。
  初期状態ではデフォルトのREDカーブテンプレート「default」が定義されています。

      awplus(config-tc)# red-curve RED-drop avpkt 256 min 15 max 50 limit 100 probability 20

  この例では、平均パケットサイズ（avpkt）を256バイトと想定しているため、MIN、MAX、LIMITの実際値は次のようになります。
  - MIN = 256（バイト/パケット） × 15（パケット）＝ 3840（バイト）
  - MAX = 256（バイト/パケット） × 50（パケット）＝ 12800（バイト）
  - LIMIT = 256（バイト/パケット） × 100（パケット）＝ 25600（バイト）
  また、REDカーブテンプレートでは、キュー長が破棄開始点を超えた場合にパケットを破棄するのではなく、パケットに明示的輻輳通知（ECN）のマーキングを行って送信する設定も可能です。これには、red-curveコマンドのecnパラメーターを指定します。

      awplus(config-tc)# red-curve RED-ecn ecn

  この例では、avpkt、min、max、limit をいずれも省略しているため、それぞれ省略時値の576（バイト）、10（パケット）、32（パケット）、127（パケット）が使われ、MIN、MAX、LIMITの実際値は次のようになります。
  - MIN = 576（バイト/パケット） × 10（パケット）＝ 5760（バイト）
  - MAX = 576（バイト/パケット） × 32（パケット）＝ 18432（バイト）
  - LIMIT = 576（バイト/パケット） × 127（パケット）＝ 73152（バイト）
  さらに、ecnパラメーターに加えてecn-dropパラメーターを指定した場合は、破棄開始点から完全破棄点まではECNマーキングを行い、完全破棄点から最大キュー長までの間はパケットを破棄するようになります。

      awplus(config-tc)# red-curve RED-ecn-drop ecn ecn-drop

- QoSポリシー内の末端クラスにREDカーブテンプレートを適用するには、class(htb)、class(priority)、class(wrr)、sub-class(htb)、sub-class(priority)、sub-class(wrr)、sub-sub-class(htb)、sub-sub-class(priority)、sub-sub-class(wrr)の各コマンドにおいて、red-curveパラメーターで適用するREDカーブテンプレートを指定してください。
  REDの設定は、PQ、WRR、HTBいずれのキュー管理方式でも行えます。

      awplus(config-tc)# policy MYQOS priority
      awplus(config-tc-policy)# class A priority-level 11 red-curve RED-drop
      awplus(config-tc-policy)# class B priority-level 10 red-curve RED-ecn
      awplus(config-tc-policy)# class C priority-level 9 red-curve RED-ecn-drop
      awplus(config-tc-policy)# class D priority-level 8 red-curve default

  Note

  REDカーブテンプレートは各末端クラス内のフロー単位で適用されます。

- REDカーブの情報は、show traffic-control red-curveコマンドで確認できます。

      awplus# show traffic-control red-curve

QoS機能の有効・無効など全般的な情報はshow traffic-controlコマンドで確認できます。

    awplus# show traffic-control

QoSルールの情報はshow traffic-control ruleコマンドで確認できます。

    awplus# show traffic-control rule

QoSルールが有効かどうかをチェックするには、show traffic-control rule config-checkコマンドを使います。
QoSルールの作成時にはエンティティーとアプリケーションの両定義を使用しますが、これらの定義が不完全な場合（指定したアプリケーションやエンティティーが未定義である、アプリケーション定義でIPプロトコルが未指定、など）、該当ルールは有効にならず無視されてしまいます。
このような事態を避けるには、ルール作成後にshow traffic-control rule config-checkコマンドを実行してルールが有効かどうかをチェックしてください。

    awplus# show traffic-control rule config-check
    Rule 15:
      "To" entity does not exist

同コマンドでは、無効なルールがある場合、それが理由とともに示されます。
この例では、次の理由によりルール「15」が無効であることが示されています。

- ルール内で指定した宛先エンティティーの定義が存在しない。

また、次の例では、すべてのルールが有効であることが示されています。

    awplus# show traffic-control rule config-check
    All rules are valid

QoSルールは次の場合に無効とされます。

- The application does not exist（アプリケーション定義が存在しない）
- The application does not have a protocol configured（アプリケーション定義でIPプロトコルが未指定）
- The from entity does not exist（送信元エンティティー定義が存在しない）
- The from entity does not have a subnet or host address（送信元ネットワーク定義にサブネットアドレスが関連付けられていない、あるいは、送信元ホスト定義にアドレスが関連付けられていない）
- The from entity has a subnet with an interface that does not exist（送信元ネットワーク定義のサブネットアドレスとインターフェース指定に矛盾がある）
- The to entity does not exist（宛先エンティティー定義が存在しない）
- The to entity does not have a subnet or host address（宛先ネットワーク定義にサブネットアドレスが関連付けられていない、あるいは、宛先ホスト定義にアドレスが関連付けられていない）
- The to entity does not have an interface（宛先ネットワーク定義のサブネットアドレスにインターフェースの指定がない）
- The to entity has a subnet with an interface that does not exist（宛先ネットワーク定義のサブネットアドレスとインターフェース指定に矛盾がある）
- The from and to entities do not have any subnet or host addresses in the same address family (IPv4/IPv6)（送信元と宛先のネットワーク、ホスト定義の間で、関連付けられたサブネットアドレス、ホストアドレスのアドレスファミリー（IPv4/IPv6）が異なっている）

QoSの統計情報はshow traffic-control countersコマンドで確認できます。

    awplus# show traffic-control counters

インターフェースに設定した送信レートの上限値（仮想帯域）や、QoSルールによって予約された帯域などの情報は、show traffic-control interfaceコマンドで確認できます。

    awplus# show traffic-control interface