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

MPLSのTTL処理とMTU

目次

MPLSのTTL処理とMTU

MPLSのラベルは32ビットのうち8ビットをTTLに使います。入口のLSRがIPヘッダーのTTLをここへ写すかどうかで、コアのルータがtracerouteに見えるかが変わります。もう1つ、ラベルは1段につき4バイトを消費するので、リンクのMTUに対して運べるIPパケットがその分だけ小さくなります。本記事ではこの2点を解説し、IOS XR(XRd)のラボで確かめます。ラベルの形式はMPLSラベルとラベルスタックで解説しています。

ラベルのTTLとIPのTTL

MPLSのTTLはIPのTTLとは別のフィールドです。ラベル付きで転送している間、LSRが減らすのは先頭のラベルのTTLだけで、中のIPヘッダーには触れません。

入口のLSRがラベルを積むとき、TTLに何を入れるかで2通りに分かれます。RFC 3443はこれをuniformモデルpipe / short pipeモデルとして整理しています。

モデル入口でラベルに入れるTTL出口
uniform(3.1節、IOS XRの既定)IPのTTLから1を引いた値をコピーするラベルのTTLをIPへ書き戻す
short pipe(3.2節)255固定。IPのTTLは入口で1減るだけラベルのTTLは捨てる
pipe(3.3節)short pipeと同じ。PHPを使わない場合の呼び方同上

uniformでは、コアを通った分だけIPのTTLが減ります。tracerouteのプローブはTTLを1ずつ増やして送るので、コアのLSRがTTL超過のICMPを返し、P1 / P2が経路として見えます。伝搬を止めるとラベルのTTLは255から始まり、コアで尽きることがありません。コアはICMPを返さず、CE1から見るとPEの間が1ホップに見えます

IOS XRではmpls ip-ttl-propagate disableで切り替えます。設定するのは入口になるPEだけで、方向ごとに独立しています。PE1にだけ入れた場合、CE1からCE2へのtracerouteではコアが消え、CE2からCE1へのtracerouteでは見えたままになります。

コアの構成を利用者に見せたくない事業者はこれを止めます。一方で止めると経路の追跡が難しくなるため、運用のしやすさとのトレードオフになります。

ラベルはMTUを消費する

ラベルは1段につき4バイトです。リンクのMTUは変わらないので、ラベルを積んだ分だけ運べるIPパケットが小さくなります

IOS XRのインタフェースのmtuL2のMTUで、イーサネットヘッダー14バイトを含みます。既定の1514はIPのMTUが1500という意味です。MPLSのMTUはここから独立して設定するのではなく、L2のMTUから14を引いた値になります。

コアのL2のMTUをMとすると、通せるIPパケットの上限は次のようになります。

ラベルの段数用途上限既定(M = 1514)
1段トランスポートラベルのみM − 14 − 41496バイト
2段MPLS VPN(トランスポート + VPN)M − 14 − 81492バイト

上限を超えたパケットが入口のPEに届くと、IPヘッダーのDFビットで扱いが分かれます。DFが立っていなければPEが断片化してから転送します。立っていれば転送できないので破棄し、送信元へICMPのType 3 Code 4(Fragmentation Needed)を返します。このとき通知するMTUはラベルの分を引いた値なので、Path MTU Discoveryが正しく働きます。

実運用では、コアのMTUを1500より大きくして利用者が1500バイトをそのまま通せるようにします。1500をわずかに超えるだけのフレームをベビージャイアントと呼び、コアのスイッチやルータでこれを許可する設定が必要になります。

実機での検証

検証環境

CE1 — PE1 — P1 — P2 — PE2 — CE2 を直列につないでいます。AS 65001のPE1 / P1 / P2 / PE2がMPLSネットワークで、OSPF(area 0、全リンクnetwork point-to-point)で経路を、LDPでラベルを配っています。CE1とCE2はPEとeBGPで経路を交換し、PE1とPE2はLoopback0間のiBGP(next-hop-self)を張っています。CE3 / CE4はVRF CUST-Aの顧客で、ラベルが2段になる場合の確認に使います。

ルータ役割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
PE2入口 / 出口LSR(AS 65001)5.5.5.5/32Gi0/0/0/0 10.4.5.5 / Gi0/0/0/1 10.5.6.5
CE2顧客側(AS 65102)、192.168.6.0/24を広告6.6.6.6/32Gi0/0/0/0 10.5.6.6
CE3VRF CUST-Aの顧客側(AS 65107)、192.168.7.0/24を広告7.7.7.7/32Gi0/0/0/0 10.2.7.7(PE1 Gi0/0/0/2)
CE4VRF CUST-Aの顧客側(AS 65108)、192.168.8.0/24を広告8.8.8.8/32Gi0/0/0/0 10.5.8.8(PE2 Gi0/0/0/2)

CE1 - PE1、PE1 - P1、P2 - PE2の3リンクでキャプチャーし、TTLの値とフレーム長、ICMPの内容を確かめます。

検証のSTEP

STEP操作狙い
0初期状態(コアのMTU 1514、TTL伝搬あり)tracerouteに5ホップ出ること。DF付きpingの上限が1ラベルで1496、2ラベルで1492であること。PE1が返すICMPの通知MTUが1496であること
1コア4リンクのMTUを1400に下げる上限が1382 / 1378へ下がり、ラベル1段が4バイトであることが数値で追えること。ICMPの通知MTUが1382になること
2PE1にmpls ip-ttl-propagate disableCE1からCE2へのtracerouteが3ホップになり、逆方向は5ホップのままであること
3STEP 1・2を削除(最終状態)STEP 0と同じに戻ること

STEP 0:初期状態(コアのMTU 1514、TTL伝搬あり)

CE1からCE2へのtracerouteです。コアのP1(10.2.3.3)とP2(10.3.4.4)が経路に出ています。

STEP 0 CE1 traceroute 192.168.6.1 source 192.168.1.1
 1  10.1.2.2 5 msec  4 msec  4 msec 
 2  10.2.3.3 [MPLS: Label 24003 Exp 0] 13 msec  11 msec  13 msec 
 3  10.3.4.4 [MPLS: Label 24003 Exp 0] 12 msec  12 msec  12 msec 
 4  10.4.5.5 36 msec  13 msec  12 msec 
 5  10.5.6.6 73 msec  *  17 msec 

各リンクのキャプチャーからTTLを拾うと、入口でIPのTTLがラベルへ写り、コアを通った分が出口でIPへ戻っていることが読めます。

リンクラベルラベルのTTLIPのTTL
CE1 - PE1無し255
PE1 - P124003254254
P2 - PE2無し(PHP)252

PE1が255から1を引いた254をラベルに写し、P1とP2がラベルのTTLを1ずつ減らします。P2がpopするとき、その値252がIPヘッダーへ書き戻されます。

MTUの上限はDFビットを立てたpingで測れます。1496バイトは通り、1497バイトは通りません。

STEP 0 CE1 ping(DF付き、1496バイトと1497バイト)
RP/0/RP0/CPU0:CE1#ping 192.168.6.1 source 192.168.1.1 size 1496 df-bit count 5
Thu Sep 10 07:53:32.159 UTC
Type escape sequence to abort.
Sending 5, 1496-byte ICMP Echos to 192.168.6.1 timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 15/16/22 ms
RP/0/RP0/CPU0:CE1#ping 192.168.6.1 source 192.168.1.1 size 1497 df-bit count 5
Thu Sep 10 07:53:32.926 UTC
Type escape sequence to abort.
Sending 5, 1497-byte ICMP Echos to 192.168.6.1 timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)

CLIには.が並ぶだけですが、CE1 - PE1のキャプチャーにはPE1が返したICMPが入っています。

項目
送信元10.2.3.2(PE1のコア側インタフェース)
Type / Code3 / 4(Fragmentation Needed)
通知するMTU1496

VRF CUST-Aではラベルが2段になるので、上限は4バイト分さらに小さい1492バイトになります。

STEP 1:コア4リンクのMTUを1400に下げる

コアの4リンクにmtu 1400を入れます。IOS XRのインタフェースのmtuはL2のMTUなので、IPとMPLSのMTUは1386になります。

STEP 1 PE1 show interfaces GigabitEthernet0/0/0/1(抜粋)
  MTU 1400 bytes, BW 1000000 Kbit (Max: 1000000 Kbit)

上限は1ラベルで1382、2ラベルで1378へ下がりました。DFを外すと同じサイズが通ります。

STEP 1 CE1 ping(1382 / 1383のDF付きと、1383のDFなし)
RP/0/RP0/CPU0:CE1#ping 192.168.6.1 source 192.168.1.1 size 1382 df-bit count 5
Thu Sep 10 12:37:40.256 UTC
Type escape sequence to abort.
Sending 5, 1382-byte ICMP Echos to 192.168.6.1 timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 13/14/18 ms
RP/0/RP0/CPU0:CE1#ping 192.168.6.1 source 192.168.1.1 size 1383 df-bit count 5
Thu Sep 10 12:37:41.222 UTC
Type escape sequence to abort.
Sending 5, 1383-byte ICMP Echos to 192.168.6.1 timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
RP/0/RP0/CPU0:CE1#ping 192.168.6.1 source 192.168.1.1 size 1383 count 5
Thu Sep 10 12:37:52.171 UTC
Type escape sequence to abort.
Sending 5, 1383-byte ICMP Echos to 192.168.6.1 timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 14/16/21 ms

2つのMTUで測った値を並べると、ラベル1段が4バイトであることが数値で追えます。

コアのL2 MTUIP / MPLSのMTU1ラベルの上限2ラベルの上限
1514150014961492
1400138613821378

ICMPが通知するMTUも1382に変わりました。ラベルの分を引いた値を返すので、送信元のPath MTU Discoveryはラベルの存在を知らないまま正しいサイズに収束できます。

PE1 - P1のキャプチャーでは、フレームの最大長が1400バイトになっています。L2のMTUがそのまま上限として効いています。

STEP 2:PE1にmpls ip-ttl-propagate disable

PE1にだけ設定します。CE1からCE2へのtracerouteは5ホップから3ホップに減り、コアが見えなくなりました。

STEP 2 CE1 traceroute 192.168.6.1 source 192.168.1.1
 1  10.1.2.2 6 msec  4 msec  4 msec 
 2  10.4.5.5 12 msec  10 msec  10 msec 
 3  10.5.6.6 14 msec  *  16 msec 

同じときにCE2からCE1へtracerouteすると、こちらは5ホップのままです。入口となるPE2に設定していないためで、設定した向きだけが変わります

STEP 2 CE2 traceroute 192.168.1.1 source 192.168.6.1
 1  10.5.6.5 5 msec  4 msec  4 msec 
 2  10.4.5.4 [MPLS: Label 24002 Exp 0] 11 msec  11 msec  12 msec 
 3  10.3.4.3 [MPLS: Label 24002 Exp 0] 12 msec  12 msec  11 msec 
 4  10.2.3.2 12 msec  12 msec  12 msec 
 5  10.1.2.1 17 msec  *  16 msec 

VRFのCE3からCE4も3ホップになります。2番目に残っているLabel 24005はVPNラベルで、PHPで外れるのは先頭のトランスポートラベルだけです。

STEP 2 CE3 traceroute 192.168.8.1 source 192.168.7.1
 1  10.2.7.2 6 msec  5 msec  5 msec 
 2  10.4.5.5 [MPLS: Label 24005 Exp 0] 52 msec  21 msec  13 msec 
 3  10.5.8.8 16 msec  *  16 msec 

キャプチャーのTTLはSTEP 0と変わります。ラベルのTTLが255から始まり、コアを通ってもIPのTTLが減りません。

リンクラベルのTTLIPのTTLSTEP 0(伝搬あり)のIPのTTL
CE1 - PE1255255
PE1 - P1255254254
P2 - PE2253252

伝搬ありでは出口に届いた時点で252、伝搬なしでは253です。差の1がコアの2ホップ分から入口の1ホップ分を引いた値にあたります。コアはIPのTTLに触れないので、利用者からはPEの間が1ホップに見えます。

MTUの上限はSTEP 1と同じ1382のままです。TTLの設定はパケットの大きさに関係しません。

STEP 3:STEP 1・2を削除(最終状態)

両方を外すと、MTUは1514、tracerouteは5ホップ、上限は1496と1492に戻ります。

STEP 3 CE1 traceroute 192.168.6.1 source 192.168.1.1
 1  10.1.2.2 7 msec  4 msec  4 msec 
 2  10.2.3.3 [MPLS: Label 24003 Exp 0] 15 msec  12 msec  14 msec 
 3  10.3.4.4 [MPLS: Label 24003 Exp 0] 16 msec  12 msec  13 msec 
 4  10.4.5.5 16 msec  14 msec  14 msec 
 5  10.5.6.6 19 msec  *  16 msec 

なおmtuを変更するとインタフェースがいったん落ちるため、OSPFの隣接が再確立します。STEP 1とSTEP 3の..._log.txtNeighbor Down: interface down or detachedが残っているのはこのためです。片側だけ変更するとMTUが食い違い、OSPFがEXSTARTやEXCHANGEで止まります。両端をまとめて変更してください。

ベビージャイアントについて

コアのMTUを1500より大きくして利用者の1500バイトをそのまま通す構成は、このラボでは確認していません。XRdはmtu 1600を受け付け、PE1から1518バイトのフレームが出るところまでは観測できましたが、対向のP1に届かず、P1側のカウンタにもgiantsinput errorsが計上されませんでした。CMLの仮想リンクが1514バイトで頭打ちになっているためで、ルータの設定では越えられません。

キャプチャー

各STEPでCE1 - PE1、PE1 - P1、P2 - PE2の3リンクを同時に採取しています。MPLSを含むためフィルターなしで取得しました。

STEP 0 CE1 - PE1

STEP 0 PE1 - P1

STEP 0 P2 - PE2

STEP 1 CE1 - PE1

STEP 1 PE1 - P1

STEP 1 P2 - PE2

STEP 2 CE1 - PE1

STEP 2 PE1 - P1

STEP 2 P2 - PE2

STEP 3 CE1 - PE1

STEP 3 PE1 - P1

STEP 3 P2 - PE2

検証Configおよびshow結果

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

ファイル内容
..._show.txtshow version / show interface description / show route と、OSPF・LDP・MPLS転送・BGPの一式
..._log.txtそのSTEPの範囲だけに絞ったshow logging。各STEPの開始時にlogmsgでマーカーを入れ、その時刻をshow logging startに指定して取得したもの
..._run.txtそのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._trace.txtコア4台のLDPとLSDのトレース
..._debug.txttracerouteとDFビット付きping。この記事の主要な根拠

STEP 0:初期状態(コアのMTU 1514、TTL伝搬あり)

ルータshow出力syslogrunning-configtracetraceroute / ping
CE1showlogrun-debug
PE1showlogruntracedebug
P1showlogruntracedebug
P2showlogruntracedebug
PE2showlogruntracedebug
CE2showlogrun-debug
CE3showlogrun-debug
CE4showlogrun--

STEP 1:コア4リンクのMTUを1400に下げる

ルータshow出力syslogrunning-configtracetraceroute / ping
CE1showlogrun-debug
PE1showlogruntracedebug
P1showlogruntracedebug
P2showlogruntracedebug
PE2showlogruntracedebug
CE2showlogrun-debug
CE3showlogrun-debug
CE4showlogrun--

STEP 2:PE1にmpls ip-ttl-propagate disable

ルータshow出力syslogrunning-configtracetraceroute / ping
CE1showlogrun-debug
PE1showlogruntracedebug
P1showlogruntracedebug
P2showlogruntracedebug
PE2showlogruntracedebug
CE2showlogrun-debug
CE3showlogrun-debug
CE4showlogrun--

STEP 3:STEP 1・2を削除(最終状態)

ルータshow出力syslogrunning-configtracetraceroute / ping
CE1showlogrun-debug
PE1showlogruntracedebug
P1showlogruntracedebug
P2showlogruntracedebug
PE2showlogruntracedebug
CE2showlogrun-debug
CE3showlogrun-debug
CE4showlogrun--

参考

RFCタイトル概要
RFC 3443Time To Live (TTL) Processing in Multi-Protocol Label Switching (MPLS) Networksuniform(3.1節) / short pipe(3.2節) / pipe(3.3節)の3モデル。
RFC 3032MPLS Label Stack Encodingラベルスタックエントリの32ビットとTTLフィールド(2.4節)。

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

関連記事