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

MPLSラベルとラベルスタック

目次

MPLSラベルとラベルスタック

MPLSのラベルは、RFC 3032が定める4バイトのラベルスタックエントリとしてパケットに付きます。本記事では、この4バイトの中身、複数のラベルを積んだときの並び、値が予約されているラベルを解説し、最後にIOS XR(XRd)のラボでラベル付きパケットをキャプチャーして確かめます。ラベルの役割やLSR・LSPといった用語はMPLSとはで解説しています。

ラベルスタックエントリの形式

フィールドビット数内容
Label20ラベル値。0〜1048575のうち、0〜15は特別な用途に予約されている(後述)。
EXP / TC3QoSのクラスを運ぶ。RFC 3032では「実験用(EXP)」とだけ定められ、RFC 5462でTC(Traffic Class)に改名された。ビット数も位置も変わらず、IOS XRやWiresharkの表示は今もEXPなので、このサイトではEXPと呼ぶ。IOS XRのshowや設定コマンドでは今もEXPと表記され、既定ではラベルを付けるときにIPヘッダーのPrecedence(DSCPの上位3ビット)が写る。
S(Bottom of Stack)1スタックの最後(ボトム)のエントリだけ1。受信側はこのビットでラベルスタックの終わりを知る。
TTL(Time to Live)8IPヘッダーのTTLと同じ役割。最初にラベルを付けるときにIPのTTLを写し、LSRを通過するたびにラベル側のTTLだけが1減る。ラベルを外すときにIPのTTLへ書き戻す。0になったパケットは転送されない。

IOS XRが動的に割り当てるラベルは、既定では24000から始まります(show mpls label range)。

ラベルスタック

ラベルスタックエントリは、レイヤー2ヘッダーの直後、レイヤー3ヘッダーの直前に、必要な数だけ並びます。先頭をトップ、末尾をボトムと呼び、転送はトップのラベルだけを見て行います。

イーサネットでは、EtherTypeの0x8847(ユニキャスト)または0x8848(マルチキャスト)で「この後ろにラベルスタックがある」ことを示します(RFC 3032 5節)。ラベルスタック自体には「ペイロードがIPv4かIPv6か」を示すフィールドがありません(同2.2)。最後のラベルを外したLSRは、ボトムのラベル値から、あるいはIPヘッダーの先頭(バージョン)からペイロードの種類を判断します。

スタックの深さは用途で決まります。IGPの経路をLDPで運ぶだけなら1段、MPLS VPNでは「出口PEまで届けるラベル」と「VPNを識別するラベル」の2段、トラフィックエンジニアリングの迂回路ではさらに1段積まれます。本記事のラボでは、グローバルの経路(1段)とMPLS VPNの経路(2段)の両方を観測します。

予約ラベル(0〜15)

ラベル値0〜15は特別な用途に予約されています。RFC 3032が0〜3を定め、4〜15はIANAが管理しています(Special-Purpose MPLS Label Values)。

値名前意味
0IPv4 Explicit NULL受け取ったLSRはこのエントリを外し、下にラベルがあればそのラベルで、無ければIPv4ヘッダーで転送する。RFC 3032ではボトムにしか置けなかったが、RFC 4182で制限が外れた。
1Router Alertボトム以外に置ける。トップにあるとソフトウェア処理に回され、転送後に再び積み直される。
2IPv6 Explicit NULL0のIPv6版。
3Implicit NULLパケットには付かない。出口LSRがこの値を配ることで、1つ手前のLSRに「ラベルを外して送れ」と伝える(PHP)。
4MPLS Network ActionsRFC 9994。
7Entropy Label Indicator(ELI)RFC 6790。直後にロードバランス用のエントロピーラベルが続くことを示す。
13Generic Associated Channel Label(GAL)RFC 5586。OAMなどの制御チャネル。
14OAM AlertRFC 3429。
15Extension Label(XL)RFC 7274、RFC 9017。拡張された特別用途ラベルが続くことを示す。

表に無い5・6と8〜12は未割り当てです(2026年9月時点)。

このうち日常的に目にするのは0と3です。既定はimplicit-null(3) で、出口LSRは自分に直結する経路(ループバックなど)に対して3を配り、1つ手前のLSRがラベルを外します。そのため出口LSRの手前のリンクではラベル無しのIPパケットが流れます。EXPの値を出口LSRまで届けたいときは、出口LSRにexplicit-null(0) を配らせます。すると1つ手前のLSRはラベルを0に付け替えて送り、出口LSRはラベル0のEXPを読んでから外します。IOS XRではmpls ldp配下のlabel local advertise explicit-nullで切り替えます。

出口LSRが配る値1つ手前のLSRの動作出口LSRの手前のリンク
3(implicit-null、既定)ラベルを外す(Pop)ラベル無し
0(explicit-null)ラベルを0に付け替えるラベル0付き

ラベル操作そのものは、MPLSのラベル操作(push / swap / pop)とPHPで解説しています。

実機での検証

検証環境

CE1 — PE1 — P1 — P2 — P3 — PE2 — CE2 を直列につないでいます。AS 65001のPE1 / P1 / P2 / P3 / PE2がMPLSネットワークで、OSPF(area 0、全リンクnetwork point-to-point)で経路を、LDPでラベルを配っています。CE1とCE2はMPLSを動かさない顧客側のルータで、PEとeBGPで経路を交換します。PE1とPE2はLoopback0間のiBGPで、next-hop-selfにより外部経路のネクストホップを自分のLoopback0にします。P1・P2・P3はBGPを持ちません。

これに加えて、PE1にCE3、PE2にCE4をVRF CUST-A(RD / RT 65001:1)で接続し、PE1 - PE2間のiBGPにVPNv4を足しています。CE3とCE4の間の通信はMPLS VPNの経路で運ばれ、ラベルが2段になります。VRFやVPNv4の仕組みはMPLS L3VPNのシリーズで解説し、本記事ではラベルスタックだけを見ます。

中継のPを3台にしているのは、コアの4リンクすべてをキャプチャーするためです。 ラベルがホップごとに付け替わり、TTLが1ずつ減り、最後の1ホップでPHPによって外れるまでを、途切れずに追えます。

ルータ役割Lo0リンク
CE1顧客側(AS 65101)、192.168.1.0/24を広告1.1.1.1/32Gi0/0/0/0 10.1.2.1
PE1入口 / 出口LSR(AS 65001)2.2.2.2/32Gi0/0/0/0 10.1.2.2 / Gi0/0/0/1 10.2.3.2
P1中継LSR3.3.3.3/32Gi0/0/0/0 10.2.3.3 / Gi0/0/0/1 10.3.4.3
P2中継LSR4.4.4.4/32Gi0/0/0/0 10.3.4.4 / Gi0/0/0/1 10.4.5.4
P3中継LSR(PHPを行う)5.5.5.5/32Gi0/0/0/0 10.4.5.5 / Gi0/0/0/1 10.5.6.5
PE2入口 / 出口LSR(AS 65001)6.6.6.6/32Gi0/0/0/0 10.5.6.6 / Gi0/0/0/1 10.6.7.6
CE2顧客側(AS 65102)、192.168.2.0/24を広告7.7.7.7/32Gi0/0/0/0 10.6.7.7
CE3VRF CUST-Aの顧客側(AS 65103)、192.168.3.0/24を広告8.8.8.8/32Gi0/0/0/0 10.2.8.8(PE1 Gi0/0/0/2)
CE4VRF CUST-Aの顧客側(AS 65104)、192.168.4.0/24を広告9.9.9.9/32Gi0/0/0/0 10.6.9.9(PE2 Gi0/0/0/2)

CE1から192.168.2.1(グローバル)、CE3から192.168.4.1(VPN)へpingを打ち、コアの4リンク(PE1 - P1、P1 - P2、P2 - P3、P3 - PE2)でキャプチャーします。どちらもBGPネクストホップはPE2のLoopback0(6.6.6.6)なので、PE1が付けるトップのラベルは、6.6.6.6/32に対してP1が配ったラベルです。

検証のSTEP

STEP操作狙い
0初期状態(既定 = implicit-null)PE1 - P1間にラベル付きパケット(EtherType 0x8847)が流れ、グローバルは1段、VPNは2段になること。ホップごとにラベルが付け替わり、TTLが1ずつ減ること。P3 - PE2間ではラベルが外れていること
1ToSを付けたpingを流す(設定変更なし)IPヘッダーのprecedenceがラベルのEXPに写ること。IP側のDSCPは変わらないこと
2PE2にlabel local advertise explicit-nullP3 - PE2間にラベル0が現れること。VPNではラベル0がトップに積まれること
3STEP 2を削除(最終状態)STEP 0と同じに戻ること

ラベル付きパケットの中身

PE1は192.168.2.0/24のBGPネクストホップ6.6.6.6に対して、P1から受け取ったラベル24005を付けます。show mpls forwardingのローカルラベル24006(PE1自身が6.6.6.6/32に割り当てた値)の行に、出方向ラベル24005が載っています。最終行の24007は、VRF CUST-Aの192.168.3.0/24にPE1が割り当てたVPNラベルです([V])。

PE1 show mpls forwarding(STEP 0)
RP/0/RP0/CPU0:PE1#show mpls forwarding
Sun Sep 20 12:31:04.869 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24000  Pop         3.3.3.3/32         Gi0/0/0/1    10.2.3.3        150
24001  Pop         10.3.4.0/24        Gi0/0/0/1    10.2.3.3        0
24002  24001       4.4.4.4/32         Gi0/0/0/1    10.2.3.3        0
24003  24002       10.4.5.0/24        Gi0/0/0/1    10.2.3.3        0
24004  24003       5.5.5.5/32         Gi0/0/0/1    10.2.3.3        0
24005  24004       10.5.6.0/24        Gi0/0/0/1    10.2.3.3        0
24006  24005       6.6.6.6/32         Gi0/0/0/1    10.2.3.3        36750
24007  Unlabelled  192.168.3.0/24[V]  Gi0/0/0/2    10.2.8.8        13088

動的ラベルが24000から始まっているのは、show mpls label rangeのとおりです。

P1 show mpls label range(STEP 0)
RP/0/RP0/CPU0:P1#show mpls label range
Sun Sep 20 12:32:03.861 UTC
Range for dynamic labels: Min/Max: 24000/1048575

CE1から192.168.2.1へpingを打ったときの、PE1 - P1間のキャプチャーのNo.37がラベル付きのecho requestです。EtherTypeが0x8847、ラベル24005、TC(tsharkの表示はExperimental Bits)0、S = 1、TTL 254で、4バイトのラベルスタックエントリの直後にIPv4ヘッダーが続いています。ラベルのTTL 254は、CE1が送ったTTL 255をPE1が1減らして写した値です。

No.37 Echo request(PE1 → P1)tshark -V
    Type: MPLS label switched packet (0x8847)
    [Stream index: 4]
MultiProtocol Label Switching Header, Label: 24005, Exp: 0, S: 1, TTL: 254
    0000 0101 1101 1100 0101 .... .... .... = MPLS Label: 24005 (0x05dc5)
    .... .... .... .... .... 000. .... .... = MPLS Experimental Bits: 0
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 1111 1110 = MPLS TTL: 254
Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.2.1
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 100
    Identification: 0x0000 (0)
    000. .... = Flags: 0x0
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 254
上のtshark出力のパケット(No.37 Echo request)のpcapをダウンロード

ホップごとに変わるTTLと、変わらないIPヘッダー

ラベルのTTLはLSRを通るたびに1減ります。コアの4リンクすべてで同じecho requestを見ると、254 → 253 → 252と減り、最後のリンクではラベルそのものが無くなっています。

コアの4リンクで同じecho requestを見る(STEP 0)
$ tshark -r - -Y 'icmp.type==8 && ip.src==192.168.1.1' -T fields -e frame.number -e mpls.label -e mpls.ttl -e ip.ttl \
    < mpls-label-step0-pe1p1.pcap
37	24005	254	254
$ tshark -r - -Y 'icmp.type==8 && ip.src==192.168.1.1' -T fields -e frame.number -e mpls.label -e mpls.ttl -e ip.ttl \
    < mpls-label-step0-p1p2.pcap
33	24005	253	254
$ tshark -r - -Y 'icmp.type==8 && ip.src==192.168.1.1' -T fields -e frame.number -e mpls.label -e mpls.ttl -e ip.ttl \
    < mpls-label-step0-p2p3.pcap
34	24005	252	254
$ tshark -r - -Y 'icmp.type==8 && ip.src==192.168.1.1' -T fields -e frame.number -e mpls.label -e mpls.ttl -e ip.ttl \
    < mpls-label-step0-p3pe2.pcap
35			251

最後の1行はラベルの値もTTLも空欄です。P3がラベルを外して(PHP)送ったため、EtherTypeが0x0800のIPパケットになっているからです。このときIPヘッダーのTTLが254から251へ変わります。ラベルが付いている間はIPヘッダーのTTLが変わらず、外れるときにラベル側で減った分がまとめて書き戻される(RFC 3032 2.4.2、2.4.3)ためです。

No.35 Echo request(P3 → PE2、ラベルが外れた後)tshark -V
    Type: IPv4 (0x0800)
    [Stream index: 2]
Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.2.1
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 100
    Identification: 0x0000 (0)
    000. .... = Flags: 0x0
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 251
上のtshark出力のパケット(No.35 Echo request)のpcapをダウンロード

CE1からのtracerouteにも同じことが出ます。ホップ2〜4はラベル付きで、PE2(10.5.6.6)はラベル無しです。

CE1 traceroute(STEP 0)
RP/0/RP0/CPU0:CE1#traceroute 192.168.2.1 source 192.168.1.1 timeout 1 probe 2 maxttl 7
Sun Sep 20 12:30:19.585 UTC

Type escape sequence to abort.
Tracing the route to 192.168.2.1

 1  10.1.2.2 5 msec  5 msec
 2  10.2.3.3 [MPLS: Label 24005 Exp 0] 18 msec  16 msec
 3  10.3.4.4 [MPLS: Label 24005 Exp 0] 17 msec  46 msec
 4  10.4.5.5 [MPLS: Label 24005 Exp 0] 20 msec  18 msec
 5  10.5.6.6 17 msec  37 msec
 6  10.6.7.7 21 msec  *

ラベルの値は隣り合う2台の間でだけ意味を持つ

ラベルは各LSRが独立に割り当てます。このラボではP1・P2・P3が偶然そろって6.6.6.6/32に24005を割り当てたため、上のキャプチャーでは値が変わらないように見えます。しかし各ルータのshow mpls forwardingを見ると、それぞれが自分のローカルラベルを外して次のルータのラベルを付けていることが分かります。

P1 show mpls forwarding(STEP 0)
RP/0/RP0/CPU0:P1#show mpls forwarding
Sun Sep 20 12:32:03.269 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24000  Pop         2.2.2.2/32         Gi0/0/0/0    10.2.3.2        38119
24001  Pop         4.4.4.4/32         Gi0/0/0/1    10.3.4.4        274
24002  Pop         10.4.5.0/24        Gi0/0/0/1    10.3.4.4        0
24003  24003       5.5.5.5/32         Gi0/0/0/1    10.3.4.4        0
24004  24004       10.5.6.0/24        Gi0/0/0/1    10.3.4.4        0
24005  24005       6.6.6.6/32         Gi0/0/0/1    10.3.4.4        37705
P2 show mpls forwarding(STEP 0)
RP/0/RP0/CPU0:P2#show mpls forwarding
Sun Sep 20 12:32:27.311 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24000  24000       2.2.2.2/32         Gi0/0/0/0    10.3.4.3        38421
24001  Pop         3.3.3.3/32         Gi0/0/0/0    10.3.4.3        318
24002  Pop         10.2.3.0/24        Gi0/0/0/0    10.3.4.3        0
24003  Pop         5.5.5.5/32         Gi0/0/0/1    10.4.5.5        318
24004  Pop         10.5.6.0/24        Gi0/0/0/1    10.4.5.5        0
24005  24005       6.6.6.6/32         Gi0/0/0/1    10.4.5.5        38553
P3 show mpls forwarding(STEP 0)
RP/0/RP0/CPU0:P3#show mpls forwarding
Sun Sep 20 12:32:52.214 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24000  24000       2.2.2.2/32         Gi0/0/0/0    10.4.5.4        37510
24001  24001       3.3.3.3/32         Gi0/0/0/0    10.4.5.4        0
24002  Pop         4.4.4.4/32         Gi0/0/0/0    10.4.5.4        380
24003  24002       10.2.3.0/24        Gi0/0/0/0    10.4.5.4        0
24004  Pop         10.3.4.0/24        Gi0/0/0/0    10.4.5.4        0
24005  Pop         6.6.6.6/32         Gi0/0/0/1    10.5.6.6        38246

2段のラベルスタック

CE3から192.168.4.1(CE4)へのpingは、VRF CUST-Aの経路で運ばれます。PE1はこの宛先に、PE2がVPNv4で配ったVPNラベル24007と、その上に出口PE2へ届けるための24005を積みます。show cef vrf CUST-Aのlabels imposed {24005 24007}がその2段です。

PE1 show cef vrf CUST-A 192.168.4.0/24 detail(STEP 0)
RP/0/RP0/CPU0:PE1#show cef vrf CUST-A 192.168.4.0/24 detail
Sun Sep 20 12:31:10.752 UTC
192.168.4.0/24, version 7, internal 0x5000001 0x30 (ptr 0x885196d0) [1], 0x0 (0x0), 0x208 (0x89a22518)
 Updated Sep 20 12:05:56.194
 Prefix Len 24, traffic index 0, precedence n/a, priority 3
  gateway array (0x8972ea58) reference count 1, flags 0x2038, source rib (7), 0 backups
                [1 type 1 flags 0x48441 (0x89a5b4b8) ext 0x0 (0x0)]
  LW-LDI[type=0, refc=0, ptr=0x0, sh-ldi=0x0]
  gateway array update type-time 1 Sep 20 12:05:56.194
 LDI Update time Sep 20 12:05:56.194
   via 6.6.6.6/32, 3 dependencies, recursive [flags 0x6000]
    path-idx 0 NHID 0x0 [0x8856ecc8 0x0]
    recursion-via-/32
    next hop VRF - 'default', table - 0xe0000000
    next hop 6.6.6.6/32 via 24006/0/21
     next hop 10.2.3.3/32 GigabitEthernet0/0/0/1 labels imposed {24005 24007}

    Load distribution: 0 (refcount 1)

PE1 - P1間のキャプチャーのNo.524が、その2段のラベルが付いたecho requestです。トップの24005はS = 0、ボトムの24007はS = 1で、S = 1のエントリの直後にIPv4ヘッダーが続きます。2つのラベルのTTLはどちらも254です。

No.524 Echo request(PE1 → P1、2段)tshark -V
    Type: MPLS label switched packet (0x8847)
    [Stream index: 4]
MultiProtocol Label Switching Header, Label: 24005, Exp: 0, S: 0, TTL: 254
    0000 0101 1101 1100 0101 .... .... .... = MPLS Label: 24005 (0x05dc5)
    .... .... .... .... .... 000. .... .... = MPLS Experimental Bits: 0
    .... .... .... .... .... ...0 .... .... = MPLS Bottom Of Label Stack: 0
    .... .... .... .... .... .... 1111 1110 = MPLS TTL: 254
MultiProtocol Label Switching Header, Label: 24007, Exp: 0, S: 1, TTL: 254
    0000 0101 1101 1100 0111 .... .... .... = MPLS Label: 24007 (0x05dc7)
    .... .... .... .... .... 000. .... .... = MPLS Experimental Bits: 0
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 1111 1110 = MPLS TTL: 254
Internet Protocol Version 4, Src: 192.168.3.1, Dst: 192.168.4.1
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 100
    Identification: 0x0000 (0)
    000. .... = Flags: 0x0
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 254
上のtshark出力のパケット(No.524 Echo request、2段)のpcapをダウンロード

P3 - PE2間のキャプチャーのNo.523は、同じパケットがP3でトップのラベルを外された後の姿です。VPNラベル24007だけが残り、TTLは251になっています。P3はトップのラベルを外すとき、その時点のTTL(251)を新しくトップになったラベルに書き移しています(RFC 3032 2.4.2)。

No.523 Echo request(P3 → PE2、VPNラベルのみ)tshark -V
    Type: MPLS label switched packet (0x8847)
    [Stream index: 2]
MultiProtocol Label Switching Header, Label: 24007, Exp: 0, S: 1, TTL: 251
    0000 0101 1101 1100 0111 .... .... .... = MPLS Label: 24007 (0x05dc7)
    .... .... .... .... .... 000. .... .... = MPLS Experimental Bits: 0
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 1111 1011 = MPLS TTL: 251
Internet Protocol Version 4, Src: 192.168.3.1, Dst: 192.168.4.1
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 100
    Identification: 0x0000 (0)
    000. .... = Flags: 0x0
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 254
上のtshark出力のパケット(No.523 Echo request)のpcapをダウンロード

PE2側では、ローカルラベル24007がVRF CUST-Aの192.168.4.0/24([V])に対応しており、このラベルでCE4向けのインタフェースに送り出されます。VPNラベルの配布や意味はMPLS L3VPNのシリーズで解説します。

PE2 show mpls forwarding(STEP 0)
RP/0/RP0/CPU0:PE2#show mpls forwarding
Sun Sep 20 12:31:34.064 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24000  24000       2.2.2.2/32         Gi0/0/0/0    10.5.6.5        36599
24001  24001       3.3.3.3/32         Gi0/0/0/0    10.5.6.5        0
24002  24002       4.4.4.4/32         Gi0/0/0/0    10.5.6.5        0
24003  Pop         5.5.5.5/32         Gi0/0/0/0    10.5.6.5        212
24004  24003       10.2.3.0/24        Gi0/0/0/0    10.5.6.5        0
24005  24004       10.3.4.0/24        Gi0/0/0/0    10.5.6.5        0
24006  Pop         10.4.5.0/24        Gi0/0/0/0    10.5.6.5        0
24007  Unlabelled  192.168.4.0/24[V]  Gi0/0/0/2    10.6.9.9        13088

TCにはIPのprecedenceが写る

ラベルを付けるとき、IOS XRは既定でIPヘッダーのprecedence(DSCPの上位3ビット)をTCに写します。CE1からtypeでToSを指定したpingを打つと、DSCP 46(EF)のパケットはTCが5になります。IPヘッダーのDSCPは書き換わりません。

CE1が送ったToSIPのDSCPラベルのTC
00(CS0)0
9624(CS3)3
18446(EF)5
No.219 Echo request(PE1 → P1、DSCP 46)tshark -V
    Type: MPLS label switched packet (0x8847)
    [Stream index: 4]
MultiProtocol Label Switching Header, Label: 24005, Exp: 5, S: 1, TTL: 254
    0000 0101 1101 1100 0101 .... .... .... = MPLS Label: 24005 (0x05dc5)
    .... .... .... .... .... 101. .... .... = MPLS Experimental Bits: 5
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 1111 1110 = MPLS TTL: 254
Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.2.1
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0xb8 (DSCP: EF, ECN: Not-ECT)
        1011 10.. = Differentiated Services Codepoint: Expedited Forwarding (46)
上のtshark出力のパケット(No.219 Echo request、DSCP 46)のpcapをダウンロード

TCの使い方はMPLSのQoSで解説しています。

implicit-nullはパケットには付かない

出口LSRのPE2は、自分のLoopback0(6.6.6.6/32)に対してimplicit-null(3)を配っています。P3のshow mpls ldp bindingsではPE2からの値がImpNull、show mpls forwardingでは出方向がPopです。

P3 show mpls ldp bindings 6.6.6.6/32(STEP 0)
RP/0/RP0/CPU0:P3#show mpls ldp bindings 6.6.6.6/32
Sun Sep 20 12:32:51.320 UTC
6.6.6.6/32, rev 18
	Local binding: label: 24005
	Remote bindings: (2 peers)
	    Peer                Label
	    -----------------   ---------
	    4.4.4.4:0           24005
	    6.6.6.6:0           ImpNull
P3 show mpls forwarding(STEP 0)
RP/0/RP0/CPU0:P3#show mpls forwarding
Sun Sep 20 12:32:52.214 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24000  24000       2.2.2.2/32         Gi0/0/0/0    10.4.5.4        37510
24001  24001       3.3.3.3/32         Gi0/0/0/0    10.4.5.4        0
24002  Pop         4.4.4.4/32         Gi0/0/0/0    10.4.5.4        380
24003  24002       10.2.3.0/24        Gi0/0/0/0    10.4.5.4        0
24004  Pop         10.3.4.0/24        Gi0/0/0/0    10.4.5.4        0
24005  Pop         6.6.6.6/32         Gi0/0/0/1    10.5.6.6        38246

予約ラベルのうちルータが実際に確保しているものは、show mpls label table detailで見えます。LSD(Label Switching Database)が0(IPv4 Explicit NULL)、1(Router Alert)、2(IPv6 Explicit NULL)、13(GAL)を持ち、3はありません。implicit-nullはLDPで伝えるための値であって、ラベルテーブルにも、実際のパケットにも現れません。

P3 show mpls label table detail(STEP 0)
RP/0/RP0/CPU0:P3#show mpls label table detail
Sun Sep 20 12:32:52.919 UTC
Table Label   Owner                           State  Rewrite
----- ------- ------------------------------- ------ -------
0     0       LSD(A)                          InUse  Yes
0     1       LSD(A)                          InUse  Yes
0     2       LSD(A)                          InUse  Yes
0     13      LSD(A)                          InUse  Yes
0     24000   LDP(A)                          InUse  Yes
  (IPv4, vers:0, 'default':4U, 2.2.2.2/32)

explicit-nullはパケットに付いて流れる

PE2にlabel local advertise explicit-nullを入れます。

PE2(STEP 2)
mpls ldp\n address-family ipv4\n  label local advertise explicit-null

P3が受け取る値はExpNullv4に変わり、出方向はExp-Null-v4になります。

P3 show mpls ldp bindings 6.6.6.6/32(STEP 2)
RP/0/RP0/CPU0:P3#show mpls ldp bindings 6.6.6.6/32
Sun Sep 20 12:44:24.835 UTC
6.6.6.6/32, rev 18
	Local binding: label: 24005
	Remote bindings: (2 peers)
	    Peer                Label
	    -----------------   ---------
	    4.4.4.4:0           24005
	    6.6.6.6:0           ExpNullv4
P3 show mpls forwarding(STEP 2)
RP/0/RP0/CPU0:P3#show mpls forwarding
Sun Sep 20 12:44:25.602 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24000  24000       2.2.2.2/32         Gi0/0/0/0    10.4.5.4        37581
24001  24001       3.3.3.3/32         Gi0/0/0/0    10.4.5.4        0
24002  Pop         4.4.4.4/32         Gi0/0/0/0    10.4.5.4        362
24003  24002       10.2.3.0/24        Gi0/0/0/0    10.4.5.4        0
24004  Pop         10.3.4.0/24        Gi0/0/0/0    10.4.5.4        0
24005  Exp-Null-v4 6.6.6.6/32         Gi0/0/0/1    10.5.6.6        39763

P3 - PE2間のキャプチャーのNo.85では、CE1からのecho requestにラベル0が付いて届いています。TTLはラベル側が251、IPヘッダー側は254のままで、ラベルが残っている間はIPヘッダーのTTLが変わらないことがここでも分かります。

No.85 Echo request(P3 → PE2、explicit-null)tshark -V
    Type: MPLS label switched packet (0x8847)
    [Stream index: 4]
MultiProtocol Label Switching Header, Label: 0 (IPv4 Explicit-Null), Exp: 0, S: 1, TTL: 251
    0000 0000 0000 0000 0000 .... .... .... = MPLS Label: IPv4 Explicit-Null (0)
    .... .... .... .... .... 000. .... .... = MPLS Experimental Bits: 0
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 1111 1011 = MPLS TTL: 251
Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.2.1
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 100
    Identification: 0x0000 (0)
    000. .... = Flags: 0x0
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 254
上のtshark出力のパケット(No.85 Echo request)のpcapをダウンロード

VPNの経路では、No.574のようにラベル0がトップ(S = 0)、VPNラベル24007がボトム(S = 1)の2段になります。RFC 3032はexplicit-nullをボトムにしか置けないとしていましたが、RFC 4182がこの制限を外し、「トップにあればそのエントリを外し、下のラベルで処理する」に改めています。PE2はラベル0を外してから、24007でVRF CUST-Aへ転送します。

No.574 Echo request(P3 → PE2、explicit-null + VPNラベル)tshark -V
    Type: MPLS label switched packet (0x8847)
    [Stream index: 4]
MultiProtocol Label Switching Header, Label: 0 (IPv4 Explicit-Null), Exp: 0, S: 0, TTL: 251
    0000 0000 0000 0000 0000 .... .... .... = MPLS Label: IPv4 Explicit-Null (0)
    .... .... .... .... .... 000. .... .... = MPLS Experimental Bits: 0
    .... .... .... .... .... ...0 .... .... = MPLS Bottom Of Label Stack: 0
    .... .... .... .... .... .... 1111 1011 = MPLS TTL: 251
MultiProtocol Label Switching Header, Label: 24007, Exp: 0, S: 1, TTL: 254
    0000 0101 1101 1100 0111 .... .... .... = MPLS Label: 24007 (0x05dc7)
    .... .... .... .... .... 000. .... .... = MPLS Experimental Bits: 0
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 1111 1110 = MPLS TTL: 254
Internet Protocol Version 4, Src: 192.168.3.1, Dst: 192.168.4.1
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
        0000 00.. = Differentiated Services Codepoint: Default (0)
        .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
    Total Length: 100
    Identification: 0x0000 (0)
    000. .... = Flags: 0x0
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    ...0 0000 0000 0000 = Fragment Offset: 0
    Time to Live: 254
上のtshark出力のパケット(No.574 Echo request、2段)のpcapをダウンロード

設定を削除すると、P3が受け取る値はImpNullに戻ります。P3のLDPのtraceを6.6.6.6/32で絞ると、PE2から受け取った値が 3 → 0 → 3 と変わった履歴が並びます。どちらの切り替えでも、古い値の取り消し(Remove)から新しい値の受信(Add)まで10秒空いています。

P3 show mpls ldp trace binding(STEP 3)
RP/0/RP0/CPU0:P3#show mpls ldp trace binding | include "6.6.6.6/32"
Sun Sep 20 12:50:26.582 UTC
Sep 20 12:04:48.308 mpls/ldp/bndg 0/RP0/CPU0 t4208  [BNDG]:161: VRF(0x60000000): Prefix(6.6.6.6/32): Created, reason 3
Sep 20 12:04:48.309 mpls/ldp/bndg 0/RP0/CPU0 t4208  [BNDG]:221: VRF(0x60000000): Prefix(6.6.6.6/32): label 24005 (rev#18) assigned
Sep 20 12:05:00.768 mpls/ldp/bndg 0/RP0/CPU0 t4208  [BNDG]:279: VRF(0x60000000): Prefix(6.6.6.6/32): Add label 24005 from peer 4.4.4.4:0
Sep 20 12:05:10.171 mpls/ldp/bndg 0/RP0/CPU0 t4208  [BNDG]:279: VRF(0x60000000): Prefix(6.6.6.6/32): Add label 3 from peer 6.6.6.6:0
Sep 20 12:40:20.170 mpls/ldp/bndg 0/RP0/CPU0 t4208  [BNDG]:339: VRF(0x60000000): Prefix(6.6.6.6/32): Remove label 3 from peer 6.6.6.6:0
Sep 20 12:40:30.170 mpls/ldp/bndg 0/RP0/CPU0 t4208  [BNDG]:279: VRF(0x60000000): Prefix(6.6.6.6/32): Add label 0 from peer 6.6.6.6:0
Sep 20 12:46:00.170 mpls/ldp/bndg 0/RP0/CPU0 t4208  [BNDG]:339: VRF(0x60000000): Prefix(6.6.6.6/32): Remove label 0 from peer 6.6.6.6:0
Sep 20 12:46:10.170 mpls/ldp/bndg 0/RP0/CPU0 t4208  [BNDG]:279: VRF(0x60000000): Prefix(6.6.6.6/32): Add label 3 from peer 6.6.6.6:0

疎通

どのSTEPでもCE間の疎通は保たれています。ラベルの付け方が変わっても、転送そのものには影響しません。

CE1 → CE2(グローバル、STEP 0)
RP/0/RP0/CPU0:CE1#ping 192.168.2.1 source 192.168.1.1 count 50 timeout 1
Sun Sep 20 12:30:17.594 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.2.1 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 18/23/44 ms
CE3 → CE4(VPN、STEP 0)
RP/0/RP0/CPU0:CE3#ping 192.168.4.1 source 192.168.3.1 count 50 timeout 1
Sun Sep 20 12:30:44.808 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.4.1 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 18/21/35 ms

検証Configおよびshow結果

各STEPで9台すべてから、次の種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。各STEPは「カウンタのクリア → ping → show」の順に採っているため、show mpls forwardingのBytes Switchedとshow interfaceのカウンタは、そのSTEPで流したpingの分だけを表します。

ファイル内容
..._clear.txtそのSTEPの最初にクリアしたカウンタ(clear counters interface と clear mpls forwarding counters)
..._ping.txtping(50発)とtraceroute。CE1 - CE2(グローバル)、CE3 - CE4(VPN)、PE1 - PE2(コアのLSP)
..._show.txtshow version / show interface description / show route / OSPF / LDP / show mpls forwarding / show mpls label table detail / show cef など。PEはBGPとVPNの表示を追加
..._log.txtそのSTEPの範囲だけに絞ったshow logging
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._trace.txtコア5台のみ。show mpls ldp trace binding / peer / discovery / forwarding と show mpls lsd trace
..._commit.cfgそのSTEPで実際にcommitされた設定(変更したルータのみ)

STEP 4とSTEP 5は、IOS XRがダイナミックラベルの範囲をいつ使い始めるかを確かめるために追加で採取したものです。本文では扱っていませんが、記録として残しています。

STEP 0:初期状態(implicit-null)

ルータshow出力pingclearsyslogrunning-configtrace投入した設定打った操作
CE1showpingclearlogrun———
PE1showpingclearlogruntrace——
P1show—clearlogruntrace——
P2show—clearlogruntrace——
P3show—clearlogruntrace——
PE2showpingclearlogruntrace——
CE2showpingclearlogrun———
CE3showpingclearlogrun———
CE4showpingclearlogrun———

STEP 1:ToSを付けたpingを流す

ルータshow出力pingclearsyslogrunning-configtrace投入した設定打った操作
CE1showpingclearlogrun———
PE1showpingclearlogruntrace——
P1show—clearlogruntrace——
P2show—clearlogruntrace——
P3show—clearlogruntrace——
PE2showpingclearlogruntrace——
CE2showpingclearlogrun———
CE3showpingclearlogrun———
CE4showpingclearlogrun———

STEP 2:PE2にlabel local advertise explicit-null

ルータshow出力pingclearsyslogrunning-configtrace投入した設定打った操作
CE1showpingclearlogrun———
PE1showpingclearlogruntrace——
P1show—clearlogruntrace——
P2show—clearlogruntrace——
P3show—clearlogruntrace——
PE2showpingclearlogruntracecfg—
CE2showpingclearlogrun———
CE3showpingclearlogrun———
CE4showpingclearlogrun———

STEP 3:explicit-nullを削除

ルータshow出力pingclearsyslogrunning-configtrace投入した設定打った操作
CE1showpingclearlogrun———
PE1showpingclearlogruntrace——
P1show—clearlogruntrace——
P2show—clearlogruntrace——
P3show—clearlogruntrace——
PE2showpingclearlogruntracecfg—
CE2showpingclearlogrun———
CE3showpingclearlogrun———
CE4showpingclearlogrun———

STEP 4:P2とP3のラベル範囲を変更

ルータshow出力pingclearsyslogrunning-configtrace投入した設定打った操作
CE1showpingclearlogrun———
PE1showpingclearlogruntrace——
P1show—clearlogruntrace——
P2show—clearlogruntracecfgclearldp
P3show—clearlogruntracecfgclearldp
PE2showpingclearlogruntrace——
CE2showpingclearlogrun———
CE3showpingclearlogrun———
CE4showpingclearlogrun———

STEP 5:P2とP3のLDPを再起動(最終状態)

ルータshow出力pingclearsyslogrunning-configtrace投入した設定打った操作
CE1showpingclearlogrun———
PE1showpingclearlogruntrace——
P1show—clearlogruntrace——
P2show—clearlogruntrace—restart
P3show—clearlogruntrace—restart
PE2showpingclearlogruntrace——
CE2showpingclearlogrun———
CE3showpingclearlogrun———
CE4showpingclearlogrun———

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

STEPPE1 - P1P1 - P2P2 - P3P3 - PE2
0pcappcappcappcap
1pcappcappcappcap
2pcappcappcappcap
3pcappcappcappcap
4pcappcappcappcap
5pcappcappcappcap

参考

RFCタイトル概要
RFC 3032MPLS Label Stack Encodingラベルスタックエントリの形式、予約ラベル0〜3、TTLの処理、EtherType。
RFC 5462Multiprotocol Label Switching (MPLS) Label Stack Entry: “EXP” Field Renamed to “Traffic Class” FieldEXPフィールドをTraffic Classフィールドに改名。
RFC 4182Removing a Restriction on the use of MPLS Explicit NULLExplicit NULLをボトム以外にも置けるようにした改訂。
RFC 3031Multiprotocol Label Switching ArchitecturePHP(3.16節)。

予約ラベルの一覧: IANA Special-Purpose MPLS Label Values

書籍: Luc De Ghein『MPLS Fundamentals』(Cisco Press, 2006)Chapter 2〜3

関連記事