STP-17-对抗单向链路问题
单向链路问题是指链路上的两条传输路径中,有一条出现了问题,但并不是两条同时出现问题。这可能是因为线缆错误、切断了一条光纤线缆、拔掉了一根管线、GBIC问题,或其他问题。因为STP会监控入向BPDU,以便知道何时重新收敛网络,单向链路两端的邻接交换机可能都会成为转发状态,从而造成环路,如图所示。
上图显示了SW1和SW2之间两根线缆的光纤链路。SW2一开始为阻塞状态,但因为SW1传输路径故障,SW2无法从SW1那里收到Hello。SW2随后转为转发状态,现在所有交换机上的所有链路都是转发状态。即使SW1的传输光纤有故障,数据帧也会逆时针在网络中循环。
在Catalyst交换机上,有几种机制可以用来检测和避免由单向链路造成的问题。这些机制包括UDLD、STP环路防护、网桥保障和RSTP/MST争议机制。
单向链路检测(Unidirectional Link Detection,UDLD)是Cisco私有的二层消息协议,是用于一对设备之间的响应机制。使用UDLD消息,每台交换机作为消息的生成者,通告自己的身份和端口标识符对,以及它从相同网段上获知的邻居交换机/端口对列表。通过使用这个信息,UDLD可以通过以下现象来检测单向链路。
- 来自邻居的UDLD消息中不包含自己的交换机/端口对。这说明邻居没有收到自己的消息(比如切断的光纤),或邻居发送这些UDLD消息的端口与邻居收到自己发出的UDLD消息的端口不同(比如Tx光纤被插到Rx光纤之外的不同端口)。
- 来自邻居的UDLD消息中包含的交换机/端口生成者对,与自己使用的交换机/端口生成者对相同。表示这是一个自环端口。
- 交换机只检测到了一个邻居,但邻居UDLD消息表示它检测到的邻居列表中包含多于一对的交换机/端口对。这表明共享介质互连性能有问题,不能提供所有连接设备间的完全可见性。
若检测到上述任意现象,UDLD就会声明这条链路是单向的,并将端口置为err-disable状态。
此外,在端口没有关闭的情况下,如果丢失了所有的入向UDLD消息,也表明有单向链路问题。然而这种现象并不总是表示单向链路的可靠迹象。例如,假设两台交换机之间使用一对金属/光纤介质转换器互连。如果一台交换机已关闭,另一台交换机并不会发生链路关闭事件;只是发现不再收到UDLD消息。这时候如果认为链路已经成为单向的,就不对了。
因此UDLD对于突然无法收到UDLD消息,有两种操作模式。在正常模式中,如果不再收到UDLD消息,交换机会尝试与邻居重连(8次),如果尝试失败,UDLD不采取操作。特别是,不再收到UDLD消息的端口会保持启用状态。在激进模式中,如果不再收到UDLD消息,交换机会进行8次尝试与其邻居重连,如果尝试失败,UDLD会将端口置为err-disable状态。正常和激进模式之间的区别在于交换机对于突然丢失入向UDLD消息所作出的响应,这种现象隐含暗示了可能出现单向链路的情况。注意如果明确检测到前文描述的三种单向链路现象,正常和激进模式都会将端口置为err-disable状态。
工程师可以在全局启用UDLD,或基于端口启用UDLD,两台互连设备上都需要启用。全局UDLD配置只应用于光纤端口;基于端口的UDLD配置无论介质如何都可以启用。UDLD在全局使用udld {enable | aggressive} 命令启用,enable关键字表示正常模式,而aggressive关键字表示激进模式。在端口上,使用udld port [aggressive] 命令启用UDLD。如果省略了aggressive关键字,就表示使用正常模式。UDLD的运行状态中包含端口信息、检测到的邻居,以及邻居状态,工程师可以使用命令show udld 和show udld neighbors进行查看。如果UDLD在检测到单向链路条件后,将端口置为了err-disable状态,除了关闭再启用外,工程师也可以在特权EXEC模式中使用udld reset命令重置端口。
STP环路防护是一项附加逻辑,与点到点链路上的根端口和替换端口接收BPDU有关。在单向链路上,这些端口可能会从根端口或替换端口变为指定端口,进而创建交换环路。STP环路防护特性认为在根端口和替换端口收到BPDU后,在一个正常工作的网络中,这些端口不可能在不关闭的前提下突然停止接收BPDU。根端口和替换端口突然无法收到入向BPDU,表明可能出现了单向链路的情况。
遵循此逻辑.STP坏路防护机制能够防止根端口和替换端口由于不再收到入向BPDU而变为指定端口。如果这些端口不再收到BPDU.当端口上保存的BPDU超时后.坏路防护特性会将其置为坏路不一致的阻塞状态。再次开始接收BPDU后•端口将自动移出此状态。
工程师可以在全局启用环路防护特性.也可以基于端口启用.这是一种本地保护机制(即不要求其他交换机也配置坏路防护)。如果工程师使用全局命spanning-tree loopguard default來激活坏路防护特性.它会自动保护交换机上点到点链路类型的所有根端口和替换端口。全局配置的环路防护特性并不保护共享类型链路上的端口。工程师也可以使用命令spanning-tree guard loop基于端口配置.此时可以将该特性应用于共享链路上的端口。
网桥保障只适用于RPVST+和MST.且只用于点到点链路.是坏路防护特性所用理念的进一步的扩展。网桥保障特性修改了发送BPDU的规则。端口上启用了网桥保障特性时,端口总是以Hello间隔发送BPDU.无论它是根端口、指定端口、替换端口.还是备用端口。BPDU实际上成为了一对互连交换机之间的Hello机制。网桥保障机制一一被保护的端口必须要能够接收BPDU。如果收不到BPDU的话,端口将被置为BA不一致阻塞状态.直到再次开始接收BPDU。除了单向链路.当交换机发生故障.不再参与RPVST+/MST (完全停止处理和发送BPDU).而是完全开启它们的端口时.网桥保障特性也能够在这种时刻预防坏路的生成。在本书写作时.特定的Catalyst 6500和Nexus「000平台能够支持网桥保障特性。在Catalyst 6500系列设备匕配置该特性时,要求既要在全局使用命令spanning-tree bridge assurance进行配置.也要在连接其他交换机的STP点到点链路类型的端口上使用 接口命令spanning-tree portfast network來激活。邻居设备上必须也配置使用网桥保障特性。
争议机制是另一种用来检测单向链路的标准化方式。它使用RST标志字段和MSTBPDU中编码的信息,即转发BPDU的那个端口的角色和状态。操作原则非常简单:如果端口从声明为指定学习状态或指定转发状态的端口上收到了一个次优BPDU,它自己将进入丢弃状态。Cisco也在RPVST+中应用了争议机制。传统的STP/PVST+不支持争议机制,因为这些STP版本没有将端口角色和状态编码到BPDU中。争议机制是RSTP/MST的组成部分,无须配置。