メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. MPLS記事一覧/

MPLSのQoS(TCとuniform / pipe / short-pipe)

目次

MPLSのQoS(TCとuniform / pipe / short-pipe)

MPLSのラベルには3ビットのTC(Traffic Class)フィールドがあり、ラベルを付けたルータが優先度を書き込みます。IPのDSCPとは別の値で、ラベルが付いている区間だけ意味を持ちます。事業者はTCで自網のQoSを決め、顧客のDSCPには触れない、といった使い分けができます。この記事ではTCの位置と既定の動作、入口PEと途中のPルータでの書き換え、そして出口PEの3つの振る舞い(uniform / pipe / short-pipe)を解説し、IOS XR(XRv9000)のラボでキャプチャーを取って確かめます。

ラベルの構造とPHPはMPLSのラベルとラベルスタック、L3VPNのラベル2段構成はMPLSのラベル操作(push / swap / pop)で解説しています。

TC(旧EXP)の3ビット

ラベルは32ビットで、内訳はラベル値20ビット、TC 3ビット、S(Bottom of Stack)1ビット、TTL 8ビットです。TCはRFC 5462で名前が変わったフィールドで、それ以前はEXP(Experimental Use)と呼ばれていました。ビット数も位置も変わっておらず、IOS XRのコマンドは今もmpls experimentalです。

値の意味は規格では決まっていません。0〜7のどれをどのサービスに割り当てるかは事業者が決めます。何も設定しない場合、IPのprecedence(DSCPの上位3ビット)がTCに写ります。DSCP 46(EF)はprecedence 5なのでTC 5、DSCP 24(CS3)はTC 3になります(この記事の検証機であるXRv9000 26.1.1と、CEに使ったXRd 26.1.1で観測した動作です)。

imposition と topmost

IOS XRでTCを書き込むコマンドは2つあり、対象が違います。

コマンド 対象 使う場所
set mpls experimental imposition <0-7> これから付けるラベル全部 入口PEの、顧客側インタフェースの入力
set mpls experimental topmost <0-7> いちばん外側のラベル1枚 ラベルが付いた後。コア側インタフェースの出力や、Pルータの入力

L3VPNではラベルが2段(外側がLDP、内側がVPN)になるため、この違いがそのまま結果に出ます。impositionは2段とも同じ値になり、topmostは外側だけが変わります。PHPで外側が外れると、topmostで書いた値は消え、内側の値が見えます。

出口PEの3つのモード

RFC 3270は、MPLSでDiffServを運ぶときのトンネルの振る舞いを3つに分けています。違いは出口PEが何を見てキューを選ぶかと、顧客のDSCPを書き換えるかの2点です。

モード RFCの節 出口PEが見るもの 顧客のDSCP
uniform 2.6.3節(MAY) ラベルのTC TCに合わせて書き換える
pipe 2.6.2節(MUST) ラベルのTC 変えない
short-pipe 2.6.2.1節(MAY) 顧客のDSCP 変えない

uniformは網の中の扱いを顧客側にも反映させる形、pipeは網の中だけで完結させる形、short-pipeは出口では顧客の値に従う形です。IOS XRはモードを名前で指定するのではなく、policy-mapの書き方でどれになるかが決まります。今回の検証では、TCをqos-groupに写して出力でset dscpすればuniform、qos-groupでキューを選ぶだけならpipe、出力でmatch dscpを使えばshort-pipeの動きになりました。

uniform / pipe / short-pipe の違い

検証構成

CE1 - PE1 - P1 - PE2 - CE2の5台です。コアはOSPF + LDP、PE間はiBGP vpnv4でVRF CUST-Aを通し、CEとPEはeBGPでつなぎます。CE1からCE2へのパケットはPE1でラベルが2段付き、P1がPHPで外側を外すので、P1 - PE2間は1段になります。

検証構成

PE1 / P1 / PE2はXRv9000、CE1 / CE2はXRdです。XRd(Control Plane)ではservice-policyがデータプレーンに入らないため、QoSの検証にはXRv9000を使っています。CE1からはtypeオプションでToSを変えたpingを送り、DSCP 0 / 24 / 46の3種類で結果を比べます。

検証の全体像

STEP 操作 確かめること
0 QoSの設定なし 既定でIP precedenceがTCに写ること
1 PE1でラベルにTC 5を付ける(imposition) DSCPに関係なく2段ともTC 5になること
2 コア側の出力で外側だけTC 6にする(topmost) 外側だけ変わり、PHPの後は内側の値が見えること
3 PルータでTCを付け替える(qos-group経由) P1 - PE2間のTCが2になること
4 出口PEでTCをDSCPに反映する(uniform) PE2 - CE2間のDSCPが書き換わること
5 出口PEでTCを使ってキューを選ぶ(pipe) DSCPが変わらず、TCでキューが決まること
6 出口PEで顧客のDSCPでキューを選ぶ(short-pipe) DSCPが変わらず、顧客の値でキューが決まること

既定の動作(STEP 0)

QoSを何も設定していない状態です。CE1からCE2へのtracerouteに、ラベル2段とExp 0が出ています。

STEP 0 CE1 traceroute 192.168.2.1
RP/0/RP0/CPU0:CE1#traceroute 192.168.2.1 source 192.168.1.1
Wed Sep 16 07:22:52.607 UTC

Type escape sequence to abort.
Tracing the route to 192.168.2.1

 1  10.11.101.11 19 msec  18 msec  53 msec 
 2  10.1.11.1 [MPLS: Labels 24001/24003 Exp 0] 81 msec  44 msec  54 msec 

DSCP 46を付けたpingでは、ラベルのTCが5になります。PE1 - P1間のキャプチャーのNo.445です。

STEP 0 No.445 ICMP Echo request(PE1 → P1、tshark -V 抜粋)
MultiProtocol Label Switching Header, Label: 24001, Exp: 5, S: 0, TTL: 254
    0000 0101 1101 1100 0001 .... .... .... = MPLS Label: 24001 (0x05dc1)
    .... .... .... .... .... 101. .... .... = MPLS Experimental Bits: 5
    .... .... .... .... .... ...0 .... .... = MPLS Bottom Of Label Stack: 0
    .... .... .... .... .... .... 1111 1110 = MPLS TTL: 254
MultiProtocol Label Switching Header, Label: 24003, Exp: 5, S: 1, TTL: 254
    0000 0101 1101 1100 0011 .... .... .... = MPLS Label: 24003 (0x05dc3)
    .... .... .... .... .... 101. .... .... = MPLS Experimental Bits: 5
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 1111 1110 = MPLS TTL: 254
上のtshark出力のパケット(No.445)のpcapをダウンロード

DSCP 0はTC 0、DSCP 24はTC 3でした。precedenceがそのまま写っています。IPのDSCPはどの区間でも変わりません。

入口PEでTCを決める(STEP 1・2)

PE1の顧客側インタフェースの入力に、TC 5を書き込むpolicy-mapを当てます。

STEP 1でPE1にcommitした設定
policy-map PE1-CE-IN
 class class-default
  set mpls experimental imposition 5
 ! 
 end-policy-map
! 
interface GigabitEthernet0/0/0/0
 service-policy input PE1-CE-IN
!

DSCP 0のパケットでも、ラベルは2段ともTC 5になりました。DSCPは0のままです。

STEP 1 No.163 ICMP Echo request(PE1 → P1、tshark -V 抜粋)
MultiProtocol Label Switching Header, Label: 24001, Exp: 5, S: 0, TTL: 254
    0000 0101 1101 1100 0001 .... .... .... = MPLS Label: 24001 (0x05dc1)
    .... .... .... .... .... 101. .... .... = MPLS Experimental Bits: 5
    .... .... .... .... .... ...0 .... .... = MPLS Bottom Of Label Stack: 0
    .... .... .... .... .... .... 1111 1110 = MPLS TTL: 254
MultiProtocol Label Switching Header, Label: 24003, Exp: 5, S: 1, TTL: 254
上のtshark出力のパケット(No.163)のpcapをダウンロード

STEP 2では、これに加えてコア側の出力にset mpls experimental topmost 6を当てました。PE1 - P1間は外側が6、内側は5です。

STEP 2 No.154 ICMP Echo request(PE1 → P1、tshark -V 抜粋)
MultiProtocol Label Switching Header, Label: 24001, Exp: 6, S: 0, TTL: 254
    0000 0101 1101 1100 0001 .... .... .... = MPLS Label: 24001 (0x05dc1)
    .... .... .... .... .... 110. .... .... = MPLS Experimental Bits: 6
    .... .... .... .... .... ...0 .... .... = MPLS Bottom Of Label Stack: 0
    .... .... .... .... .... .... 1111 1110 = MPLS TTL: 254
MultiProtocol Label Switching Header, Label: 24003, Exp: 5, S: 1, TTL: 254
上のtshark出力のパケット(No.154)のpcapをダウンロード

P1が外側を外した後のP1 - PE2間はTC 5です。topmostで書いた6は、外側のラベルと一緒に消えます。

STEP 2 No.152 ICMP Echo request(P1 → PE2、tshark -V 抜粋)
MultiProtocol Label Switching Header, Label: 24003, Exp: 5, S: 1, TTL: 253
    0000 0101 1101 1100 0011 .... .... .... = MPLS Label: 24003 (0x05dc3)
    .... .... .... .... .... 101. .... .... = MPLS Experimental Bits: 5
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 1111 1101 = MPLS TTL: 253
上のtshark出力のパケット(No.152)のpcapをダウンロード

PルータでTCを付け替える(STEP 3)

途中のPルータでも書き換えられます。P1の入力でmatch mpls experimental topmost 5に一致したパケットをqos-group 5にし、出力でqos-group 5のパケットにset mpls experimental topmost 2を当てました。qos-groupはルータの中だけで使う印で、パケットには出ません。

P1 - PE2間のTCは2になりました。PHPで外側を外した後に残ったVPNラベルに対して、出力のpolicyが効いています。

STEP 3 No.170 ICMP Echo request(P1 → PE2、tshark -V 抜粋)
MultiProtocol Label Switching Header, Label: 24003, Exp: 2, S: 1, TTL: 253
    0000 0101 1101 1100 0011 .... .... .... = MPLS Label: 24003 (0x05dc3)
    .... .... .... .... .... 010. .... .... = MPLS Experimental Bits: 2
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 1111 1101 = MPLS TTL: 253
上のtshark出力のパケット(No.170)のpcapをダウンロード

出口PEの3モード(STEP 4・5・6)

STEP 4から6は、入口PEのimposition 5をそのままに、出口PE2の設定だけを入れ替えます。

uniform:TCをDSCPに反映する(STEP 4)

PE2のコア側入力でmatch mpls experimental topmost 5qos-group 5に写し、CE側の出力でqos-group 5set dscp cs5を当てます。PE2 - CE2間に出たパケットは、元のDSCPが0でも24でも46でも、すべてDSCP 40(CS5)になりました。

STEP 4 No.18 ICMP Echo request(PE2 → CE2、tshark -V 抜粋)
    Differentiated Services Field: 0xa0 (DSCP: CS5, ECN: Not-ECT)
        1010 00.. = Differentiated Services Codepoint: Class Selector 5 (40)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 100
上のtshark出力のパケット(No.18)のpcapをダウンロード

pipe:TCでキューを選び、DSCPは変えない(STEP 5)

CE側の出力を、親でshape average 300 kbps、子でqos-group 5のクラスにbandwidth remaining percent 80を割り当てる形に替えました。set dscpは書きません。

CE1からDSCP 46(ToS 184)とDSCP 0を各1000発、4秒ずらして同時に流すと、どちらも1000/1000で、RTTの平均はともに70ミリ秒でした。TCで選ばれるキューが同じなので差が出ません。DSCPは46と0のまま届いています。

STEP 5 PE2 show policy-map interface GigabitEthernet0/0/0/1 output(抜粋)
GigabitEthernet0/0/0/1 output: PE2-CE-PIPE

Class class-default
  Classification statistics          (packets/bytes)     (rate - kbps)
    Matched             :                2000/2836000              301
  Policy PE2-CE-PIPE-CHILD Class QG5
    Classification statistics          (packets/bytes)     (rate - kbps)
      Matched             :                2000/2836000              301

2本の負荷2000パケットがすべてQG5のクラスに入り、shaperどおり約301 kbpsで出ています。

short-pipe:顧客のDSCPでキューを選ぶ(STEP 6)

コア側入力のpolicyを外し、CE側の出力をmatch dscp efのクラスにpriority level 1police rate 100 kbpsを当てる形に替えました。クラス分けの基準が、事業者のTCから顧客のDSCPに変わります。

同じ負荷をかけると、DSCP 46は667/1000でRTTの平均が9ミリ秒、DSCP 0は1000/1000で37ミリ秒でした。EFは優先キューに入るので遅延が小さく、100 kbpsを超えた分はpolicerが捨てています。

STEP 6 PE2 show policy-map interface GigabitEthernet0/0/0/1 output(抜粋)
GigabitEthernet0/0/0/1 output: PE2-CE-SHORTPIPE

Class class-default
  Classification statistics          (packets/bytes)     (rate - kbps)
    Matched             :                2000/2836000              0
    Transmitted         :                1669/2366642              0
  Policy PE2-CE-SHORTPIPE-CHILD Class EF
    Classification statistics          (packets/bytes)     (rate - kbps)
      Matched             :                1000/1418000              0
      Transmitted         :                 669/948642               0
      Policed(exceed)     :                 331/469358               0

DSCPは書き換えられていません。PE2 - CE2間に出たパケットは46のままです。

STEP 6 No.5 ICMP Echo request(PE2 → CE2、tshark -V 抜粋)
    Differentiated Services Field: 0xb8 (DSCP: EF PHB, ECN: Not-ECT)
        1011 10.. = Differentiated Services Codepoint: Expedited Forwarding (46)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 1400
上のtshark出力のパケット(No.5)のpcapをダウンロード

設計上の注意

  • impositiontopmostを取り違えると、ラベルの段数によって結果が変わります。L3VPNのように2段になる構成では、入口で全部に付けたいのか、外側だけを変えたいのかを決めてからコマンドを選びます
  • 出口PEのクラス分けは、コア側と顧客側で使える条件が違います。コア側の入力はまだラベルが付いているのでmatch mpls experimental、顧客側の出力はラベルが外れているのでmatch dscpです。TCを顧客側まで持ち込むには、qos-groupに写して渡します
  • show policy-map interfaceのカウンタは、そのインタフェースのpolicyに一致した分だけです。PE2が外したVPNラベルの転送量はshow mpls forwardingには出ないUnlabelledの行は0のまま)ので、キャプチャーかshow interfaceで確認します

検証Configおよびshow結果

各STEPで5台から、次の種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。

ファイル 内容
..._clear.txt そのSTEPの採取前にクリアしたカウンタ(QoS、インタフェース、MPLS転送)
..._ping.txt クリアの後に流したping / traceroute
..._show.txt show version / show interface / show policy-map interface / show mpls forwarding など
..._log.txt そのSTEPの範囲だけに絞ったshow logging。クリアの記録もSTEP<N>-CLEAR:として残っています
..._run.txt そのSTEP時点のshow running-config
..._commit.cfg そのSTEPで実際にcommitされた設定(変更したルータのみ)

カウンタをクリアしてからpingを流し、その後にshowを取っているので、各STEPの数値はそのSTEPだけの結果です。

STEP 0:QoSの設定なし

ルータ クリア ping show出力 syslog running-config
CE1 clear ping show log run
PE1 clear ping show log run
P1 clear show log run
PE2 clear ping show log run
CE2 clear ping show log run

STEP 1:PE1でラベルにTC 5を付ける(imposition)

ルータ クリア ping show出力 syslog running-config 投入した設定
CE1 clear ping show log run
PE1 clear ping show log run commit
P1 clear show log run
PE2 clear ping show log run
CE2 clear ping show log run

STEP 2:コア側の出力で外側だけTC 6にする(topmost)

ルータ クリア ping show出力 syslog running-config 投入した設定
CE1 clear ping show log run
PE1 clear ping show log run commit
P1 clear show log run
PE2 clear ping show log run
CE2 clear ping show log run

STEP 3:PルータでTCを付け替える(qos-group経由)

ルータ クリア ping show出力 syslog running-config 投入した設定
CE1 clear ping show log run
PE1 clear ping show log run commit
P1 clear show log run commit
PE2 clear ping show log run
CE2 clear ping show log run

STEP 4:出口PEでTCをDSCPに反映する(uniform)

ルータ クリア ping show出力 syslog running-config 投入した設定
CE1 clear ping show log run
PE1 clear ping show log run
P1 clear show log run commit
PE2 clear ping show log run commit
CE2 clear ping show log run

STEP 5:出口PEでTCを使ってキューを選ぶ(pipe)

負荷はstep5_ce1_load_tos184.txt / step5_ce1_load_tos0.txt、負荷後のカウンタはstep5_pe2_pmap-after.txtです。

ルータ クリア ping show出力 syslog running-config 投入した設定
CE1 clear ping show log run
PE1 clear ping show log run
P1 clear show log run
PE2 clear ping show log run commit
CE2 clear ping show log run

STEP 6:出口PEで顧客のDSCPでキューを選ぶ(short-pipe、最終状態)

負荷はstep6_ce1_load_tos184.txt / step6_ce1_load_tos0.txtです。負荷後のカウンタは、採取時にPE2への接続が一時的に切れたため、同じ設定を再現して取り直したstep6r_pe2_pmap-after.txtを使っています(負荷の結果はstep6r_ce1_load_tos*.txt)。

ルータ クリア ping show出力 syslog running-config 投入した設定
CE1 clear ping show log run
PE1 clear ping show log run
P1 clear show log run
PE2 clear ping show log run commit
CE2 clear ping show log run

パケットキャプチャーはSTEPごとに4リンクで取得しています。

STEP CE1-PE1間 PE1-P1間 P1-PE2間 PE2-CE2間
0 pcap pcap pcap pcap
1 pcap pcap pcap pcap
2 pcap pcap pcap pcap
3 pcap pcap pcap pcap
4 pcap pcap pcap pcap
5 pcap pcap pcap pcap
6 pcap pcap pcap pcap

参考

参考 内容
RFC 3270 MPLS Support of Differentiated Services。pipe(2.6.2節)、short-pipe(2.6.2.1節)、uniform(2.6.3節)
RFC 5462 EXPフィールドをTrafficClass(TC)に改名。ビット数と位置は変更なし
検証環境 XRv9000 26.1.1(PE1 / P1 / PE2)、XRd 26.1.1(CE1 / CE2)、Cisco Modeling Labs

関連記事