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のインタフェースのmtuはL2のMTUで、イーサネットヘッダー14バイトを含みます。既定の1514はIPのMTUが1500という意味です。MPLSのMTUはここから独立して設定するのではなく、L2のMTUから14を引いた値になります。
コアのL2のMTUをMとすると、通せるIPパケットの上限は次のようになります。
| ラベルの段数 | 用途 | 上限 | 既定(M = 1514) |
|---|---|---|---|
| 1段 | トランスポートラベルのみ | M − 14 − 4 | 1496バイト |
| 2段 | MPLS VPN(トランスポート + VPN) | M − 14 − 8 | 1492バイト |
上限を超えたパケットが入口の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/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 |
| PE2 | 入口 / 出口LSR(AS 65001) | 5.5.5.5/32 | Gi0/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/32 | Gi0/0/0/0 10.5.6.6 |
| CE3 | VRF CUST-Aの顧客側(AS 65107)、192.168.7.0/24を広告 | 7.7.7.7/32 | Gi0/0/0/0 10.2.7.7(PE1 Gi0/0/0/2) |
| CE4 | VRF CUST-Aの顧客側(AS 65108)、192.168.8.0/24を広告 | 8.8.8.8/32 | Gi0/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になること |
| 2 | PE1にmpls ip-ttl-propagate disable | CE1からCE2へのtracerouteが3ホップになり、逆方向は5ホップのままであること |
| 3 | STEP 1・2を削除(最終状態) | STEP 0と同じに戻ること |
STEP 0:初期状態(コアのMTU 1514、TTL伝搬あり)
CE1からCE2へのtracerouteです。コアのP1(10.2.3.3)とP2(10.3.4.4)が経路に出ています。
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へ戻っていることが読めます。
| リンク | ラベル | ラベルのTTL | IPのTTL |
|---|---|---|---|
| CE1 - PE1 | 無し | — | 255 |
| PE1 - P1 | 24003 | 254 | 254 |
| P2 - PE2 | 無し(PHP) | — | 252 |
PE1が255から1を引いた254をラベルに写し、P1とP2がラベルのTTLを1ずつ減らします。P2がpopするとき、その値252がIPヘッダーへ書き戻されます。
MTUの上限はDFビットを立てたpingで測れます。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 / Code | 3 / 4(Fragmentation Needed) |
| 通知するMTU | 1496 |
VRF CUST-Aではラベルが2段になるので、上限は4バイト分さらに小さい1492バイトになります。
STEP 1:コア4リンクのMTUを1400に下げる
コアの4リンクにmtu 1400を入れます。IOS XRのインタフェースのmtuはL2のMTUなので、IPとMPLSのMTUは1386になります。
MTU 1400 bytes, BW 1000000 Kbit (Max: 1000000 Kbit)上限は1ラベルで1382、2ラベルで1378へ下がりました。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 ms2つのMTUで測った値を並べると、ラベル1段が4バイトであることが数値で追えます。
| コアのL2 MTU | IP / MPLSのMTU | 1ラベルの上限 | 2ラベルの上限 |
|---|---|---|---|
| 1514 | 1500 | 1496 | 1492 |
| 1400 | 1386 | 1382 | 1378 |
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ホップに減り、コアが見えなくなりました。
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に設定していないためで、設定した向きだけが変わります。
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で外れるのは先頭のトランスポートラベルだけです。
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が減りません。
| リンク | ラベルのTTL | IPのTTL | STEP 0(伝搬あり)のIPのTTL |
|---|---|---|---|
| CE1 - PE1 | — | 255 | 255 |
| PE1 - P1 | 255 | 254 | 254 |
| P2 - PE2 | — | 253 | 252 |
伝搬ありでは出口に届いた時点で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に戻ります。
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.txtにNeighbor Down: interface down or detachedが残っているのはこのためです。片側だけ変更するとMTUが食い違い、OSPFがEXSTARTやEXCHANGEで止まります。両端をまとめて変更してください。
ベビージャイアントについて
コアのMTUを1500より大きくして利用者の1500バイトをそのまま通す構成は、このラボでは確認していません。XRdはmtu 1600を受け付け、PE1から1518バイトのフレームが出るところまでは観測できましたが、対向のP1に届かず、P1側のカウンタにもgiantsやinput 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.txt | show 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.txt | tracerouteとDFビット付きping。この記事の主要な根拠 |
STEP 0:初期状態(コアのMTU 1514、TTL伝搬あり)
| ルータ | show出力 | syslog | running-config | trace | traceroute / ping |
|---|---|---|---|---|---|
| CE1 | show | log | run | - | debug |
| PE1 | show | log | run | trace | debug |
| P1 | show | log | run | trace | debug |
| P2 | show | log | run | trace | debug |
| PE2 | show | log | run | trace | debug |
| CE2 | show | log | run | - | debug |
| CE3 | show | log | run | - | debug |
| CE4 | show | log | run | - | - |
STEP 1:コア4リンクのMTUを1400に下げる
| ルータ | show出力 | syslog | running-config | trace | traceroute / ping |
|---|---|---|---|---|---|
| CE1 | show | log | run | - | debug |
| PE1 | show | log | run | trace | debug |
| P1 | show | log | run | trace | debug |
| P2 | show | log | run | trace | debug |
| PE2 | show | log | run | trace | debug |
| CE2 | show | log | run | - | debug |
| CE3 | show | log | run | - | debug |
| CE4 | show | log | run | - | - |
STEP 2:PE1にmpls ip-ttl-propagate disable
| ルータ | show出力 | syslog | running-config | trace | traceroute / ping |
|---|---|---|---|---|---|
| CE1 | show | log | run | - | debug |
| PE1 | show | log | run | trace | debug |
| P1 | show | log | run | trace | debug |
| P2 | show | log | run | trace | debug |
| PE2 | show | log | run | trace | debug |
| CE2 | show | log | run | - | debug |
| CE3 | show | log | run | - | debug |
| CE4 | show | log | run | - | - |
STEP 3:STEP 1・2を削除(最終状態)
| ルータ | show出力 | syslog | running-config | trace | traceroute / ping |
|---|---|---|---|---|---|
| CE1 | show | log | run | - | debug |
| PE1 | show | log | run | trace | debug |
| P1 | show | log | run | trace | debug |
| P2 | show | log | run | trace | debug |
| PE2 | show | log | run | trace | debug |
| CE2 | show | log | run | - | debug |
| CE3 | show | log | run | - | debug |
| CE4 | show | log | run | - | - |
参考
| RFC | タイトル | 概要 |
|---|---|---|
| RFC 3443 | Time To Live (TTL) Processing in Multi-Protocol Label Switching (MPLS) Networks | uniform(3.1節) / short pipe(3.2節) / pipe(3.3節)の3モデル。 |
| RFC 3032 | MPLS Label Stack Encoding | ラベルスタックエントリの32ビットとTTLフィールド(2.4節)。 |
書籍: Luc De Ghein『MPLS Fundamentals』(Cisco Press, 2006)Chapter 3