LDPとは
LDP(Label Distribution Protocol、RFC 5036)は、MPLSのラベルを隣のルータへ配るプロトコルです。経路そのものはOSPFやIS-ISが配り、LDPは「そのプレフィックスに私はこのラベルを使う」という対応だけを配ります。本記事ではLDPが隣を見つけてセッションを張りラベルを配るまでを解説し、IOS XR(XRd)のラボで確立の全過程をパケットで追います。ラベルの付け替えはMPLSのラベル操作(push / swap / pop)とPHPで解説しています。
LDPの3つの段階
LDPの動きは3つに分かれます。
| 段階 | 使うもの | やること |
|---|---|---|
| Discovery | UDP 646、宛先224.0.0.2 | Helloを撒いて隣のLSRを見つける |
| Session | TCP 646 | 見つけた相手とTCPをつなぎ、パラメータを合わせる |
| Advertisement | 同じTCP接続 | 自分のアドレスとラベルの対応を送る |
Helloだけがマルチキャストで、相手が決まってからはユニキャストのTCPに移ります。TCPを先に張りにいくのは転送アドレスが大きいほうで、小さいほうは待ち受けます。
LDP識別子
LDPは相手をLDP識別子で識別します。6オクテットで、<LSRのID>:<ラベルスペース>と表記します。
前半4オクテットはルータを一意に識別する値で、ルータIDと同じ値にすることが一般的です。後半2オクテットはラベルスペースの番号で、0はプラットフォーム全体で1つのラベル空間を使うことを表します。インタフェースごとにラベル空間を分ける構成では0以外になります。
LDPのメッセージ
RFC 5036が定義するメッセージは11種類です。タイプ値は2オクテットで、種類ごとに番号が割り当てられています。
| メッセージ | Type | 役割 |
|---|---|---|
| Notification | 0x0001 | エラーやセッションの終了を伝える |
| Hello | 0x0100 | 隣を見つける。UDPで送る唯一のメッセージ |
| Initialization | 0x0200 | セッションのパラメータを提示する |
| KeepAlive | 0x0201 | セッションを維持する |
| Address | 0x0300 | 自分が持つIPアドレスを伝える |
| Address Withdraw | 0x0301 | 伝えたアドレスを取り消す |
| Label Mapping | 0x0400 | プレフィックスとラベルの対応を伝える |
| Label Request | 0x0401 | ラベルを要求する(Downstream-on-Demandで使う) |
| Label Withdraw | 0x0402 | 配ったラベルを取り消す |
| Label Release | 0x0403 | 受け取ったラベルを返す |
| Label Abort Request | 0x0404 | 出した要求を取り消す |
このうちAddress Withdraw以降の取り消し系は、経路が消えたときやセッションが切れたときに使われます。タイプ値はRFC 5036の付録A.1に一覧があります。
Addressが要る理由は、LDPの識別子とラベルを付ける宛先のIPアドレスが別物だからです。受け取った側は、Addressで教わったアドレスの一覧を使って「このネクストホップはどのLDPピアか」を対応付けます。
ラベルの配り方
IOS XRの既定はDownstream-Unsolicitedで、要求を待たずに自分のラベルを配ります。要求があってから配るDownstream-on-Demandもあり、そちらではLabel Requestを使います。配布モードの違いはLDPのラベル配布モードとラベルスペースで解説しています。
セッションが上がると、まずAddressで自分のアドレスを送り、続けて持っているプレフィックスの数だけLabel Mappingを送ります。以後は経路が増減したときに差分だけを送り、KeepAliveで接続を維持します。
DiscoveryとSessionは単位が違う
3つの段階のうち、Discoveryはリンクごと、Sessionはピアごとです。ここが対応していないため、リンクが複数あると数が一致しません。
| 項目 | Discovery | Session |
|---|---|---|
| 数の単位 | インタフェースごとに1つ | LDPピアごとに1つ |
| 使うアドレス | インタフェースのIPアドレス | 転送アドレス(通常はLoopback) |
| トランスポート | UDP 646のマルチキャスト | TCP 646のユニキャスト |
| 相手の決め方 | マルチキャストで探す | Helloで知った転送アドレスへ接続する |
| 役割 | 隣にどのLSRがいるかを知る | ラベルを運ぶ信頼できる通路を作る |
| 切れたと判断するまで | Helloのホールドタイム15秒 | セッションのホールドタイム180秒 |
PE1とP1を2本のリンクでつなぐと、Discoveryは2つ、Sessionは1本になります。LDPが相手を識別するのはLDP識別子、つまりラベルスペースの単位だからです。ラベルスペースが:0、すなわちプラットフォーム全体で1つなら、どのリンクから来ても同じラベルが有効なので、セッションを分ける理由がありません。
この非対称には運用上の意味があります。片方のリンクが落ちてもセッションは切れません。Discovery Sourceが1つ減るだけで、残った経路でTCP接続が続くためです。ラベルの再配布が起きないので、リンク障害のたびにラベルが振り直されることを避けられます。逆にすべてのリンクが落ちるとDiscovery Sourceが0になり、セッションも終了します。
実機での検証
検証環境
CE1 — PE1 — P1 — P2 — P3 — PE2 — CE2 を直列につなぎ、PE1とP1の間だけ2本のリンクにしています。AS 65001のPE1 / P1 / P2 / P3 / PE2がMPLSネットワークで、OSPF(area 0、全リンクnetwork point-to-point)で経路を、LDPでラベルを配っています。CE1とCE2はPEとeBGPで経路を交換し、PE1とPE2はLoopback0間のiBGP(next-hop-self)を張っています。全台XRdです。
2本目(10.2.13.0/24)はOSPFのコストを100にしてあります。経路が1本目を向くので、LDPのTCPもそちらを通ります。
| ルータ | Lo0 | リンク | Discovery / Session |
|---|---|---|---|
| CE1 | 1.1.1.1/32 | Gi0/0/0/0 10.1.2.1(AS 65101、192.168.1.0/24) | LDPなし |
| PE1 | 2.2.2.2/32 | Gi0/0/0/0 10.1.2.2 / Gi0/0/0/1 10.2.3.2 / Gi0/0/0/2 10.2.13.2 | 2 / 1 |
| P1 | 3.3.3.3/32 | Gi0/0/0/0 10.2.3.3 / Gi0/0/0/1 10.3.4.3 / Gi0/0/0/2 10.2.13.3 | 3 / 2 |
| P2 | 4.4.4.4/32 | Gi0/0/0/0 10.3.4.4 / Gi0/0/0/1 10.4.5.4 | 2 / 2 |
| P3 | 5.5.5.5/32 | Gi0/0/0/0 10.4.5.5 / Gi0/0/0/1 10.5.6.5 | 2 / 2 |
| PE2 | 6.6.6.6/32 | Gi0/0/0/0 10.5.6.6 / Gi0/0/0/1 10.6.7.6 | 1 / 1 |
| CE2 | 7.7.7.7/32 | Gi0/0/0/0 10.6.7.7(AS 65102、192.168.2.0/24) | LDPなし |
キャプチャーはPE1 - P1の2本とも、STEPごとに取得しています。
検証のSTEP
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | 初期状態 | LDP識別子、Discoveryが2でSessionが1であること、配られたラベル |
| 1 | 1本目を両端shutdown | セッションが切れず、TCPが2本目へ移ること。取り消し系のメッセージが流れること |
| 2 | 2本目もshutdown | Discovery Sourceが0になり、セッションが終了すること |
| 3 | 2本ともno shutdown | 確立の全過程がキャプチャーに収まること |
| 4 | PE1にだけ認証を設定 | Helloは流れ続け、TCPの段階で落ちること |
| 5 | 認証を削除(最終状態) | STEP 0と同じに戻ること |
LDP識別子とHello
PE1のDiscoveryです。自分のLDP識別子が2.2.2.2:0、相手が3.3.3.3:0で、2つのインタフェースが別々のDiscovery Sourceとして並びます。
RP/0/RP0/CPU0:PE1#show mpls ldp discovery
Mon Sep 28 01:41:35.919 UTC
Local LDP Identifier: 2.2.2.2:0
Discovery Sources:
Interfaces:
GigabitEthernet0/0/0/1 : xmit/recv
VRF: 'default' (0x60000000)
LDP Id: 3.3.3.3:0, Transport address: 3.3.3.3
Hold time: 15 sec (local:15 sec, peer:15 sec)
Established: Sep 28 01:35:03.119 (00:06:32 ago)
GigabitEthernet0/0/0/2 : xmit/recv
VRF: 'default' (0x60000000)
LDP Id: 3.3.3.3:0, Transport address: 3.3.3.3
Hold time: 15 sec (local:15 sec, peer:15 sec)
Established: Sep 28 01:35:03.219 (00:06:32 ago)xmit/recvはHelloを送受信できている状態です。ホールドタイムは15秒で、この間にHelloが届かなければ相手を失ったと判断します。転送アドレスはどちらも同じ3.3.3.3(P1のLoopback0)です。
Discoveryはリンクごと、Sessionはピアごと
show mpls ldp summaryに両方の数が並びます。PE1はHello Adjが2でNeighborsが1、同じ相手と2本のリンクで向かい合っているためです。一方のP2は2台の別々の相手と1本ずつなので、Hello Adjが2でNeighborsも2になります。P1はPE1へ2本、P2へ1本で、Hello Adjが3、Neighborsが2です。
RP/0/RP0/CPU0:PE1#show mpls ldp summary
Mon Sep 28 01:41:35.678 UTC
AFIs : IPv4
Routes : 11 prefixes
Bindings : 11 prefixes
Local : 11
Remote : 10
Neighbors : 1
Adj Groups: 1
Hello Adj : 2
Addresses : 4
Interfaces: 2 LDP configuredRP/0/RP0/CPU0:P1#show mpls ldp summary
Mon Sep 28 01:42:47.550 UTC
AFIs : IPv4
Routes : 10 prefixes
Bindings : 11 prefixes
Local : 10
Remote : 21
Neighbors : 2
Adj Groups: 2
Hello Adj : 3
Addresses : 4
Interfaces: 3 LDP configuredRP/0/RP0/CPU0:P2#show mpls ldp summary
Mon Sep 28 01:43:22.186 UTC
AFIs : IPv4
Routes : 10 prefixes
Bindings : 10 prefixes
Local : 10
Remote : 20
Neighbors : 2
Adj Groups: 2
Hello Adj : 2
Addresses : 3
Interfaces: 2 LDP configuredPE1のネイバーの詳細です。Peer LDP Identifierは1つ、TCP connectionも1本で、その下にLDP Discovery Sources: IPv4: (2)として2つのインタフェースが並びます。2つのDiscoveryが1つのSessionに集約されていることがこの1画面で読めます。
RP/0/RP0/CPU0:PE1#show mpls ldp neighbor detail
Mon Sep 28 01:41:36.555 UTC
Peer LDP Identifier: 3.3.3.3:0
TCP connection: 3.3.3.3:17769 - 2.2.2.2:646
Graceful Restart: No
Session Holdtime: 180 sec
State: Oper; Msgs sent/rcvd: 21/20; Downstream-Unsolicited
Up time: 00:06:19
LDP Discovery Sources:
IPv4: (2)
GigabitEthernet0/0/0/1
GigabitEthernet0/0/0/2
IPv6: (0)
Addresses bound to this peer:
IPv4: (4)
3.3.3.3 10.2.3.3 10.2.13.3 10.3.4.3
IPv6: (0)セッションの実体はTCPです。show tcp briefに646番の接続が出ます。転送アドレスが大きいほうのP1(3.3.3.3)が接続し、PE1が646で待ち受けています。
RP/0/RP0/CPU0:PE1#show tcp brief
Mon Sep 28 01:41:42.659 UTC
PCB VRF-ID Recv-Q Send-Q Local Address Foreign Address State
0x00007da7f8008bc0 0x60000000 0 0 :::179 :::0 LISTEN
0x00007da7f8003520 0x00000000 0 0 :::179 :::0 LISTEN
0x0000641354700120 0x60000000 0 0 :::0 :::0 CLOSED
0x00007da7f4003050 0x00000000 0 0 :::0 :::0 CLOSED
0x00007da83c008010 0x60000000 0 0 2.2.2.2:646 3.3.3.3:17769 ESTAB
0x00007da83c00dae0 0x60000000 0 0 2.2.2.2:179 6.6.6.6:38014 ESTAB
0x00007da7f80093b0 0x60000000 0 0 10.1.2.2:28215 10.1.2.1:179 ESTAB
0x00007da804002e70 0x60000000 0 0 0.0.0.0:646 0.0.0.0:0 LISTEN
0x00007da7fc003520 0x00000000 0 0 0.0.0.0:646 0.0.0.0:0 LISTEN
0x00007da7ec0489a0 0x60000000 0 0 0.0.0.0:179 0.0.0.0:0 LISTEN
0x00007da7ec0431d0 0x00000000 0 0 0.0.0.0:179 0.0.0.0:0 LISTEN
0x00007da8040036a0 0x00000000 0 0 0.0.0.0:0 0.0.0.0:0 CLOSED配られたラベルはshow mpls ldp bindingsに並びます。PE2のLoopback0(6.6.6.6/32)には、自分が付けた24006と、P1から受け取った24005が入っています。
RP/0/RP0/CPU0:PE1#show mpls ldp bindings 6.6.6.6/32
Mon Sep 28 01:41:38.736 UTC
6.6.6.6/32, rev 22
Local binding: label: 24006
Remote bindings: (1 peers)
Peer Label
----------------- ---------
3.3.3.3:0 24005片方のリンクが落ちてもセッションは切れない
1本目の両端をshutdownします。
RP/0/RP0/CPU0:PE1#show configuration commit changes last 1
Mon Sep 28 04:04:46.474 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
interface GigabitEthernet0/0/0/1
shutdown
!
endRP/0/RP0/CPU0:P1#show configuration commit changes last 1
Mon Sep 28 04:04:54.143 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
interface GigabitEthernet0/0/0/0
shutdown
!
endsyslogにはOSPFの隣接断とHelloの隣接(HELLO_ADJ_CHANGE)が出ますが、LDPのネイバーが落ちたログ(NBR_CHANGE)は出ません。
RP/0/RP0/CPU0:Sep 28 04:04:45.655 UTC: ospf[1035]: %ROUTING-OSPF-5-ADJCHG : Process 1, Nbr 3.3.3.3 on GigabitEthernet0/0/0/1 in area 0 from FULL to DOWN, Neighbor Down: interface down or detached, vrf default vrfid 0x60000000
RP/0/RP0/CPU0:Sep 28 04:04:45.657 UTC: mpls_ldp[1178]: %ROUTING-LDP-5-HELLO_ADJ_CHANGE : VRF 'default' (0x60000000), Link hello adjacency (10.2.3.3, GigabitEthernet0/0/0/1) with Nbr 3.3.3.3:0 is DOWN (Interface state down)ネイバーの詳細を見ると、TCP接続のポート番号もUp timeもSTEP 0から続いています。Discovery Sourceだけが2つから1つに減りました。
RP/0/RP0/CPU0:PE1#show mpls ldp neighbor detail
Mon Sep 28 04:08:12.888 UTC
Peer LDP Identifier: 3.3.3.3:0
TCP connection: 3.3.3.3:53056 - 2.2.2.2:646
Graceful Restart: No
Session Holdtime: 180 sec
State: Oper; Msgs sent/rcvd: 26/25; Downstream-Unsolicited
Up time: 00:09:04
LDP Discovery Sources:
IPv4: (1)
GigabitEthernet0/0/0/2
IPv6: (0)
Addresses bound to this peer:キャプチャーでも、TCPは1本目から消えて2本目に現れます。Helloは残った2本目だけに流れます。落ちたリンクのアドレスとラベルは取り消され、Address Withdraw / Label Withdraw / Label Releaseが2本目のセッション上を流れました。
$ tshark -r - -Y 'ldp && tcp' -T fields -e frame.number -e frame.time_relative -e ip.src -e _ws.col.info \
< mpls-ldp-step1-link2.pcap
147 14.863650000 3.3.3.3 Address Withdrawal Message
156 15.169564000 2.2.2.2 Label Withdrawal Message
157 15.173744000 3.3.3.3 Label Release Message
158 15.177509000 2.2.2.2 Label Mapping Message
206 18.587109000 3.3.3.3 Keep Alive Messageshow mpls ldp statistics msg-countersにも同じものが数として出ます。
RP/0/RP0/CPU0:PE1#show mpls ldp statistics msg-counters
Mon Sep 28 04:08:13.777 UTC
Peer LDP Identifier: 3.3.3.3:0
Sent Rcvd
------ ------
Initialization 1 1
Address 1 1
Address-Withdraw 1 1
Label-Mapping 12 10
Label-Withdraw 1 0
Label-Release 0 1
Label-Request 0 0
Label-Abort-Request 0 0
Notification 0 0
KeepAlive 10 11
Total 26 25このあいだもCE1からCE2への疎通は保たれています(50発すべて成功)。セッションが切れないのでラベルは振り直されず、転送は2本目を通って続きます。
すべてのリンクが落ちるとセッションも終了する
2本目も落とすと、Discovery Sourceが0になります。ここで初めてLDPのネイバーが落ちます。
RP/0/RP0/CPU0:Sep 28 04:11:52.034 UTC: mpls_ldp[1178]: %ROUTING-LDP-5-HELLO_ADJ_CHANGE : VRF 'default' (0x60000000), Link hello adjacency (10.2.13.3, GigabitEthernet0/0/0/2) with Nbr 3.3.3.3:0 is DOWN (Interface state down)
RP/0/RP0/CPU0:Sep 28 04:11:52.040 UTC: mpls_ldp[1178]: %ROUTING-LDP-5-NBR_CHANGE : VRF 'default' (0x60000000), Neighbor 3.3.3.3:0 is DOWN (Interface state down)RP/0/RP0/CPU0:PE1#show mpls ldp discovery
Mon Sep 28 04:20:12.730 UTC
Local LDP Identifier: 2.2.2.2:0
Discovery Sources:Discovery Sources:の下には何も並びません。CE1からCE2への疎通も落ちます(0%)。PE1からP1への経路自体が無くなるためです。
セッション確立の全過程
2本ともno shutdownで戻すと、TCPの3ウェイハンドシェイクから始まる確立の全過程が1本のキャプチャーに収まります。
$ tshark -r - -Y 'tcp.port==646' -T fields -e frame.number -e frame.time_relative -e ip.src -e _ws.col.info \
< mpls-ldp-step3-link1.pcap
34 13.735328000 3.3.3.3 48796 → 646 [SYN] Seq=0 Win=16384 Len=0 MSS=1240 WS=1
35 13.738370000 2.2.2.2 646 → 48796 [SYN, ACK] Seq=0 Ack=1 Win=16384 Len=0 MSS=1240 WS=1
36 13.741024000 3.3.3.3 48796 → 646 [ACK] Seq=1 Ack=1 Win=16384 Len=0
37 13.741743000 3.3.3.3 Initialization Message
38 13.799841000 2.2.2.2 Initialization Message Keep Alive Message
39 13.803906000 3.3.3.3 Keep Alive Message
40 13.807741000 2.2.2.2 Address Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message
41 13.809839000 3.3.3.3 Address Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message Label Mapping Message
42 14.012545000 2.2.2.2 646 → 48796 [ACK] Seq=424 Ack=406 Win=15979 Len=0SYN → SYN,ACK → ACK のあとにInitializationが両方向に流れ、KeepAliveで確認し、AddressとLabel Mappingが続きます。確立からラベル配布までが0.08秒です。
No.37がP1から送られたInitializationです。LDP識別子とセッションのパラメータが入っています。
Internet Protocol Version 4, Src: 3.3.3.3, Dst: 2.2.2.2
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0xc0 (DSCP: CS6, ECN: Not-ECT)
1100 00.. = Differentiated Services Codepoint: Class Selector 6 (48)
.... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
Total Length: 112
Identification: 0x9bf5 (39925)
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: 255
Protocol: TCP (6)
Header Checksum: 0x14c9 [validation disabled]
[Header checksum status: Unverified]
Source Address: 3.3.3.3
Destination Address: 2.2.2.2
[Stream index: 5]
Transmission Control Protocol, Src Port: 48796, Dst Port: 646, Seq: 1, Ack: 1, Len: 72
Source Port: 48796
Destination Port: 646
[Stream index: 0]
[Stream Packet Number: 4]
[Conversation completeness: Incomplete, ESTABLISHED (7)]
..0. .... = RST: Absent
...0 .... = FIN: Absent
.... 0... = Data: Absent
.... .1.. = ACK: Present
.... ..1. = SYN-ACK: Present
.... ...1 = SYN: Present
[Completeness Flags: ···ASS]
[TCP Segment Len: 72]
Sequence Number: 1 (relative sequence number)
Sequence Number (raw): 3004366313
[Next Sequence Number: 73 (relative sequence number)]
Acknowledgment Number: 1 (relative ack number)
Acknowledgment number (raw): 1904021865
0101 .... = Header Length: 20 bytes (5)
Flags: 0x018 (PSH, ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Accurate ECN: Not set
.... 0... .... = Congestion Window Reduced: Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Set
.... .... 1... = Push: Set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
[TCP Flags: ·······AP···]
Window: 16384
[Calculated window size: 16384]
[Window size scaling factor: 1]
Checksum: 0x8456 [unverified]
[Checksum Status: Unverified]
Urgent Pointer: 0
[Timestamps]
[Time since first frame in this TCP stream: 6.415000 milliseconds]
[Time since previous frame in this TCP stream: 719.000 microseconds]
[SEQ/ACK analysis]
[iRTT: 5.696000 milliseconds]
[Bytes in flight: 72]
[Bytes sent since last PSH flag: 72]
[Client Contiguous Streams: 1]
[Server Contiguous Streams: 1]
TCP payload (72 bytes)
Label Distribution Protocol
Version: 1
PDU Length: 68
LSR ID: 3.3.3.3
Label Space ID: 0
Initialization Message
0... .... = U bit: Unknown bit not set
Message Type: Initialization Message (0x200)
Message Length: 58
Message ID: 0x00000056
Common Session Parameters
00.. .... = TLV Unknown bits: Known TLV, do not Forward (0x0)
TLV Type: Common Session Parameters (0x500)
TLV Length: 14
Parameters
Session Protocol Version: 1
Session KeepAlive Time: 180
0... .... = Session Label Advertisement Discipline: Downstream Unsolicited proposed
.0.. .... = Session Loop Detection: Loop Detection Disabled
Session Path Vector Limit: 0
Session Max PDU Length: 0Session KeepAlive Time: 180が提示したホールドタイムです。RFC 5036が定めているのは両者が出した値の小さいほうを採用するところまでで、送信間隔は実装に委ねられています。IOS XRは採用した値の3分の1、ここでは60秒ごとにKeepAliveを送ります。Session Max PDU Length: 0はPDUの最大長の提案で、255以下は既定の4096オクテットを意味します(RFC 5036の3.5.3節)。
No.40は、PE1が送ったAddressとLabel Mapping 11個が1つのTCPセグメントに入ったものです。ldp.msg.typeにメッセージのタイプ値が並びます(0x300 = Address、0x400 = Label Mapping)。
$ tshark -r - -Y 'frame.number==40' -T fields -e frame.number -e frame.len -e ldp.msg.type -e ldp.msg.len \
< mpls-ldp-step3-link1.pcap
40 396 0x0300,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400,0x0400 26,24,23,23,23,24,24,24,24,23,23,23認証が合わないとTCPの段階で落ちる
PE1にだけLDPの認証(TCP MD5)を設定します。
RP/0/RP0/CPU0:PE1#show configuration commit changes last 1
Mon Sep 28 04:31:10.841 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
mpls ldp
neighbor
3.3.3.3:0 password encrypted 132E36283E202B0D
!
!
endHelloは認証の対象ではないのでxmit/recvのままで、相手のLDP識別子も見えています。
RP/0/RP0/CPU0:PE1#show mpls ldp discovery
Mon Sep 28 04:37:53.140 UTC
Local LDP Identifier: 2.2.2.2:0
Discovery Sources:
Interfaces:
GigabitEthernet0/0/0/1 : xmit/recv
VRF: 'default' (0x60000000)
LDP Id: 3.3.3.3:0, Transport address: 3.3.3.3
Hold time: 15 sec (local:15 sec, peer:15 sec)
Established: Sep 28 04:23:56.820 (00:13:56 ago)
GigabitEthernet0/0/0/2 : xmit/recv
VRF: 'default' (0x60000000)
LDP Id: 3.3.3.3:0, Transport address: 3.3.3.3
Hold time: 15 sec (local:15 sec, peer:15 sec)
Established: Sep 28 04:23:56.816 (00:13:56 ago)それでもネイバーは0件です。
RP/0/RP0/CPU0:PE1#show mpls ldp neighbor brief
Mon Sep 28 04:37:53.440 UTC理由はsyslogに出ます。TCPがMD5署名を検証して弾いています。
RP/0/RP0/CPU0:Sep 28 04:31:10.507 UTC: config[67965]: %MGBL-SYS-5-CONFIG_I : Configured from console by cisco on vty0 (10.20.1.1)
RP/0/RP0/CPU0:Sep 28 04:31:11.622 UTC: tcp[134]: %IP-TCP-3-BADAUTH : Invalid MD5 digest from 3.3.3.3:64996 to 2.2.2.2:646 for vrf:default (0x60000000)キャプチャーにはSYNの再送だけが並びます。LDPのメッセージは1つも流れません。
$ tshark -r - -Y 'tcp.port==646 && tcp.flags.syn==1' -T fields -e frame.number -e frame.time_relative -e _ws.col.info \
< mpls-ldp-step4-link1.pcap
143 9.904506000 64996 → 646 [SYN] Seq=0 Win=16384 Len=0 MSS=1240 WS=1
147 11.904957000 [TCP Retransmission] 64996 → 646 [SYN] Seq=0 Win=16384 Len=0 MSS=1240 WS=1
155 15.905741000 [TCP Retransmission] 64996 → 646 [SYN] Seq=0 Win=16384 Len=0 MSS=1240 WS=1
169 23.906356000 [TCP Retransmission] 64996 → 646 [SYN] Seq=0 Win=16384 Len=0 MSS=1240 WS=1このときCE1からCE2への疎通も落ちます。リンクもOSPFも正常なままですが、ラベルが無くなるとコアのP1 / P2 / P3は転送先を決められません(BGPを持たないため、顧客のプレフィックスをIPとして引けない)。LDPが止まると制御だけでなくデータも止まります。認証の設定そのものはLDPのセッション認証(TCP MD5)で解説しています。
観測したメッセージ
この検証で観測できたのは8種類で、タイプ値はRFC 5036の定義と一致しました。
| メッセージ | Type | 観測した場面 |
|---|---|---|
| Notification | 0x0001 | セッションの終了(STEP 2 / 4) |
| Hello | 0x0100 | 全STEP(UDP 646、5秒ごと) |
| Initialization | 0x0200 | 確立(STEP 3) |
| KeepAlive | 0x0201 | 全STEP(60秒ごと) |
| Address | 0x0300 | 確立の直後(STEP 3) |
| Address Withdraw | 0x0301 | リンク断(STEP 1) |
| Label Mapping | 0x0400 | 確立の直後と経路の変化(STEP 1 / 3) |
| Label Withdraw | 0x0402 | リンク断(STEP 1) |
| Label Release | 0x0403 | リンク断で受け取った取り消しへの応答(STEP 1) |
Downstream-Unsolicitedで動かしているため、Label Request(0x0401)とLabel Abort Request(0x0404)は流れません。
リンクごとのトラフィックと疎通
STEPごとに、2本のリンクを流れたHello(UDP 646)とTCP 646のパケット数、CE1からCE2への疎通を並べます。
| STEP | 1本目 Hello | 1本目 TCP 646 | 2本目 Hello | 2本目 TCP 646 | CE1 → CE2 |
|---|---|---|---|---|---|
| 0 | 119 | 20 | 118 | 0 | 100%(50/50) |
| 1 | 6 | 3 | 182 | 42 | 100%(50/50) |
| 2 | 0 | 0 | 6 | 4 | 0%(0/50) |
| 3 | 190 | 39 | 191 | 0 | 100%(50/50) |
| 4 | 265 | 77 | 267 | 0 | 0%(0/50) |
| 5 | 189 | 40 | 188 | 0 | 100%(50/50) |
| Helloは常に両方のリンクに流れ、TCPは1本だけに流れます。 STEP 1で1本目を落とすとTCPが2本目へ移り、STEP 3で戻すと経路が1本目に戻るのでTCPも1本目へ戻ります。STEP 4はSYNの再送だけが並んでいる状態です。 |
切り替えの間に落ちたパケット
上の疎通は、設定を変えて収束したあとに測ったものです。切り替えの最中に何発落ちたかは、設定変更の前に流し始めて変更をまたいだpingで測っています(count 150 interval 100 timeout 1)。
| STEP | 操作 | 切り替えをまたいだping |
|---|---|---|
| 1 | 1本目(PE1 Gi0/0/0/1 - P1 Gi0/0/0/0)を両端shutdown | 149/150(ロス1発) |
| 2 | 2本目(PE1 Gi0/0/0/2 - P1 Gi0/0/0/2)も両端shutdown | 60/150(ロス90発) |
| 3 | 2本ともno shutdown | 127/150(ロス23発) |
| 4 | PE1にだけLDPの認証を設定 | 62/150(ロス88発) |
| 5 | 認証を削除(最終状態) | 133/150(ロス17発) |
| 1本目を落としたSTEP 1は1発だけです。 セッションが切れず、転送が2本目へ移っただけなので、断はpingの粒度(100ミリ秒)より短いということしか言えません。2本とも落としたSTEP 2は90発で、こちらはLSPそのものが無い時間の長さです。片側だけ認証を入れたSTEP 4も88発で、セッションが張れない状態がそのまま疎通に出ています。 |
RP/0/RP0/CPU0:CE1#ping 192.168.2.1 source 192.168.1.1 count 50 timeout 1
Mon Sep 28 01:40:56.188 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 = 16/20/46 msRP/0/RP0/CPU0:CE1#traceroute 192.168.2.1 source 192.168.1.1 timeout 1 probe 2 maxttl 7
Mon Sep 28 01:40:58.079 UTC
Type escape sequence to abort.
Tracing the route to 192.168.2.1
1 10.1.2.2 5 msec 4 msec
2 10.2.3.3 [MPLS: Label 24005 Exp 0] 16 msec 14 msec
3 10.3.4.4 [MPLS: Label 24006 Exp 0] 14 msec 15 msec
4 10.4.5.5 [MPLS: Label 24006 Exp 0] 16 msec 16 msec
5 10.5.6.6 17 msec 14 msec
6 10.6.7.7 17 msec *検証Configおよびshow結果
各STEPで7台すべてから、次の種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態はSTEP 5のもの)。各STEPは「カウンタのクリア → ping → show」の順に採っています。
| ファイル | 内容 |
|---|---|
..._clear.txt | そのSTEPの最初にクリアしたカウンタ(clear counters interfaceとclear mpls forwarding counters) |
..._ping.txt | ping(50発)とtraceroute。CE1 - CE2とPE1 - PE2(Loopback0間、コアのLSP) |
..._show.txt | show version / show interface description / show route / OSPF と、LDPの一式(parameters / summary / discovery / neighbor / bindings / forwarding / statistics msg-counters / capabilities)、show tcp brief、MPLS転送、PEはBGP |
..._log.txt | そのSTEPの範囲だけに絞ったshow logging |
..._run.txt | そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
..._trace.txt | コア5台のみ。show mpls ldp trace peer / discovery / bindingとshow mpls lsd trace |
..._commit.cfg | そのSTEPで実際にcommitされた設定(変更したルータのみ) |
STEP 0:初期状態
| ルータ | 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 | — | — | — |
STEP 1:1本目(PE1 Gi0/0/0/1 - P1 Gi0/0/0/0)を両端shutdown
| ルータ | show出力 | ping | clear | syslog | running-config | trace | 投入した設定 | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| CE1 | show | ping | clear | log | run | — | — | outage |
| PE1 | show | ping | clear | log | run | trace | cfg | — |
| P1 | show | — | clear | log | run | trace | cfg | — |
| 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 | — | — | — |
STEP 2:2本目(PE1 Gi0/0/0/2 - P1 Gi0/0/0/2)も両端shutdown
| ルータ | show出力 | ping | clear | syslog | running-config | trace | 投入した設定 | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| CE1 | show | ping | clear | log | run | — | — | outage |
| PE1 | show | ping | clear | log | run | trace | cfg | — |
| P1 | show | — | clear | log | run | trace | cfg | — |
| 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 | — | — | — |
STEP 3:2本ともno shutdown
| ルータ | show出力 | ping | clear | syslog | running-config | trace | 投入した設定 | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| CE1 | show | ping | clear | log | run | — | — | outage |
| PE1 | show | ping | clear | log | run | trace | cfg | — |
| P1 | show | — | clear | log | run | trace | cfg | — |
| 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 | — | — | — |
STEP 4:PE1にだけLDPの認証を設定
| ルータ | show出力 | ping | clear | syslog | running-config | trace | 投入した設定 | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| CE1 | show | ping | clear | log | run | — | — | outage |
| PE1 | show | ping | clear | log | run | trace | cfg | — |
| 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 | — | — | — |
STEP 5:認証を削除(最終状態)
| ルータ | show出力 | ping | clear | syslog | running-config | trace | 投入した設定 | 断の測定 |
|---|---|---|---|---|---|---|---|---|
| CE1 | show | ping | clear | log | run | — | — | outage |
| PE1 | show | ping | clear | log | run | trace | cfg | — |
| 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 | — | — | — |
パケットキャプチャーはSTEPごとに、PE1 - P1の2本のリンクで取得しています。
| STEP | 1本目(10.2.3.0/24) | 2本目(10.2.13.0/24) |
|---|---|---|
| 0 | pcap | pcap |
| 1 | pcap | pcap |
| 2 | pcap | pcap |
| 3 | pcap | pcap |
| 4 | pcap | pcap |
| 5 | pcap | pcap |
参考
| RFC | タイトル | 概要 |
|---|---|---|
| RFC 5036 | LDP Specification | Discovery(2.4節)、セッション確立の状態遷移(2.5.4節)、TCP / UDPとも646番(3.10.1節)、メッセージのタイプ値。 |
| RFC 3031 | Multiprotocol Label Switching Architecture | ラベル配布プロトコルの位置づけ。 |
書籍: Luc De Ghein『MPLS Fundamentals』(Cisco Press, 2006)Chapter 4
関連記事
- 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)