【図解】初心者向けQoSの仕組み〜優先制御/帯域制御やToS/CoSの違い~

QoS とは?

Quality of Service の略で、サービス(本来的には http サービスや SMTP サービス、VoIP サービス等のこと)を予測可能な品質レベルに定めることを言います。

ネットワークの世界では IP ヘッダの ToS や VLAN(IEEE802.1q)ヘッダの CoS というフィールドを使ってネットワーク機器に品質レベルを伝え、ネットワーク機器は設定に従って優先制御、帯域制御などを行うことを指します。

ただし、優先制御や帯域制御はネットワークレイヤーだけの機能ではありません。例えば TCP には『スライディングウィンドウ』という帯域制御(フロー制御)機能がありますし、最近の httpバージョン2 (http/2)、QUIC といったプロトコルでは、TCP と同等の帯域制御も個別に持っており、さらには優先制御機能も実装されています。これらはネットワーク機器には伝わりませんし関知もしません。

この記事では上図の赤枠の範囲の、VLAN や IP による QoS (ネットワークレイヤーの QoS) に的を絞ります

ネットワークレイヤーの QoS の仕組み

ネットワーク機器の QoS は仕組みとしては単純で、IP ヘッダの ToS フィールド 8bit 中の 3 bit (IP Precedence)、もしくは VLAN タグの CoS フィールド の 3 bit (IEEE802.1p) を使って『そのパケットの品質レベル』をネットワーク機器に伝えます。

具体的には、これら 3 bit の情報( 1~7 の値) を使ってそのパケットの優先度を示します。ネットワーク機器は示された優先度に従ってそのパケットの出力に関する方針(順番や破棄の方針)を変えるのです。(実は ToS については IP Precedence を拡張した DSCP というものもあったりしますが、詳細については後述します。)

CoS は IEEE802.1p という規格で定められておりますが、ややこしいことに VLAN の規格である IEEE802.1q 規格のヘッダ内に存在します。

VLAN を使わない Ethernet には CoS がありませんのでもし Layer 2 で QoS を使いたいなら VLAN タグ (IEEE802.1q) タグを付けなければなりません。なので Cisco の音声 VLAN (Voice VLAN) ではわざわざオーバーヘッドとなるタグを付けています。(ただし、NW機器の処理はパケット単位で行われるため、パケット長はあまり大きなオーバーヘッドになりません。詳しくは bps, pps の違い の記事を参考にしてみて下さい。)

これらの QoS 値はクライアントやサーバ等のアプリケーション自体がセットすることもありますし、ネットワーク機器がアクセスリスト等にマッチした通信にセットする(class-map , policy-map, service-policy)こともあります

NW 機器 OS (Cisco IOS等) アーキテクチャとQoS の関連

QoS の挙動を知るためにはネットワーク機器の一般的なアーキテクチャを理解する必要があります。例えば、パケットが NIC から入り、NIC へ出力されるまでの機器内部のフローはどのようになっているでしょうか。

以下にネットワーク機器の一般的なアーキテクチャ概要の一例を示します。

ハードウェアキュー (tx-ring, rx-ring) とは

一般的に NIC にはポート1つずつに独自の小型プロセッサと DMA コントローラを持っています。NIC はこれらを使って CPU とメモリ空間を共有します。このメモリ空間内から切り出された各NIC用のバッファメモリをハードウェアキューと呼びます。

NIC は DMA コントローラを使ってハードウェアキューとパケットを DMA 転送し合います。

ハードウェアキューは別名 tx-ring, rx-ring とも呼ばれます。tx は transmit(送信)を表し、rx は receive(受信)を表します。

ring とは、循環を示す概念的なものです。例えば与えられたバッファメモリを 1 から 4096 のアドレスに分割し、それを 1 から順番に使っていき、4096 まで使い終わったらまた 1 から順番に再利用するのです。

rx-ring 内のパケットは順次、出力インタフェース用の Output Queue に渡されていきますが、もし渡される前に再利用されてしまった場合は上書きされてしまいますので、上書きされて消されたパケットは overrun として破棄されたことになります。

この tx-ring や rx-ring は設定変更可能なケースもありますが、大きくし過ぎると遅延やジッタが大きくなるため、VoIP や TV 会議システムの品質低下を招く可能性がありますのでチューニングには注意が必要です。

ソフトウェアキューとは

一方、ソフトウェアキューは Output Queue から tx-ring に渡される途中に存在します。

QoS の設定が無い場合はソフトウェアキューは単純な FIFO の挙動になります。

QoS の設定が有る場合は各 Output Queue に対して複数のソフトウェアキューが作られ、CoS/ToS やアクセスリスト等で分類され、分類に従ったキューに入ります。そして各々のキューではパケットの並び替え等を行います。つまり、QoS の設定とは、『ソフトウェアキューに対する設定』なのです

並び替えの方法には幾つか方法がありますので次に紹介していきます。

優先制御と帯域制御の違い

QoS の設定で priority 64 と bandwidth 64 の2つは意味が違います。priority は優先制御であり 64 kbps を上限として優先して出力します。一方 bandwidth は帯域制御であり 64 kbps 分の帯域を確保して出力します。

一見して違いが分かりませんが、以下のように考えて下さい。

優先制御が設定されたソフトウェアキューでは、キューに入ったことがリアルタイムで検知され、検知されたらすぐにハードウェアキューに吐く動作をします。つまり msec や usec 等のごく短い時間での制御になります。

一方、帯域制御が設定されたソフトウェアキューではあまり急ぎません。例えば 1 秒の間で 64 kbps の速度が出ていればいいのです。なので遅延やジッターが発生しやすいです。

優先制御は優先権を持つ分、上限を制限しないと他の通信に影響してしまいます。なので、例えば上記の例だと 512 kbps を超える流量であれば超えた分を破棄します。

一方、帯域制御は優先権があるわけではない分、出力先の帯域が空いていれば設定値を超えてパケット出力することができます。

まとめると、優先制御は遅延やジッターで品質低下を招きやすい UDP 上の VoIP や TV会議通信に適しており、帯域制御は数 100 msec 単位での遅延は起きてもよいが大容量のデータ転送などを行う通信 (例えば FTP や http) の帯域を確保したい場合に適しています。

シェーピングとポリシングの違い

シェーピングはソフトウェアキューの速度を制限し、超えた分をメモリ内に溜め、速度を守りながら順番に吐き出してきます。

例えば shape average 3000000 と設定した場合、そのソフトウェアキューの速度を 3 Mbps に制限します。超えた分についてはメインメモリ内に溜めておき、3 Mbps 制限を保ちながら順番に吐き出していきます。メインメモリの空き容量が枯渇した場合はパケット破棄になりますが、非常に発生しにくいです。

一方、ポリシングはソフトウェアキューの速度を制限するのは同じですが、超えた分は破棄します。

例えば police 8000 1000 violate-action drop と設定した場合、そのソフトウェアキューの速度を 8 kbps に制限します。超えた分については単純に破棄します。(1000 の意味については省略します。)

シェーピングの(破棄をしない)場合はパケット破棄が無いことによる通信効率化が見込めますが遅延およびジッターが発生しやすいです。ポリシングの(破棄する)場合は遅延やジッターが小さくなり、また、破棄による TCP のフロー制御を促進することで全体的な効率が良くなる可能性もあります。

一長一短なのでアプリケーション通信の特性に応じてどちらが良いかを判断する必要があります。

なお、police とは本来的には"破棄"ではなく"方針"を意味し、トラフィックの方針として『8 kbps に制限し、違反したものは drop しますよ』ということなのです。drop 以外の action には例えば remark ( ToS 値の変更) などがあります。

DSCP とは

Differentiated Services Code Point の略で、IP Precedence を拡張したものです。IP Precedence が ToS の 3bit を使いますが、DSCP には 6 bit が割当たっています。これは RFC 2474 で定められていますが、その中では『最下位 bit が 0 であるときは標準的な仕様、 1 であるときは実験もしくはローカル利用』となっています。なので 5 bit を使います。

DSCP は『このように使わなければならない』という定義は無く、『ガイドライン』という形で RFC 4594 で紹介されています。その実装では上位 3 bit は IP Precedence と同じ使い方となっており、下位互換性があります。

以下に IP Precedence と DSCP (RFC 4594) の比較図を示します。DSCP の CS ( Class Selector ) というラベルが IP Precedence と互換性のあるものです。他には DF、AF、EF といったラベルが定義されています。

DSCP (RFC 4594) の 4~5 bit 目は『破棄率』を示します。これも今までの説明と同様、輻輳時にはネットワーク機器上でパケット破棄を促すことにより『UDPパケットの遅延やジッターを小さくし』、『TCP によるフロー制御による通信効率化』を期待します。

Cisco 等の多くのベンダでは RFC 4594 のガイドラインに沿った実装をしています。(他の実装をしているところはまだ見たことはありません。)

RFC 4594 ではどのようなパケットをどのような DSCP に分類するか、といったことを定めています。

例えば EF は Telephony に分類が為されています。EF とは Expedited Forwarding の略で、低遅延低ジッターで届けられるべきパケット、という意味です。

他にも AF11~AF13 は High Throughput Data、AF21~AF23 は Low Latency Data というように分類されています。AF は Assured Forwarding の略で、保証のある転送、という意味です。

詳細は RFC 4594 の Section 2 を参照下さい。

フォローする