MPLSラベルとラベルスタック
MPLSのラベルは、RFC 3032が定める4バイトのラベルスタックエントリとしてパケットに付きます。本記事では、この4バイトの中身、複数のラベルを積んだときの並び、値が予約されているラベルを解説し、最後にIOS XR(XRd)のラボでラベル付きパケットをキャプチャーして確かめます。ラベルの役割やLSR・LSPといった用語はMPLSとはで解説しています。
ラベルスタックエントリの形式
| フィールド | ビット数 | 内容 |
|---|---|---|
| Label | 20 | ラベル値。0〜1048575のうち、0〜15は特別な用途に予約されている(後述)。 |
| EXP / TC | 3 | QoSのクラスを運ぶ。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) | 8 | IPヘッダーの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)。
| 値 | 名前 | 意味 |
|---|---|---|
| 0 | IPv4 Explicit NULL | 受け取ったLSRはこのエントリを外し、下にラベルがあればそのラベルで、無ければIPv4ヘッダーで転送する。RFC 3032ではボトムにしか置けなかったが、RFC 4182で制限が外れた。 |
| 1 | Router Alert | ボトム以外に置ける。トップにあるとソフトウェア処理に回され、転送後に再び積み直される。 |
| 2 | IPv6 Explicit NULL | 0のIPv6版。 |
| 3 | Implicit NULL | パケットには付かない。出口LSRがこの値を配ることで、1つ手前のLSRに「ラベルを外して送れ」と伝える(PHP)。 |
| 4 | MPLS Network Actions | RFC 9994。 |
| 7 | Entropy Label Indicator(ELI) | RFC 6790。直後にロードバランス用のエントロピーラベルが続くことを示す。 |
| 13 | Generic Associated Channel Label(GAL) | RFC 5586。OAMなどの制御チャネル。 |
| 14 | OAM Alert | RFC 3429。 |
| 15 | Extension 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/32 | Gi0/0/0/0 10.1.2.1 |
| PE1 | 入口 / 出口LSR(AS 65001) | 2.2.2.2/32 | Gi0/0/0/0 10.1.2.2 / Gi0/0/0/1 10.2.3.2 |
| P1 | 中継LSR | 3.3.3.3/32 | Gi0/0/0/0 10.2.3.3 / Gi0/0/0/1 10.3.4.3 |
| P2 | 中継LSR | 4.4.4.4/32 | Gi0/0/0/0 10.3.4.4 / Gi0/0/0/1 10.4.5.4 |
| P3 | 中継LSR(PHPを行う) | 5.5.5.5/32 | Gi0/0/0/0 10.4.5.5 / Gi0/0/0/1 10.5.6.5 |
| PE2 | 入口 / 出口LSR(AS 65001) | 6.6.6.6/32 | Gi0/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/32 | Gi0/0/0/0 10.6.7.7 |
| CE3 | VRF CUST-Aの顧客側(AS 65103)、192.168.3.0/24を広告 | 8.8.8.8/32 | Gi0/0/0/0 10.2.8.8(PE1 Gi0/0/0/2) |
| CE4 | VRF CUST-Aの顧客側(AS 65104)、192.168.4.0/24を広告 | 9.9.9.9/32 | Gi0/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間ではラベルが外れていること |
| 1 | ToSを付けたpingを流す(設定変更なし) | IPヘッダーのprecedenceがラベルのEXPに写ること。IP側のDSCPは変わらないこと |
| 2 | PE2にlabel local advertise explicit-null | P3 - PE2間にラベル0が現れること。VPNではラベル0がトップに積まれること |
| 3 | STEP 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])。
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のとおりです。
RP/0/RP0/CPU0:P1#show mpls label range
Sun Sep 20 12:32:03.861 UTC
Range for dynamic labels: Min/Max: 24000/1048575CE1から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減らして写した値です。
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ホップごとに変わるTTLと、変わらないIPヘッダー
ラベルのTTLはLSRを通るたびに1減ります。コアの4リンクすべてで同じecho requestを見ると、254 → 253 → 252と減り、最後のリンクではラベルそのものが無くなっています。
$ 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)ためです。
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: 251CE1からのtracerouteにも同じことが出ます。ホップ2〜4はラベル付きで、PE2(10.5.6.6)はラベル無しです。
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を見ると、それぞれが自分のローカルラベルを外して次のルータのラベルを付けていることが分かります。
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 37705RP/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 38553RP/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 382462段のラベルスタック
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段です。
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です。
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: 254P3 - PE2間のキャプチャーのNo.523は、同じパケットがP3でトップのラベルを外された後の姿です。VPNラベル24007だけが残り、TTLは251になっています。P3はトップのラベルを外すとき、その時点のTTL(251)を新しくトップになったラベルに書き移しています(RFC 3032 2.4.2)。
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: 254PE2側では、ローカルラベル24007がVRF CUST-Aの192.168.4.0/24([V])に対応しており、このラベルでCE4向けのインタフェースに送り出されます。VPNラベルの配布や意味はMPLS L3VPNのシリーズで解説します。
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 13088TCにはIPのprecedenceが写る
ラベルを付けるとき、IOS XRは既定でIPヘッダーのprecedence(DSCPの上位3ビット)をTCに写します。CE1からtypeでToSを指定したpingを打つと、DSCP 46(EF)のパケットはTCが5になります。IPヘッダーのDSCPは書き換わりません。
| CE1が送ったToS | IPのDSCP | ラベルのTC |
|---|---|---|
| 0 | 0(CS0) | 0 |
| 96 | 24(CS3) | 3 |
| 184 | 46(EF) | 5 |
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)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です。
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 ImpNullRP/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で伝えるための値であって、ラベルテーブルにも、実際のパケットにも現れません。
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を入れます。
mpls ldp\n address-family ipv4\n label local advertise explicit-nullP3が受け取る値はExpNullv4に変わり、出方向はExp-Null-v4になります。
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 ExpNullv4RP/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 39763P3 - PE2間のキャプチャーのNo.85では、CE1からのecho requestにラベル0が付いて届いています。TTLはラベル側が251、IPヘッダー側は254のままで、ラベルが残っている間はIPヘッダーのTTLが変わらないことがここでも分かります。
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: 254VPNの経路では、No.574のようにラベル0がトップ(S = 0)、VPNラベル24007がボトム(S = 1)の2段になります。RFC 3032はexplicit-nullをボトムにしか置けないとしていましたが、RFC 4182がこの制限を外し、「トップにあればそのエントリを外し、下のラベルで処理する」に改めています。PE2はラベル0を外してから、24007でVRF CUST-Aへ転送します。
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設定を削除すると、P3が受け取る値はImpNullに戻ります。P3のLDPのtraceを6.6.6.6/32で絞ると、PE2から受け取った値が 3 → 0 → 3 と変わった履歴が並びます。どちらの切り替えでも、古い値の取り消し(Remove)から新しい値の受信(Add)まで10秒空いています。
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間の疎通は保たれています。ラベルの付け方が変わっても、転送そのものには影響しません。
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 msRP/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.txt | ping(50発)とtraceroute。CE1 - CE2(グローバル)、CE3 - CE4(VPN)、PE1 - PE2(コアのLSP) |
..._show.txt | show 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出力 | ping | clear | syslog | running-config | trace | 投入した設定 | 打った操作 |
|---|---|---|---|---|---|---|---|---|
| CE1 | show | ping | clear | log | run | — | — | — |
| PE1 | show | ping | clear | log | run | trace | — | — |
| P1 | show | — | clear | log | run | trace | — | — |
| P2 | show | — | clear | log | run | trace | — | — |
| P3 | show | — | clear | log | run | trace | — | — |
| PE2 | show | ping | clear | log | run | trace | — | — |
| CE2 | show | ping | clear | log | run | — | — | — |
| CE3 | show | ping | clear | log | run | — | — | — |
| CE4 | show | ping | clear | log | run | — | — | — |
STEP 1:ToSを付けたpingを流す
| ルータ | show出力 | ping | clear | syslog | running-config | trace | 投入した設定 | 打った操作 |
|---|---|---|---|---|---|---|---|---|
| CE1 | show | ping | clear | log | run | — | — | — |
| PE1 | show | ping | clear | log | run | trace | — | — |
| P1 | show | — | clear | log | run | trace | — | — |
| P2 | show | — | clear | log | run | trace | — | — |
| P3 | show | — | clear | log | run | trace | — | — |
| PE2 | show | ping | clear | log | run | trace | — | — |
| CE2 | show | ping | clear | log | run | — | — | — |
| CE3 | show | ping | clear | log | run | — | — | — |
| CE4 | show | ping | clear | log | run | — | — | — |
STEP 2:PE2にlabel local advertise explicit-null
| ルータ | show出力 | ping | clear | syslog | running-config | trace | 投入した設定 | 打った操作 |
|---|---|---|---|---|---|---|---|---|
| CE1 | show | ping | clear | log | run | — | — | — |
| PE1 | show | ping | clear | log | run | trace | — | — |
| P1 | show | — | clear | log | run | trace | — | — |
| P2 | show | — | clear | log | run | trace | — | — |
| P3 | show | — | clear | log | run | trace | — | — |
| PE2 | show | ping | clear | log | run | trace | cfg | — |
| CE2 | show | ping | clear | log | run | — | — | — |
| CE3 | show | ping | clear | log | run | — | — | — |
| CE4 | show | ping | clear | log | run | — | — | — |
STEP 3:explicit-nullを削除
| ルータ | show出力 | ping | clear | syslog | running-config | trace | 投入した設定 | 打った操作 |
|---|---|---|---|---|---|---|---|---|
| CE1 | show | ping | clear | log | run | — | — | — |
| PE1 | show | ping | clear | log | run | trace | — | — |
| P1 | show | — | clear | log | run | trace | — | — |
| P2 | show | — | clear | log | run | trace | — | — |
| P3 | show | — | clear | log | run | trace | — | — |
| PE2 | show | ping | clear | log | run | trace | cfg | — |
| CE2 | show | ping | clear | log | run | — | — | — |
| CE3 | show | ping | clear | log | run | — | — | — |
| CE4 | show | ping | clear | log | run | — | — | — |
STEP 4:P2とP3のラベル範囲を変更
| ルータ | show出力 | ping | clear | syslog | running-config | trace | 投入した設定 | 打った操作 |
|---|---|---|---|---|---|---|---|---|
| CE1 | show | ping | clear | log | run | — | — | — |
| PE1 | show | ping | clear | log | run | trace | — | — |
| P1 | show | — | clear | log | run | trace | — | — |
| P2 | show | — | clear | log | run | trace | cfg | clearldp |
| P3 | show | — | clear | log | run | trace | cfg | clearldp |
| PE2 | show | ping | clear | log | run | trace | — | — |
| CE2 | show | ping | clear | log | run | — | — | — |
| CE3 | show | ping | clear | log | run | — | — | — |
| CE4 | show | ping | clear | log | run | — | — | — |
STEP 5:P2とP3のLDPを再起動(最終状態)
| ルータ | show出力 | ping | clear | syslog | running-config | trace | 投入した設定 | 打った操作 |
|---|---|---|---|---|---|---|---|---|
| CE1 | show | ping | clear | log | run | — | — | — |
| PE1 | show | ping | clear | log | run | trace | — | — |
| P1 | show | — | clear | log | run | trace | — | — |
| P2 | show | — | clear | log | run | trace | — | restart |
| P3 | show | — | clear | log | run | trace | — | restart |
| PE2 | show | ping | clear | log | run | trace | — | — |
| CE2 | show | ping | clear | log | run | — | — | — |
| CE3 | show | ping | clear | log | run | — | — | — |
| CE4 | show | ping | clear | log | run | — | — | — |
パケットキャプチャーはSTEPごとに、コアの4リンクすべてで取得しています。
| STEP | PE1 - P1 | P1 - P2 | P2 - P3 | P3 - PE2 |
|---|---|---|---|---|
| 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 |
参考
| RFC | タイトル | 概要 |
|---|---|---|
| RFC 3032 | MPLS Label Stack Encoding | ラベルスタックエントリの形式、予約ラベル0〜3、TTLの処理、EtherType。 |
| RFC 5462 | Multiprotocol Label Switching (MPLS) Label Stack Entry: “EXP” Field Renamed to “Traffic Class” Field | EXPフィールドをTraffic Classフィールドに改名。 |
| RFC 4182 | Removing a Restriction on the use of MPLS Explicit NULL | Explicit NULLをボトム以外にも置けるようにした改訂。 |
| RFC 3031 | Multiprotocol Label Switching Architecture | PHP(3.16節)。 |
予約ラベルの一覧: IANA Special-Purpose MPLS Label Values
書籍: Luc De Ghein『MPLS Fundamentals』(Cisco Press, 2006)Chapter 2〜3
関連記事
- 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(EXPとuniform / pipe / short-pipe)
- MPLSのQoSの帯域制御とキューイング(policer / shaper / priority)