LDP
本页介绍 MikroTik RouterOS 的 Label Distribution Protocol(LDP),用于建立 IPv4/IPv6 标签交换路径(LSP),并详细说明环回 IP 地址和 IP 连通性等前置条件,以及一个包含四台路由器的示例配置。
LDP
MikroTik RouterOS 为 IPv4 和 IPv6 地址族实现了 Label Distribution Protocol(RFC 3036、RFC 5036 和 RFC 7552)。LDP 是一种协议,它执行一组过程和消息交换,使标签交换路由器(LSR)能够通过将网络层路由信息直接映射到数据链路层交换路径,在网络中建立标签交换路径(LSP)。
MPLS 前置条件
"Loopback" IP 地址
尽管这不是严格要求,但建议为参与 MPLS 网络的路由器配置 "loopback" IP 地址(不附加到任何真实网络接口),供 LDP 用来建立会话。
这有两个目的:
- 由于任意 2 台路由器之间只有一个 LDP 会话,无论它们之间有多少条链路相连,环回 IP 地址都能确保 LDP 会话不受接口状态或地址变化的影响。
- 使用环回地址作为 LDP 传输地址,可以确保在数据包上附加多个标签时(如 VPLS 的情况)具有正确的倒数第二跳弹出行为。
在 RouterOS 中,可以通过创建一个没有任何端口的虚拟 bridge 接口并向其添加地址来配置 "loopback" IP 地址。例如:
/interface/bridge/add name=lo
/ip/address/add address=10.255.255.1/32 interface=lo
IP 连通性
由于 LDP 为活动路由分发标签,因此基本要求是正确配置的 IP 路由。默认情况下,LDP 为活动的 IGP 路由(即直连、静态以及路由协议学习到的路由,BGP 除外)分发标签。
有关如何正确设置 IGP 的说明,请参阅相应的文档章节:
LDP 支持 ECMP 路由。
在继续 LDP 配置之前,你应该能够从网络的任何位置访问任意环回地址。可以使用从一个环回地址到另一个环回地址的 ping 工具来验证连通性。
示例配置
假设我们已经有四台设置好的路由器,且 IP 连通性正常。
graph LR
R1["R1(lo:111.111.111.1)"]
R2["R2(lo:111.111.111.2)"]
R3["R3(lo:111.111.111.3)"]
R4["R4(lo:111.111.111.4)"]
R1 ---|"111.11.0.0/24"| R2
R2 ---|"111.12.0.0/24"| R3
R3 ---|"111.13.0.0/24"| R4
IP 可达性
这里不深入探讨路由设置,以下是 IP 和 OSPF 配置的快速导出:
#R1
/interface/bridge
add name=loopback
/ip/address
add address=111.11.0.1/24 interface=ether2
add address=111.111.111.1 interface=loopback
/routing/ospf/instance
add name=default_ip4 router-id=111.111.111.1
/routing/ospf/area
add instance=default_ip4 name=backbone_ip4
/routing/ospf/interface-template
add area=backbone_ip4 dead-interval=10s hello-interval=1s networks=111.111.111.1
add area=backbone_ip4 dead-interval=10s hello-interval=1s networks=111.11.0.0/24
#R2
/interface/bridge
add name=loopback
/ip/address
add address=111.11.0.2/24 interface=ether2
add address=111.12.0.1/24 interface=ether3
add address=111.111.111.2 interface=loopback
/routing/ospf/instance
add name=default_ip4 router-id=111.111.111.2
/routing/ospf/area
add instance=default_ip4 name=backbone_ip4
/routing/ospf/interface-template
add area=backbone_ip4 dead-interval=10s hello-interval=1s networks=111.111.111.2
add area=backbone_ip4 dead-interval=10s hello-interval=1s networks=111.11.0.0/24
add area=backbone_ip4 dead-interval=10s hello-interval=1s networks=111.12.0.0/24
#R3
/interface/bridge
add name=loopback
/ip/address
add address=111.12.0.2/24 interface=ether2
add address=111.13.0.1/24 interface=ether3
add address=111.111.111.3 interface=loopback
/routing/ospf/instance
add name=default_ip4 router-id=111.111.111.3
/routing/ospf/area
add instance=default_ip4 name=backbone_ip4
/routing/ospf/interface-template
add area=backbone_ip4 dead-interval=10s hello-interval=1s networks=111.111.111.3
add area=backbone_ip4 dead-interval=10s hello-interval=1s networks=111.12.0.0/24
add area=backbone_ip4 dead-interval=10s hello-interval=1s networks=111.13.0.0/24
#R4
/interface/bridge
add name=loopback
/ip/address
add address=111.13.0.2/24 interface=ether2
add address=111.111.111.4 interface=loopback
/routing/ospf/instance
add name=default_ip4 router-id=111.111.111.4
/routing/ospf/area
add instance=default_ip4 name=backbone_ip4
/routing/ospf/interface-template
add area=backbone_ip4 dead-interval=10s hello-interval=1s networks=111.111.111.4
add area=backbone_ip4 dead-interval=10s hello-interval=1s networks=111.13.0.0/24
验证 IP 连通性和路由正常工作
[admin@R4] /ip/address> /tool/traceroute 111.111.111.1 src-address=111.111.111.4
Columns: ADDRESS, LOSS, SENT, LAST, AVG, BEST, WORST, STD-DEV
# ADDRESS LOSS SENT LAST AVG BEST WORST STD-DEV
1 111.13.0.1 0% 4 0.6ms 0.6 0.6 0.6 0
2 111.12.0.1 0% 4 0.5ms 0.6 0.5 0.6 0.1
3 111.111.111.1 0% 4 0.6ms 0.6 0.6 0.6 0
LDP 配置
为了开始分发标签,LDP 在连接其他 LDP 路由器的接口上启用,而在连接客户网络的接口上不启用。
在 R1 上它看起来像这样:
/mpls/ldp
add afi=ip lsr-id=111.111.111.1 transport-addresses=111.111.111.1
/mpls/ldp/interface
add interface=ether2
信息
注意传输地址被设置为 111.111.111.1。这使得路由器使用该地址发起 LDP 会话连接,并将该地址作为传输地址通告给 LDP 邻居。 其他路由器的设置类似。
R2:
/mpls/ldp
add afi=ip lsr-id=111.111.111.2 transport-addresses=111.111.111.2
/mpls/ldp/interface
add interface=ether2
add interface=ether3
在 R3 上:
/mpls/ldp
add afi=ip lsr-id=111.111.111.3 transport-addresses=111.111.111.3
/mpls/ldp/interface
add interface=ether2
add interface=ether3
在 R4 上:
/mpls/ldp
add afi=ip lsr-id=111.111.111.4 transport-addresses=111.111.111.4
/mpls/ldp/interface
add interface=ether2
LDP 会话建立后,R2 应该有两个 LDP 邻居:
[admin@R2] /mpls/ldp/neighbor> print
Flags: D, I - INACTIVE; O, T - THROTTLED; p - PASSIVE
Columns: TRANSPORT, LOCAL-TRANSPORT, PEER, ADDRESSES
# TRANSPORT LOCAL-TRANSPORT PEER ADDRESSES
0 DO 111.111.111.1 111.111.111.2 111.111.111.1:0 111.11.0.1
111.111.111.1
1 DOp 111.111.111.3 111.111.111.2 111.111.111.3:0 111.12.0.2
111.13.0.1
111.111.111.3
本地映射表显示哪个标签分配给哪条路由,以及路由器向哪些 peer 分发了标签。
[admin@R2] /mpls/ldp/local-mapping> print
Flags: I - INACTIVE; D - DYNAMIC; E - EGRESS; G - GATEWAY; L - LOCAL
Columns: VRF, DST-ADDRESS, LABEL, PEERS
# VRF DST-ADDRESS LABEL PEERS
0 D G main 10.0.0.0/8 16 111.111.111.1:0
111.111.111.3:0
1 IDE L main 10.155.130.0/25 impl-null 111.111.111.1:0
111.111.111.3:0
2 IDE L main 111.11.0.0/24 impl-null 111.111.111.1:0
111.111.111.3:0
3 IDE L main 111.12.0.0/24 impl-null 111.111.111.1:0
111.111.111.3:0
4 IDE L main 111.111.111.2 impl-null 111.111.111.1:0
111.111.111.3:0
5 D G main 111.111.111.1 17 111.111.111.1:0
111.111.111.3:0
6 D G main 111.111.111.3 18 111.111.111.1:0
111.111.111.3:0
7 D G main 111.111.111.4 19 111.111.111.1:0
111.111.111.3:0
8 D G main 111.13.0.0/24 20 111.111.111.1:0
111.111.111.3:0
另一方面,远程映射表显示相邻 LDP 路由器为路由分配并通告给本路由器的标签:
[admin@R2] /mpls/ldp/remote-mapping> print
Flags: I - INACTIVE; D - DYNAMIC
Columns: VRF, DST-ADDRESS, NEXTHOP, LABEL, PEER
# VRF DST-ADDRESS NEXTHOP LABEL PEER
0 ID main 10.0.0.0/8 16 111.111.111.1:0
1 ID main 10.155.130.0/25 impl-null 111.111.111.1:0
2 ID main 111.11.0.0/24 impl-null 111.111.111.1:0
3 ID main 111.12.0.0/24 17 111.111.111.1:0
4 D main 111.111.111.1 111.11.0.1 impl-null 111.111.111.1:0
5 ID main 111.111.111.2 19 111.111.111.1:0
6 ID main 111.111.111.3 20 111.111.111.1:0
7 ID main 111.111.111.4 21 111.111.111.1:0
8 ID main 111.13.0.0/24 18 111.111.111.1:0
9 ID main 0.0.0.0/0 impl-null 111.111.111.3:0
10 ID main 111.111.111.2 16 111.111.111.3:0
11 ID main 111.111.111.1 18 111.111.111.3:0
12 D main 111.111.111.3 111.12.0.2 impl-null 111.111.111.3:0
13 D main 111.111.111.4 111.12.0.2 19 111.111.111.3:0
14 ID main 10.155.130.0/25 impl-null 111.111.111.3:0
15 ID main 111.11.0.0/24 17 111.111.111.3:0
16 ID main 111.12.0.0/24 impl-null 111.111.111.3:0
17 D main 111.13.0.0/24 111.12.0.2 impl-null 111.111.111.3:0
我们可以观察到,路由器已从它的两个邻居 R1 和 R3 收到了所有路由的标签绑定。
远程映射表只会为具有直接下一跳的目的地址保留活动映射,例如,让我们仔细看看 111.111.111.4 的映射。路由表表明网络 111.111.111.4 可通过 111.12.0.2(R3)到达:
[admin@R2] /ip/route> print where dst-address=111.111.111.4
Flags: D - DYNAMIC; A - ACTIVE; o, y - COPY
Columns: DST-ADDRESS, GATEWAY, DISTANCE
DST-ADDRESS GATEWAY DISTANCE
DAo 111.111.111.4/32 111.12.0.2%ether3 110
如果我们再次查看远程映射表,唯一的活动映射是从 R3 收到的、分配标签为 19 的那个。这意味着当 R2 将流量路由到该网络时,会压入标签 19。
17 D main 111.111.111.4 111.12.0.2 19 111.111.111.3:0
标签交换规则可以在转发表中看到:
[admin@R2] /mpls/forwarding-table> print
Flags: L, V - VPLS
Columns: LABEL, VRF, PREFIX, NEXTHOPS
# LABEL VRF PREFIX NEXTHOPS
0 L 16 main 10.0.0.0/8 { nh=10.155.130.1; interface=ether1 }
1 L 18 main 111.111.111.3 { label=impl-null; nh=111.12.0.2; interface=ether3 }
2 L 19 main 111.111.111.4 { label=19; nh=111.12.0.2; interface=ether3 }
3 L 20 main 111.13.0.0/24 { label=impl-null; nh=111.12.0.2; interface=ether3 }
4 L 17 main 111.111.111.1 { label=impl-null; nh=111.11.0.1; interface=ether2 }
如果我们看一下第 2 条规则,该规则表明当 R2 收到带有标签 19 的数据包时,它会将标签改为新的标签 19(由 R3 分配)。
从这个示例可以看出,路径上的标签不必是唯一的。
现在我们看一下 R3 的转发表:
[admin@R3] /mpls/forwarding-table> print
Flags: L, V - VPLS
Columns: LABEL, VRF, PREFIX, NEXTHOPS
# LA VRF PREFIX NEXTHOPS
0 L 19 main 111.111.111.4 { label=impl-null; nh=111.13.0.2; interface=ether3 }
1 L 17 main 111.11.0.0/24 { label=impl-null; nh=111.12.0.1; interface=ether2 }
2 L 16 main 111.111.111.2 { label=impl-null; nh=111.12.0.1; interface=ether2 }
3 L 18 main 111.111.111.1 { label=17; nh=111.12.0.1; interface=ether2 }
第 0 条规则显示 out 标签为 "impl-null"。原因是 R3 是到达 111.111.111.4 之前的最后一跳,不需要交换为任何真实标签。众所周知,R4 是 111.111.111.4 网络的出口点(该路由器是直连网络的出口点,因为流量的下一跳不是 MPLS 路由器),因此它为这条路由通告 "implicit null" 标签。这告诉 R3 将发往目的地址 111.111.111.4/32 的流量不带标签地转发给 R4,这正是 R3 转发表条目所表达的内容。
警告
当标签不交换为任何真实标签时,该操作称为 Penultimate hop popping(倒数第二跳弹出)。它确保路由器在预先知道必须对数据包进行路由时,不必进行不必要的标签查找。
在 MPLS 网络中使用 traceroute
RFC4950 为 ICMP 协议引入了针对 MPLS 的扩展。基本思想是,某些 ICMP 消息可以携带 MPLS "label stack object"(当数据包引发特定 ICMP 消息时其上的标签列表)。对 MPLS 重要的 ICMP 消息是 Time Exceeded 和 Fragmentation Needed。
MPLS 标签不仅承载标签值,还承载 TTL 字段。当为 IP 数据包压入标签时,MPLS TTL 被设置为 IP 头中的值。当最后一个标签从 IP 数据包中移除时,IP TTL 被设置为 MPLS TTL 中的值。因此,可以通过支持 MPLS 扩展的 traceroute 工具来诊断 MPLS 交换网络。
例如,从 R1 到 R4 的 traceroute 看起来像这样:
[admin@R1] /mpls/ldp/neighbor> /tool/traceroute 111.111.111.4 src-address=111.111.111.1
Columns: ADDRESS, LOSS, SENT, LAST, AVG, BEST, WORST, STD-DEV, STATUS
# ADDRESS LOSS SENT LAST AVG BEST WORST STD-DEV STATUS
1 111.11.0.2 0% 2 0.7ms 0.7 0.7 0.7 0 <MPLS:L=19,E=0>
2 111.12.0.2 0% 2 0.4ms 0.4 0.4 0.4 0 <MPLS:L=19,E=0>
3 111.111.111.4 0% 2 0.5ms 0.5 0.5 0.5 0
Traceroute 结果显示当数据包产生 ICMP Time Exceeded 时其上的 MPLS 标签。以上内容意味着,当 R3 收到 MPLS TTL 为 1 的数据包时,其上带有标签 19。这与 R3 为 111.111.111.4 通告的标签一致。同样,R2 在下一次 traceroute 迭代中观察到数据包上的标签 19——如前所述,R2 将标签 19 交换为标签 19。R4 收到的是不带标签的数据包——如前所述,R3 执行了倒数第二跳弹出。
在 MPLS 网络中使用 traceroute 的缺点
标签交换 ICMP 错误
在 MPLS 网络中使用 traceroute 的缺点之一是 MPLS 处理所产生的 ICMP 错误的方式。在 IP 网络中,ICMP 错误只是被路由回导致该错误的数据包源地址。在 MPLS 网络中,产生错误消息的路由器甚至可能没有到达 IP 数据包源地址的路由(例如,在非对称标签交换路径或某种 MPLS 隧道的情况下,例如用于传输 MPLS VPN 流量)。
因此,所产生的 ICMP 错误不会被路由到导致该错误的数据包源地址,而是沿标签交换路径继续交换,假设当标签交换路径端点收到 ICMP 错误时,它会知道如何将其正确路由回源地址。
这导致在 MPLS 网络中无法像在 IP 网络中那样使用 traceroute——即确定网络中的故障点。如果标签交换路径在中间任何位置中断,都不会有 ICMP 回复返回,因为它们无法到达标签交换路径的远端端点。
倒数第二跳弹出与 traceroute 源地址
要理解并避免倒数第二跳弹出给 traceroute 带来的问题,必须透彻理解倒数第二跳的行为和路由。
在示例配置中,从 R5 到 R1 的常规 traceroute 将产生以下结果:
[admin@R5] > /tool/traceroute 9.9.9.1
ADDRESS STATUS
1 0.0.0.0 timeout timeout timeout
2 2.2.2.2 37ms 4ms 4ms
mpls-label=17
3 9.9.9.1 4ms 2ms 11ms
与之相比:
[admin@R5] > /tool/traceroute 9.9.9.1 src-address=9.9.9.5
ADDRESS STATUS
1 4.4.4.3 15ms 5ms 5ms
mpls-label=17
2 2.2.2.2 5ms 3ms 6ms
mpls-label=17
3 9.9.9.1 6ms 3ms 3ms
第一个 traceroute 没有得到 R3 响应的原因是,默认情况下 R5 上的 traceroute 使用源地址 4.4.4.5 进行探测,因为它是到达 9.9.9.1/32 下一跳所经路由的首选源地址:
[admin@R5] > /ip/route/print
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC G GATEWAY DISTANCE INTERFACE
...
3 ADC 4.4.4.0/24 4.4.4.5 0 ether1
...
5 ADo 9.9.9.1/32 r 4.4.4.3 110 ether1
...
当第一个 traceroute 探测被发送时(源:4.4.4.5,目的:9.9.9.1),R3 会丢弃它并产生一条 ICMP 错误消息(源 4.4.4.3,目的 4.4.4.5),该消息一路交换到 R1。然后 R1 发回一条 ICMP 错误——它沿标签交换路径交换到 4.4.4.5。
R2 是网络 4.4.4.0/24 的倒数第二跳弹出路由器,因为 4.4.4.0/24 直接连接到 R3。因此 R2 移除最后一个标签,并将 ICMP 错误不带标签地发送给 R3:
[admin@R2] > /mpls/forwarding-table/print
# IN-LABEL OUT-LABELS DESTINATION INTERFACE NEXTHOP
...
3 19 4.4.4.0/24 ether2 2.2.2.3
...
R3 丢弃收到的 IP 数据包,因为它收到一个以自身地址作为源地址的数据包。后续探测产生的 ICMP 错误能正确返回,因为 R3 收到的是源地址为 2.2.2.2 和 9.9.9.1 的不带标签数据包,这些对路由器来说是可接受的。
命令:
[admin@R5] > /tool/traceroute 9.9.9.1 src-address=9.9.9.5
...
会产生预期结果,因为 traceroute 探测的源地址是 9.9.9.5。当 ICMP 错误从 R1 返回到 R5 时,9.9.9.5/32 网络的倒数第二跳弹出发生在 R3,因此它永远不会去路由一个以自身地址作为源地址的数据包。
优化标签分发
标签绑定过滤
在实施给定示例配置的过程中,可以清楚地看到并非所有标签绑定都是必要的。例如,R1 与 R3 或 R2 与 R4 之间无需交换 IP 路由标签绑定,因为它们不可能被用到。此外,如果给定的网络核心只为上述客户以太网段提供连通性,那么为连接路由器彼此的网段分发标签就没有实际用途。唯一重要的路由是到端点或所连接客户网络的 /32 路由。
标签绑定过滤可用于仅分发指定的标签集合,以减少资源占用和网络负载。
标签绑定过滤器有 2 种类型:
- 哪些标签绑定应通告给 LDP 邻居,在
/mpls/ldp/advertise-filter菜单中配置。 - 哪些标签绑定应从 LDP 邻居接受,在
/mpls/ldp/accept-filter菜单中配置。
过滤器按有序列表组织,指定必须包含被测试前缀和邻居(或通配符)的前缀。
在给定的示例配置中,可以配置所有路由器,使其只为能够到达隧道端点的路由通告标签。为此,需要在所有路由器上配置 2 个通告过滤器:
/mpls/ldp/advertise-filter/add prefix=111.111.111.0/24 advertise=yes
/mpls/ldp/advertise-filter/add prefix=0.0.0.0/0 advertise=no
该过滤器使路由器只通告 111.111.111.0/24 前缀所包含路由的绑定,该前缀涵盖环回地址(111.111.111.1/32、111.111.111.2/32 等)。第二条规则是必要的,因为当没有规则匹配时,默认过滤结果是允许相关操作。
在给定的配置中,无需设置 accept 过滤器,因为根据上述 2 条规则引入的约定,任何 LDP 路由器都不会分发不必要的绑定。
请注意,过滤器更改不会影响现有映射,因此要让过滤器生效,需要重置邻居之间的连接,方法是移除 LDP 邻居表中的邻居,或重启 LDP 实例。
因此,例如在 R2 上,我们得到:
[admin@R2] /mpls/ldp/remote-mapping> print
Flags: I - INACTIVE; D - DYNAMIC
Columns: VRF, DST-ADDRESS, NEXTHOP, LABEL, PEER
# VRF DST-ADDRESS NEXTHOP LABEL PEER
0 ID main 111.111.111.2 17 111.111.111.3:0
1 ID main 111.111.111.1 16 111.111.111.3:0
2 D main 111.111.111.3 111.12.0.2 impl-null 111.111.111.3:0
3 D main 111.111.111.4 111.12.0.2 18 111.111.111.3:0
4 ID main 111.111.111.2 16 111.111.111.1:0
5 D main 111.111.111.1 111.11.0.1 impl-null 111.111.111.1:0
6 ID main 111.111.111.3 17 111.111.111.1:0
7 ID main 111.111.111.4 18 111.111.111.1:0
IPv6 和双栈链路上的 LDP
RouterOS 实现了 RFC 7552,以支持双栈链路上的 LDP。
支持的 AFI 可以按 LDP 实例选择,也可以按 LDP 接口显式配置。
/mpls/ldp
add afi=ip,ipv6 lsr-id=111.111.111.1 preferred-afi=ipv6
/mpls/ldp/interface
add interface=ether2 afi=ip
add interface=ether3 afi=ipv6
上面的示例使 LDP 实例能够使用 IPv4 和 IPv6 地址族,并通过 preferred-afi 参数将首选设置为 IPv6。另一方面,LDP 接口配置显式设置 ether2 只支持 IPv4,ether3 只支持 IPv6。
主要问题是,当混合使用不同的 AFI 时如何选择 AFI,以及如果其中一个支持的 AFI 发生抖动会怎样。
发送 hello 的逻辑如下:
- 如果接口只有一个 AFI:
- 不发送 dual-stack 元素。
- 只有当接口上存在来自相应 AFI 的 IP 地址时才发送 hello。
- 如果接口同时具有两个 AFI:
- 总是发送 dual-stack 元素,并包含来自 preferred-afi 的值。
- 如果接口上存在相应地址,则在每个 AFI 上发送 hello。
根据收到的所有 hello,peer 确定使用哪个 AFI 进行连接,以及为哪些 AFI 绑定和发送标签。为了让 LDP 能够使用特定的 AFI,必须收到该特定 AFI 的 hello。Hello 数据包包含正确的 LDP 操作所需的传输地址。通过比较收到的 AFI 地址,确定主动/被动角色。
接收和处理 hello 的逻辑如下:
- 如果 LDP 实例只有一个 AFI(意味着所有接口只能运行该特定 AFI):
- 丢弃来自不受支持的 AFI 的 hello。
- 忽略/忘记 hello 数据包中的 dual-stack 元素。
- 仅针对这一个特定 AFI 确定角色。
- 仅为这一个特定 AFI 发送标签。
- 如果 LDP 实例同时具有两个 AFI(接口可以有不同的受支持 AFI 组合):
- 丢弃来自接口上未配置为受支持的 AFI 的 hello。
- 如果接口只有一个受支持的 AFI,则对 hello 数据包忽略/忘记 dual-stack 元素(不考虑优先级)。
- 如果收到的 dual-stack 元素中的优先级与配置的
preferred-afi不匹配,则丢弃该 hello。
如果 hello 数据包发生变化,仅当标签使用的地址族改变时才终止现有会话,否则保留该会话。
仅当确定接口兼容双栈时,才会在 hello 数据包中设置 dual-stack 元素:
- 通常,这样的接口应能够接收来自两个 AFI 的 hello:
- 在继续之前,LDP 应等待来自首选 AFI 的 hello。
- 如果只从一个 AFI 收到 hello:
- 如果未收到来自首选 AFI 的 hello,则视为错误。
- 否则,等待缺失的 hello x 秒(x = 3 * hello-interval):
- 如果缺失的 hello 在时间间隔内出现,则认为该 peer 为双栈。
- 如果缺失的 hello 未出现,则认为该 peer 为单栈。
- 如果缺失的 hello 在时间间隔之后出现,则重启会话。
- dual-stack 元素表明 LDP 希望为两个 AFI 分发标签。
总之,假设 preferred-afi=ipv6,以下是 AFI 和 dual-stack 元素(ds6)的可能组合:
- ipv4 - 等待 X 秒,如果没有变化,则使用 IPv4 LDP 会话并分发 IPv4 标签。
- ipv4+ds6 - 等待 IPv6 hello,dual-stack 元素表明应该存在 IPv6。
- ipv6 - 等待 X 秒,如果没有变化,则使用 IPv6 LDP 会话并分发 IPv6 标签。
- ipv6+ds6 - 使用 IPv6 LDP 会话并分发 IPv6 标签。
- ipv4,ipv6 - 使用 IPv6 LDP 会话并分发 IPv4 和 IPv6 标签。
- ipv4,ipv6+ds6 - 使用 IPv6 LDP 会话并分发 IPv4 和 IPv6 标签。