简介
本文档介绍单向链路检测 (UDLD) 协议如何帮助防止交换网络中出现环路和流量异常。
先决条件
要求
本文档没有任何特定的要求。
使用的组件
本文档不限于特定的软件和硬件版本。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
规则
有关文档规则的详细信息,请参阅思科技术提示规则。
问题定义
生成树协议 (STP) 将冗余物理拓扑解析为无环路的树状转发拓扑。
为此,它会阻止一个或多个端口。在一个或多个端口被阻止的情况下,转发拓扑中没有环路。STP 在其运行过程中依赖于网桥协议数据单元 (BPDU) 的接收和传送。
如果在端口处于阻止状态的交换机上运行的 STP 进程未从其上游(指定)交换机接收到 BPDU,则 STP 最终会使端口的 STP 信息过期,并将其切换至转发状态。
这可能会形成 STP 环路;在 STP 环路中,数据包开始沿环路路径无限循环,并消耗越来越多的带宽和资源。这可能导致网络中断。
当端口处于正常运行状态时,交换机为何无法接收 BPDU?原因是单向链路。
发生以下情况时,链路被视为单向链路:
请考虑这种情况。箭头指示 STP BPDU 的流向。

在正常运行期间,网桥B是链路B-C上的指定端口。网桥B将BPDU向下发送到阻塞端口的C。C 在该链路上发现了来自 B 的 BPDU 时,该端口会被阻塞。
现在,请考虑如果链路 B-C 在 C 方向出现故障会发生什么情况。C 会停止接收来自 B 的流量,但 B 仍会接收来自 C 的流量。
up
C 不会接收链路 B-C 上的 BPDU,并且使最后一个 BPDU 接收的信息过期。此过程最多需要 20 秒,具体取决于 maxAge STP 计时器。
一旦该端口上的 STP 信息老化,该端口就会从 blocking state 转换成侦听状态、识别状态,并最终转换为转发 STP 状态。
这会造成环路,因为三角形A-B-C中没有阻塞的端口。数据包沿路径循环(B仍接收来自C的数据包),这会消耗额外的带宽,直到链路完全被填满。
这种情况可能会导致网络中断。单向链路可能导致的另一个问题是流量黑洞。

单向链路检测协议 (UDLD) 工作原理
UDLD 是与第 1 层 (L1) 机制一起工作以确定链路物理状态的第 2 层 (L2) 协议。
在第 1 层中,自动协商负责物理信令和故障检测。UDLD 执行自动协商无法执行的任务,如检测邻居身份和关闭误连接端口。
当同时启用自动协商和 UDLD 时,第 1 层和第 2 层检测将一起工作,以防止出现物理和逻辑单向连接以及其他协议无法正常工作的情况。
UDLD 通过在相邻设备之间交换协议数据包来工作。要使 UDLD 正常工作,链路上的两个设备都必须支持 UDLD 并在各自的端口上启用 UDLD。
为 UDLD 配置的每个交换机端口都会发送 UDLD 协议数据包,其中包含端口设备/端口 ID 以及 UDLD 在该端口上发现的邻居设备/端口 ID。
相邻端口在从另一端接收的数据包中发现自己的设备/端口 ID(回应)。如果在特定的持续时间内,该端口在传入的 UDLD 数据包中未看到其自己的设备/端口 ID,则该链路会被视为单向链路。
此回声算法允许检测以下问题:
一旦 UDLD 检测到单向链路,将禁用各自的端口,并将在控制台上输出以下信息:
UDLD-3-DISABLE: Unidirectional link detected on port 1/2. Port disabled
UDLD 关闭的端口将保持禁用状态,直到手动启用该端口,或者直到 errdisable 超时到期(如果已配置)。
UDLD 运行模式
UDLD 能够以两种模式运行:正常和主动:.
- 在正常模式下,如果确定端口的链路状态为双向,并且 UDLD 信息超时,UDLD 不会执行任何操作。UDLD 的端口状态标记为未确定。端口根据其 STP 状态运行。
- 在主动模式下,如果确定端口的链路状态为双向,并且在该端口上的链路仍处于接通状态时,UDLD 信息超时,则 UDLD 将尝试重建端口状态。如果不成功,则该端口被置于 errdisable 状态。
当运行 UDLD 的端口在保持时间内未收到来自邻居端口的 UDLD 数据包时,会发生 UDLD 信息过期。
端口的保留时间由远程端口决定,并且取决于远程端的消息间隔。消息间隔越短,保持时间越短,检测速度越快。
UDLD 的最近实施允许配置消息间隔。UDLD 信息可能会由于端口上的错误率较高(由某个物理问题或双工不匹配导致)而老化。
此类丢包并不意味着链路是单向的,并且正常模式下的 UDLD 不会禁用此类链路。
为了保证适当的检测时间,能够选择正确的消息间隔非常重要。消息间隔需要足够短,以便在形成转发环路之前检测到单向链路,但是,它不能使交换机 CPU 过载。默认消息间隔为 15 秒,这足以在默认 STP 计时器下形成转发环路之前检测到单向链路。检测时间大约等于消息间隔的三倍。
例如:Tdetection~ message_interval x3
对于默认的消息间隔 15 秒,检测时间为 45 秒。
在单向链路故障的情况下,STP 需要 Treconvergence=max_age + 2x forward_delay 才能重新收敛。使用默认定时器,需要花费 20+2x15=50 秒。
建议保持 Tdetection< Treconvergence 并选择适当的消息间隔。
在积极模式下,信息过期后,UDLD 会尝试重新建立链路状态,并每秒发送数据包,持续八秒。如果仍然没有确定链路状态,将禁用该链路。
积极模式针对以下情况增加了额外检测:
最近,为使链路两端在这些情况下都处于断开状态,光纤快速以太网硬件实施提供了远端故障指示 (FEFI) 功能。
在千兆以太网上,链路协商可提供类似的功能。铜缆端口通常不会受这类问题的影响,因为它们使用以太网链路脉冲监控链路。
需要指出的是,在这两种情况下,都不会形成转发环路,因为端口之间没有连接。但是,如果链路一端处于正常运行状态,而另一端处于断开状态,则可能发生流量黑洞。
主动 UDLD 设计为可防止出现此问题。
可用性
UDLD 可用于 Cisco IOS® 软件版本 12 及更高版本的正常模式和积极模式。
配置和监控
运行 show udld 命令以验证接口上是否已启用 UDLD:
Switch#show udld
Interface Gi1/0/1
---
Port enable administrative configuration setting: Disabled
Port enable operational state: Disabled
Current bidirectional state: Unknown
Interface Gi1/0/2
---
Port enable administrative configuration setting: Disabled
Port enable operational state: Disabled
Current bidirectional state: Unknown
Interface Gi1/0/3
---
Port enable administrative configuration setting: Disabled
Port enable operational state: Disabled
Current bidirectional state: Unknown
可以使用以下命令在接口上配置主动 udld port aggressive
UDLD:
Switch#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Switch(config)#interface gigabitEthernet1/0/1
Switch(config-if)#udld port aggressive
Switch(config-if)#end
Switch#
发出 和 命令,以验证端口上是已启用还是已禁用 UDLD,以及链路和邻居处于什么状态:show udld
show udld neighbors
Switch#show udld GigabitEthernet1/0/1
Interface Gi1/0/1
---
Port enable administrative configuration setting: Enabled / in aggressive mode
Port enable operational state: Enabled / in aggressive mode
Current bidirectional state: Bidirectional
Current operational state: Advertisement - Single neighbor detected
Message interval: 15000 ms
Time out interval: 5000 ms
Port fast-hello configuration setting: Disabled
Port fast-hello interval: 0 ms
Port fast-hello operational state: Disabled
Neighbor fast-hello configuration setting: Disabled
Neighbor fast-hello interval: Unknown
Entry 1
---
Expiration time: 31600 ms
Cache Device index: 1
Current neighbor state: Bidirectional
Device ID: 346288238580
Port ID: Gi4/0/1
Neighbor echo 1 device: 70B4F35F080
Neighbor echo 1 port: Gi1/0/1
TLV Message interval: 15 sec
No TLV fast-hello interval
TLV Time out interval: 5
TLV CDP Device name: MXC.TAC.M.02-3850-01
Switch#show udld neighbors
Port Device Name Device ID Port ID Neighbor State
---- ----------- --------- ------- --------------
Gi1/0/1 346288238580 1 Gi4/0/1 Bidirectional
Total number of bidirectional entries displayed: 1
使用 命令更改消息间隔: udld message time
Switch(config)#udld message time 10
UDLD message interval set to 10 seconds
间隔的范围为 1 到 90 秒,默认值为 15 秒。
相关信息