STUDY · NETWORK GUIDE

5-2 マーキング体系 — DiffServ が見る「印」の中身

DiffServ がクラスを区別するために見る「印」の中身を整理する。L2 の CoS、L3 の古い印である IP Precedence、現在の標準である DSCP と、その値が指す PHB (BE・CS・AF・EF) の体系を扱う。DSCP は単純な優先度番号ではなく PHB を選ぶコードポイントであること、値の大小がそのまま優先順位ではないことを軸に、印がどこに書かれ・どこまで運ばれるかを解説する概念節。実機 config は次節以降に送る。

1. 前節の振り返りと本節の内容

前節 5-1 QoS の必要性と 3 モデル では、QoS の全体像を 3 つのモデルで整理しました。何もしない Best Effort、経路上の全ルータにフローごとの予約を持たせるがスケールしない IntServ (RSVP)、そしてパケットに をつけてホップごとに扱いを決める DiffServ の 3 つです。このうち実運用 QoS のほぼすべてが DiffServ を土台にしており、DiffServ は各パケットの DSCP という印を見て、ルータ 1 台の中で転送の扱い (PHB) を決めるものでした。

前節が渡したのは「DiffServ は印を見てクラスを区別する」という骨格まででした。本節では、その 印の中身 に踏み込みます。印はパケットのどこに、どのような値で書かれているのか。L2 で使う CoS (Class of Service)、L3 の古い印である IP Precedence、そして現在の標準である DSCP (Differentiated Services Code Point) と、その値が指す PHB (Per-Hop Behavior) の体系 = BE・CS・AF・EF を順に整理します。

本節も前節と同じく概念に徹します。実機の config や show 出力は次節 5-3 以降で扱い、本節ではまず「どの印が・どこに書かれ・どこまで運ばれ・何を意味するのか」を掴むことを目標にします。とりわけ重要なのは、DSCP は単純な優先度の番号ではなく、扱いのカタログである PHB を選ぶコードポイントである という点です。値が大きいほど常に偉い、という直感が通用しないことを、本節を通して確認していきます。

2. マーキングとは — 印はどこに書かれるか

マーキング (marking) とは、パケットやフレームのヘッダに、優先度クラスを表す を書き込む行為です。DiffServ の各ルータは、この印を見てホップごとの扱いを決めるため、印がどこに・どの値で書かれているかが QoS の出発点になります。

印を書く場所は、通信を扱う階層ごとに異なります。L2 (データリンク層) では、イーサネットフレームの 802.1Q タグ の中に印を書きます。これが CoS です。L3 (ネットワーク層) では、IP ヘッダの中の 1 バイトのフィールド に印を書きます。ここに入るのが IP PrecedenceDSCP です。補足として、L2 と L3 の中間に位置づけられる L2.5 の MPLS ラベル にも 3 ビットの印 (MPLS EXP) があり、これは SP (Service Provider) や WAN のコア網で使われます。MPLS EXP の詳細は 第 6 章 WAN 編 で扱い、本節では「そういう印もある」ことに触れるに留めます。印がどの階層のどこに置かれるかは、以下のとおりです。

優先度の印が書かれる場所。L2 ではイーサネットフレームの 802.1Q タグ内の PCP (3 ビット) が CoS、L3 では IP ヘッダの 1 バイトのフィールド (ToS/DS バイト) に IP Precedence や DSCP が入る。L2.5 の MPLS ラベルには EXP (3 ビット) がある。階層ごとに印の置き場所が異なり、CoS は L2 区間だけ、DSCP は IP ヘッダに乗るのでルータを跨いでエンドツーエンドで運べる

マーキングをなぜ入口で行うのかは、DiffServ の狙いから理解できます。上位のノードが、通過するパケットの中身 (送信元・宛先・ポート・アプリケーション) を毎回深く見て「これは音声か、ファイル転送か」と分類するのは、処理コストの高い作業です。そこで、ネットワークの入口で一度だけ深く分類して印をつけておき、以降の各ホップは印だけを見て速く扱いを決める という分担にします。深い分類は入口で一度、その後は浅い印の参照だけ、という役割分担が、DiffServ がスケールする仕組みの土台です。

3. L2 の印: CoS (Class of Service)

CoS (Class of Service) は、L2 のイーサネットフレームに書かれる印です。正確には、VLAN を運ぶための 802.1Q タグ の中に置かれます。802.1Q タグは 4 バイトの領域で、前半 2 バイトの TPID (Tag Protocol Identifier) と後半 2 バイトの TCI (Tag Control Information) から成ります。この TCI の先頭 3 ビット が優先度を表すフィールドで、これを PCP (Priority Code Point) と呼びます。CoS はこの PCP の値を指します。

CoS は 3 ビットなので、表せる値は 0 〜 7 の 8 段階 です。このビットは歴史的に IEEE 802.1p が優先度用に定義したもので、Cisco はこれを CoS と呼んでいます。値が大きいほど高い優先度を意味する使い方が一般的です。

CoS には、置き場所に由来する重要な制約が 2 つあります。1 つ目は、CoS はタグ付きフレームにしか存在しない ことです。CoS は 802.1Q タグの中にあるため、タグを持つフレーム (トランクポートを流れるフレームなど) にしか印を書けません。アクセスポートを流れる untagged フレームや、ネイティブ VLAN の untagged フレームには、そもそも 802.1Q タグがないため CoS を持てません。

2 つ目は、CoS は L2 区間の中でしか運べない ことです。ルータが L3 転送を行うとき、受け取ったフレームの L2 ヘッダ (宛先 MAC・送信元 MAC・802.1Q タグ) をいったん捨て、次のリンク向けに新しい L2 ヘッダを作り直します。このとき 802.1Q タグごと CoS も消えます。したがって CoS は、ルータを越えて別の L2 ドメインへは引き継がれず、スイッチが連なる 1 つの L2 区間の中でしか意味を持ちません。送信元から宛先までルータを跨いで印を運ぶには、L2 の CoS では足りず、L3 の印である DSCP が要る のです。これが、次に扱う L3 の印が必要になる理由です。

4. L3 の古い印: IP Precedence

IP Precedence は、L3 の IP ヘッダに書かれる古い印です。IP ヘッダには、RFC 791 が定義した ToS (Type of Service) という 1 バイトのフィールドがあり、その 上位 3 ビット が IP Precedence として使われてきました。

IP Precedence も 3 ビットなので、値は 0 〜 7 の 8 段階 です。このうち 6 と 7 は、ルーティングプロトコルのパケットなど、ネットワーク自身の制御通信 (ネットワーク制御) 用として予約的に扱われるのが慣例です。CoS と違い IP Precedence は L3 の印なので、ルータがフレームを作り直しても IP ヘッダは維持されるため、ルータを跨いでも印が残る という利点があります。

一方で、IP Precedence には粒度の粗さという弱点があります。3 ビットしかないため 8 クラスしか表せず、通信の種類を細かく分けるには不足でした。たとえば「リアルタイム音声」「対話型ビデオ」「重要なデータ」を区別しつつ、それぞれの中でさらに扱いを分ける、といった細かい制御には 8 クラスでは足りません。この粒度の限界から、IP Precedence は後継の DSCP に置き換えられた旧標準という位置づけになっています。

5. L3 現在の標準: DSCP

DSCP (Differentiated Services Code Point) は、現在の L3 マーキングの標準です。DSCP は、IP Precedence が使っていたのと 同じ 1 バイト を、RFC 2474 が再定義したものです。ビットの割り当ては下図のように変わりました。

IP ヘッダの 1 バイトの世代交代。旧来は上位 3 ビットを IP Precedence (8 段階) として使っていた (RFC 791)。RFC 2474 が同じバイトを再定義し、上位 6 ビットを DSCP (64 値) に割り当てた。下位 2 ビットは後に ECN (RFC 3168) として使われる。この 1 バイト全体が DS フィールド。DSCP は 6 ビットに拡張されたが、単純な優先度番号ではなく PHB を選ぶコードポイントである点が要

RFC 2474 は、この 1 バイトの 上位 6 ビットを DSCP に割り当てました。6 ビットなので、表せる値は 0 〜 63 の 64 値 です。残る 下位 2 ビットは、RFC 2474 では未使用 (CU、Currently Unused) として予約 され、のちに RFC 3168 が ECN (Explicit Congestion Notification、明示的輻輳通知) として定義しました。ECN は、輻輳をパケットの破棄ではなく印で通知する仕組みです。そして、この 1 バイト全体をまとめて DS フィールド (Differentiated Services field) と呼びます。IP Precedence が上位 3 ビットで 8 クラスだったのに対し、DSCP は 6 ビットに拡張されたことで、表現力が 8 から 64 に増えました。

DSCP には、設計上とくに注意すべき性質があります。DSCP は、単純な優先度の番号ではありません。DSCP 値は、後述する PHB (ホップごとの扱い) を選ぶための コードポイント (見出し番号) です。DSCP 値を「値が大きいほど偉い優先順位」と読むのは誤りで、値はあくまで「扱いのカタログ」である PHB のどのページを指すか、という見出しにすぎません。したがって、DSCP の大小がそのまま優先順位の高低を表すわけではないのです。この点は、この後の PHB の体系 (§6、とくに AF と EF) を見ると具体的に理解できます。

6. PHB の体系 — BE・CS・AF・EF

PHB (Per-Hop Behavior、ホップごとの動作) とは、ルータがそのホップで、あるクラスのパケットに施す 扱い のことです。DSCP 値は、この PHB のどれを適用するかを指す見出しです。標準として定義された PHB は、大きく 4 系統に分かれます。BE・CS・AF・EF です。DSCP 値と PHB の対応は下図のとおりです。

DSCP 値と PHB の対応マップ。BE (0) は既定、CS0〜CS7 は下位 3 ビットが 0 の 8 値で IP Precedence と後方互換、AF は 4 クラス × 3 段階のドロップ優先度、EF (46) はリアルタイム最優先。AF は同クラス内で 2 桁目が大きいほど輻輳時に先に捨てられ (AF13 は AF11 より先に落ちる)、EF=46 は最大値 (CS7=56) より小さい。DSCP 値の大小はそのまま優先順位ではないことがわかる

BE (Best Effort、ベストエフォート) は、DSCP 値が 0 の既定の扱いです。印をつけていない通常の通信がこれにあたり、優先も後回しもされない通常転送です。後述の CS0 と同じ値 (0) であり、DiffServ における「印なし = 既定クラス」の位置づけです。

CS (Class Selector、クラスセレクタ) は、下位 3 ビットが 0 の 8 個の値 から成る PHB です。上位 3 ビットだけを使うので、値は CS0 = 0、CS1 = 8、CS2 = 16、CS3 = 24、CS4 = 32、CS5 = 40、CS6 = 48、CS7 = 56 の 8 段階になります。CS が上位 3 ビットだけを使うのには理由があります。IP Precedence との後方互換 を保つためです。旧来の機器が DS フィールドの上位 3 ビットを IP Precedence として読んでも、CS の値なら整合が取れるように設計されています。CS6 と CS7 は、IP Precedence の 6・7 と同じくネットワーク制御用として扱われます。

AF (Assured Forwarding、確保転送) は、RFC 2597 が定義する PHB で、4 つのクラス と、各クラス内の 3 段階のドロップ優先度 (drop precedence) を組み合わせたものです。表記は AFxy で、x がクラス (1 〜 4)、y がドロップ優先度 (1 〜 3) を表します。DSCP 値は、AF11 = 10、AF12 = 12、AF13 = 14、AF21 = 18、AF22 = 20、AF23 = 22、AF31 = 26、AF32 = 28、AF33 = 30、AF41 = 34、AF42 = 36、AF43 = 38 です。

この AF こそが、「値が大きいほど偉いわけではない」ことの核心です。同じクラスの中では、2 桁目の y が大きいほどドロップ優先度が高く、輻輳時に先に捨てられます。たとえば AF13 (DSCP 14) は AF11 (DSCP 10) より DSCP 値は大きいものの、輻輳時には AF11 より先に捨てられます。つまり AF13 は「AF11 より偉い」のではなく、むしろ「AF11 より捨てられやすい」のです。整理すると、1 桁目のクラス番号 x は 4 つの独立したクラスを識別する番号 で、各クラスにはそれぞれ帯域やバッファが個別に割り当てられ、クラスどうしは独立に転送されます。RFC 2597 は AF1 < AF2 < AF3 < AF4 のような標準の優先順位を定めておらず、クラス番号の大小がそのまま優劣を意味するわけではありません (どのクラスにどれだけ資源を割くかは、運用側の設定で決めます)。2 桁目の y は、同じクラスの中での輻輳時の 生き残りやすさ を表し、大きいほど先に捨てられる (不利になる) という向きに注意が必要です。

EF (Expedited Forwarding、緊急転送) は、RFC 3246 が定義する PHB で、DSCP 値は 46 (2 進で 101110) です。EF は、低遅延・低損失を強く要求するリアルタイム通信 (音声通話など) のための 最優先級 の扱いです。ここでも値の直感が裏切られます。DSCP の最大値は 63 (CS7 = 56 が CS の最大) ですが、リアルタイムで最優先に扱われる EF の値は 46 で、最大値より小さい のです。もし DSCP の大小がそのまま優先順位なら、最大値の 63 や 56 が最優先のはずですが、実際にリアルタイム最優先を担うのは 46 の EF です。これが、DSCP 値の大小と優先順位が一致しないことの、代表的な例です。なお、EF が実際にどう優先されるか (厳密優先のキューに入れるかなど) や、ネットワーク制御用の CS6・CS7 との兼ね合いは、各ホップのキューイング設定で決まります。DSCP はあくまで「この扱いを希望する」という印であり、実際の扱いは印を受け取った各ルータの設定しだいである点は、この後の §8 でも改めて触れます。

7. DiffServ はどの印でクラスを区別するか — DSCP と信頼境界

ここまでに 3 種類の印 (CoS・IP Precedence・DSCP) を見てきました。では、DiffServ が実際にクラスを区別するために使う主役の印はどれか。答えは L3 の印である DSCP です。理由は前節までに揃っています。CoS は L2 区間の中でしか運べず (§3)、IP Precedence は 8 クラスしか表せない旧式でした (§4)。ルータを跨いでエンドツーエンドで運べて、かつ 64 値の粒度を持つ DSCP だけが、コア網全体を貫くクラス区別の担い手になれます。

この DSCP による区別には、前提があります。前節 5-1 の §7 で触れた 信頼境界 (trust boundary) です。DiffServ は印を信頼して扱いを決めるため、末端の端末が自分のパケットに勝手に高い DSCP をつければ、その通信を不当に優先させられてしまいます。これを防ぐため、ネットワークの入口 (信頼境界) では、外から入ってきた印をそのまま信用せず、正しい DSCP につけ直します。この印のつけ直しを 再マーキング (re-marking) と呼びます。どの通信を信頼し、どこで印をつけ直すかは、DiffServ が正しく働くための前提になります。DiffServ がクラス区別に使う印と信頼境界の関係は、下図のとおりです。

1 個のパケットが 端末 → エッジ(信頼境界) → コア R1 → コア R2 と進む間に印がどう扱われるかを順に追う。①端末の勝手な印は信用しない、②信頼境界で正しい DSCP (音声なら EF=46) に再マーキング、③ルータへ渡ると CoS は消え DSCP は IP ヘッダに残る、④各ホップが DSCP を見て PHB を適用しエンドツーエンドで運ばれる。CoS は L2 区間限定、クラス区別の主役は L3 の DSCP。割り当ての指針が RFC 4594

印を階層間で引き継ぐ必要がある場面もあります。L2 と L3 の境界では、CoS (3 ビット) と DSCP (6 ビット) を対応づける (マッピングする) ことで、L2 区間でつけた印を L3 の印に引き継ぎます。ただし、この対応は 3 ビット同士の対応を軸にするため粗く、CoS の 8 段階を DSCP の 64 値へそのまま細かく写せるわけではありません。境界でどの CoS をどの DSCP に写すかは、機器の設定で定めます。

どのトラフィックに、どの DSCP (どの PHB) を割り当てるべきかについては、業界標準の指針として RFC 4594 があります。RFC 4594 は、DiffServ のサービスクラスをどう構成するかの推奨を IETF がまとめたもので、一例として音声を EF に、シグナリングを CS5 に、対話型ビデオ (マルチメディア会議) を AF4x に対応させる、といった割り当ての目安を示しています。重要なのは個々の値を丸暗記することではなく、「どの通信にどの印を割り当てるかには標準の対応表がある」 という事実を押さえることです。実際にどのトラフィックを信頼し、境界でどう扱うかの実機判断は、次節 5-3 で扱います。

8. 落とし穴・補足

マーキングは値を覚える作業に見えて、値の意味を取り違えると設計を誤ります。本節の概念に関わる注意点をまとめます。

DSCP 値は優先順位の番号ではない。 DSCP は、扱いのカタログである PHB を選ぶコードポイントであって、値の大小がそのまま優先順位の高低を表すわけではありません。AF では、同じクラス内で 2 桁目が大きいほど輻輳時に先に捨てられます (AF13 は AF11 より先に落ちる)。EF は 46 で、DSCP の最大値 (CS7 = 56 や上限の 63) より小さいにもかかわらずリアルタイム最優先です。「大きい値ほど偉い」という直感で設計すると、狙いと逆の扱いになる箇所があるため注意します。

CoS は L3 境界で消える。 CoS は 802.1Q タグの中にある印なので、ルータがフレームを作り直すと L2 ヘッダごと失われ、次の L2 区間には引き継がれません。しかも 3 ビットしかなく、表せるのは 8 段階だけです。送信元から宛先までルータを跨いでクラスを運びたいなら、CoS ではなく、IP ヘッダに乗ってエンドツーエンドで残る DSCP を使う必要があります。

マーキングは印をつけるだけで、扱いを保証しない。 マーキングが行うのは「この通信はこのクラス」という印をつけることだけです。印に対応するキューイングやポリシングの設定が各ホップに用意されていなければ、印がついていても扱いは何も変わりません。印と、その印を見て動く設定 (どのクラスを先に送るか、どのクラスの帯域を制限するか) が各ホップに揃って、はじめて優先制御になります。印を見て実際に動かす仕組みの設定は、5-3 以降で扱います。

CS は IP Precedence との橋渡し。 CS は上位 3 ビットだけを使うため、旧来の機器が DS フィールドの上位 3 ビットを IP Precedence として読んでも整合が取れます。IP Precedence を使う古い機器と DSCP を使う新しい機器が混在する網でも、CS を介して優先度の上位 3 ビットの互換が保たれます。ただし CS は 8 値しか表せないため、同じクラス内でドロップ優先度を分けるような細かい制御には、CS ではなく AF や EF を使います。

9. 次節

本節では、DiffServ が見る「印」の中身を整理しました。印が階層ごとに別の場所にあること (L2 = 802.1Q タグ内の CoS、L3 = IP ヘッダの DS フィールド、L2.5 = MPLS EXP)、L3 の古い印 IP Precedence が 8 クラスの旧標準であること、現在の標準 DSCP が 6 ビット 64 値で PHB を選ぶコードポイント であること、そして PHB が BE・CS・AF・EF の 4 系統に分かれ、DSCP 値の大小はそのまま優先順位ではない こと (AF は 2 桁目が大きいほど先に捨てられ、EF = 46 は最大値ではない) を扱いました。DiffServ がクラス区別に使う主役は、エンドツーエンドで運べる DSCP であることも確認しました。

次節 5-3 Trust Boundary (信頼境界) では、その印を 誰が・どこで・信用するか、あるいはつけ直すか を扱います。末端の端末がつけた印をどこまで信じ、ネットワークのどの地点で正しい DSCP に再マーキングするのか。本節で概念として触れた信頼境界を、実機 (Cat9000v) の設定と show 出力で具体的に見ていきましょう。