なぜQoSが必要か
ネットワークの帯域幅には限りがあり、複数の種類のトラフィック(音声通話、ビデオ会議、通常のデータ通信等)が同じリンクを共有していると、混雑時にはすべてを平等に扱うだけでは、遅延・ゆらぎに敏感な音声・映像の品質が損なわれてしまいます。QoS(Quality of Service)は、トラフィックの種類に応じて優先度を付け、限られた帯域幅を適切に配分するための一連の技術です。
PHB(Per-Hop Behavior、転送ホップ単位動作)とは、パケットがネットワーク機器を1台通過する(1ホップ進む)たびに、その機器がQoSのためにどのような処理を行うかを表す考え方です。CCNA 200-301では、次の6つの動作を理解する必要があります。
分類(Classification)とマーキング(Marking)
分類
分類は、通過するトラフィックが、ACL・プロトコル種別・ポート番号・既存のマーキング情報などをもとに、どのような種類(音声、映像、通常データ等)に該当するかを識別する処理です。
マーキング
マーキングは、分類の結果を、パケット・フレームのヘッダー内にある特定のフィールドへ書き込む処理です。マーキングを行っておくことで、以降の機器は、改めて詳細な分類処理を行わなくても、そのマーキング情報だけを見て優先度を判断できるようになります。
- CoS(Class of Service):802.1QのVLANタグ内にある3ビットのPCPフィールドで、0〜7の値を表現します。レイヤ2の情報であり、802.1Qタグ付きフレームで利用されます。ルータを通過する際にはレイヤ2フレームが終端・再カプセル化されるため、CoSがそのまま自動的に維持されるものではありません。
- DSCP(Differentiated Services Code Point):IPヘッダー内の6ビットのフィールドで、0〜63の値を表現します。レイヤ3の情報としてIPヘッダーに含まれるため、ルータを経由するネットワーク全体で利用できるQoSの基本的なマーキング方式です。ただし、QoSポリシーによって各ホップで再マーキングされることがあります。
代表的なDSCP値には、音声トラフィック向けのEF(Expedited Forwarding、値46)、通常のベストエフォート通信を表すDefault Forwarding(DF)/CS0(値0)などがあります。
キューイング(Queuing)
キューイングは、送信待ちのパケットを、優先度に応じて複数の「待ち行列(キュー)」に振り分け、どのキューから優先的にパケットを送出するかを制御する処理です。
- FIFO(First In, First Out):優先度の区別を行わない、最も基本的なキューイングです。
- PQ(Priority Queuing):優先度の高いキューが空になるまで、他のキューを処理しない厳格優先方式です。高優先度トラフィックが継続すると、低優先度キューが送出されない飢餓状態になる可能性があります。
- CBWFQ(Class-Based Weighted Fair Queuing):輻輳時に、トラフィッククラスごとに設定した帯域幅または重みに基づいて帯域を割り当てる方式です。未使用の帯域幅は他クラスが利用できます。
- LLQ(Low Latency Queuing):CBWFQをベースに、音声等の遅延に最も敏感なトラフィック専用の「厳格な優先キュー」を組み合わせた方式で、実運用で広く使われる代表的な構成です。優先キューには通常、設定した帯域を上限とするポリシングが適用され、超過トラフィックは破棄されます。
輻輳(Congestion)への対応
ネットワークの転送能力を超えるトラフィックが発生し、キューの蓄積、遅延、パケット損失などが生じる状態を輻輳と呼びます。輻輳時にどうパケットを扱うかにも、複数の方式があります。
- テールドロップ(tail drop):キューが満杯になった時点で、それ以降に到着した新しいパケットをすべて破棄する、最も単純な方式です。
- WRED(Weighted Random Early Detection):キューが満杯になる前の段階から、IP precedenceやDSCPなどのマーキングに応じたしきい値・確率でパケットを早期に破棄する方式です。一般に低優先度のトラフィックほど早く・高い確率で破棄するよう設定でき、送信元(TCP)の送信速度を緩やかに落とすよう促します。テールドロップに比べて、複数のTCPセッションが同時に速度を落とす「グローバル同期」という非効率な現象を避けやすいという利点があります。
ポリシングとシェーピング
ポリシングとシェーピングは、いずれもトラフィックの送信速度を一定の範囲内に制限する仕組みですが、制限を超えたトラフィックの扱い方が異なります。
- ポリシング(policing):設定した速度を超えたトラフィックを、その場で破棄(またはマーキングし直す)します。バッファリングを行わないため、遅延は追加されませんが、超過分は失われます。インバウンドとアウトバウンドの両方で利用できます。
- シェーピング(shaping):設定した速度を超えたトラフィックを、キューに一時的にため込み、後から平準化して送出します。ただし、キューが満杯になった場合はパケットが破棄されます。パケットが失われにくい一方、キューイングによる遅延が発生します。通常は送信側(アウトバウンド)での速度制限に使われます。
参考:MQC(Modular QoS CLI)による設定の骨格
CCNA 200-301の出題範囲4.7は「PHBの説明」であり、実際の設定コマンドは対象外ですが、ここまで説明した分類・マーキング・キューイング・ポリシング/シェーピングが、実際のCLI上でどのような形で組み立てられるのか、全体の骨格を参考として紹介します。Cisco IOSでは、これらをまとめてMQC(Modular QoS CLI)という共通の枠組みで設定します。
ただし、MQCの対応状況や利用できるコマンド、適用可能なインターフェイス・方向は、Cisco IOS/IOS XEのリリースおよび機種・プラットフォームによって異なります。以下は対応する環境での代表例です。
! (1) 分類:class-mapでトラフィックの種類を定義する
Router(config)# class-map match-all VOICE-TRAFFIC
Router(config-cmap)# match dscp ef
! (2) policy-mapで、class-mapごとに行う処理(マーキング・キューイング・ポリシング等)を定義する
Router(config)# policy-map WAN-QOS-POLICY
Router(config-pmap)# class VOICE-TRAFFIC
Router(config-pmap-c)# priority 128
Router(config-pmap)# class class-default
Router(config-pmap-c)# bandwidth 512
Router(config-pmap-c)# random-detect
! (3) service-policyで、インターフェイスに実際に適用する
Router(config)# interface GigabitEthernet0/1
Router(config-if)# service-policy output WAN-QOS-POLICYclass-mapで「何を対象にするか」(この例ではDSCP値efでマーキングされたトラフィック)を定義し、policy-mapで「対象ごとに何をするか」(この例ではLLQの帯域上限付き厳格優先キューpriority、それ以外のトラフィックにはCBWFQの帯域割当の基準となるbandwidthとWREDrandom-detect)を定義し、最後にservice-policyコマンドでインターフェイスのinput(受信)またはoutput(送信)方向に適用する、という3段階は、MQCにおける代表的な構成です。class-defaultのみを用いて、個別のclass-mapを作成しない構成もあります。ただし、機能ごとに適用可能な方向やインターフェイスは異なり、キューイングとシェーピングは送信方向で用いるのが基本です。また、この例のbandwidth 512は、輻輳時に当該クラスへ最低512 kbpsを保証するものです。親シェーピングポリシーを用いる階層型QoSでは、親側で制限した帯域との整合を確認します。