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の動きになりました。
検証構成
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が出ています。
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です。
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: 254DSCP 0はTC 0、DSCP 24はTC 3でした。precedenceがそのまま写っています。IPのDSCPはどの区間でも変わりません。
入口PEでTCを決める(STEP 1・2)
PE1の顧客側インタフェースの入力に、TC 5を書き込むpolicy-mapを当てます。
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のままです。
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: 254STEP 2では、これに加えてコア側の出力にset mpls experimental topmost 6を当てました。PE1 - P1間は外側が6、内側は5です。
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: 254P1が外側を外した後のP1 - PE2間はTC 5です。topmostで書いた6は、外側のラベルと一緒に消えます。
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: 253Pルータで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が効いています。
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出口PEの3モード(STEP 4・5・6)
STEP 4から6は、入口PEのimposition 5をそのままに、出口PE2の設定だけを入れ替えます。
uniform:TCをDSCPに反映する(STEP 4)
PE2のコア側入力でmatch mpls experimental topmost 5をqos-group 5に写し、CE側の出力でqos-group 5にset dscp cs5を当てます。PE2 - CE2間に出たパケットは、元のDSCPが0でも24でも46でも、すべてDSCP 40(CS5)になりました。
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: 100pipe: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のまま届いています。
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 3012本の負荷2000パケットがすべてQG5のクラスに入り、shaperどおり約301 kbpsで出ています。
short-pipe:顧客のDSCPでキューを選ぶ(STEP 6)
コア側入力のpolicyを外し、CE側の出力をmatch dscp efのクラスにpriority level 1とpolice rate 100 kbpsを当てる形に替えました。クラス分けの基準が、事業者のTCから顧客のDSCPに変わります。
同じ負荷をかけると、DSCP 46は667/1000でRTTの平均が9ミリ秒、DSCP 0は1000/1000で37ミリ秒でした。EFは優先キューに入るので遅延が小さく、100 kbpsを超えた分はpolicerが捨てています。
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 0DSCPは書き換えられていません。PE2 - CE2間に出たパケットは46のままです。
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設計上の注意
impositionとtopmostを取り違えると、ラベルの段数によって結果が変わります。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 |
関連記事
- MPLSとは
- MPLSラベルとラベルスタック
- MPLSのラベル操作(push / swap / pop)とPHP
- MPLSのTTL処理とMTU
- LDPとは
- LDPのラベル配布モードとラベルスペース
- LDP-IGPシンクロナイゼーションとLDPセッション保護
- LDPのラベル広告制御(フィルタリング)
- LDPのセッション認証(TCP MD5)
- MPLSのOAM(LSP Ping / LSP Traceroute)
- MPLS TE(RSVP-TE)とは
- MPLS TEのCSPFと経路の制約(帯域 / affinity / TEメトリック)
- MPLS TEトンネルへのトラフィック誘導
- MPLS TEのFRR(リンク保護とノード保護)
- MPLS TEのFRR(auto-tunnel backupとSRLG)
- MPLSのQoS(TCとuniform / pipe / short-pipe)
- MPLSのQoSの帯域制御とキューイング(policer / shaper / priority)