生成树协议(STP)
基本含义
生成树是一个交换网络中检测交消除冗余链路以防止出现二层循环的一个协议。如果不运行STP,帧有可能会在网络中循环发送,流量极剧升高,最后使整个网络彻底瘫痪。STP最初是一个较慢的基于软件实现的一个桥接规范(IEEE802.1D),现在已经是一个相当成熟的协议了,可以在一个具有多VLAN、大量交换机、多厂商的复杂环境中很好的实施。
CatOS 6.x继续进行一些新的STP的开发,如多实例生成树(MISTP)、loop-guard、root-guards和 BPDU 到达时间检测等,在CatOS7.x版本中,支持新的一些标准化协议,如分享生成树(IEEE802.1S)和快速收敛生成树(IEEE802.1w)等。
运行机制
具有最低的桥ID(BID)的交换机每个VLAN的根桥(root bridge),BID由桥优先级和交换机的MAC地址组成。
最初,所有的交换出都将发出包括自己BID及到达自己的路径代价(path cost)在内的桥接协议数据单元(BPDUs),这样就可以检测出root bridge和到达root bridge的最小代价的路径,从root bridge发出的BPDUs中包含的附加设置将覆盖交换机的本地配置,这样整个网络就使用一个一致的时钟。
网络拓朴将按照下述步骤进行收敛:
在整个生成树域中选举出一个唯一的root bridge;
在每个非root bridge的交换机上选举出一个root端口(面向root bridge);
在每一段中选举出一个designated端口用于转发BPDU;
非designated端口切换到block状态。
在生成对中有两种BPDUs:用于配置的BPDUs和拓朴变化提示(TCN)BPDUs.
用于配置的BPDU流量
用于配置的BPDUs每隔一个hello间隔从Root Bridge的所有端口发到叶交换机上面,用于维护整个生成树的状态。在稳定状态,BPDU流量是单向的,Root端口和blocking端口仅接收用于配置的BPDUs,而指定端口只发送用于配置的BPDUs.
如果Root Bridge失效或所有连接到Root Bridge的链路都失效了,在Maxage计时器超时后重新进行选举。
拓朴变化提示(TCN)BPDUs流
拓朴变化提示BPDUs在检测到生成树的拓朴发生改变时由叶交换发到Root Bridge,Root端口只发送TCNs,而指定端口只接收TCNs.
TCN BPDU在发向Root Bridge中的每一步都被确认,这是一个可靠的机制,一旦到达Root Bridge,Root Bridge将通过一个将TCN标记设置为Maxage+Fwddely(缺省为35秒)的用于配置的BPDU向整个生成树域宣告这个拓朴变化的发生,使所有的交换机将它们的CAM老化计时器从5分钟(缺省的)修改为Fwddelay(缺省为15秒)所规定的时间间隔。
生成树模式
VLAN和生成树之间的关联有如下几种模式:
所有VLAN使用同一个生成树,称为Mono生成树,如IEEE802.1Q
每个VLAN一个生成树,或叫做分离生成树,如Cisco PVST。
几个VLAN一个生成树,或称为多生成树,如Cisco MISTP、IEEE802.1s等。
所有VLAN使用同一个生成树的模式只有一个活动的拓朴,无法进行负载均衡,一个STP blocked端口将对所有的VLAN均为Blocked状态,在所有的VLAN中都不转发数据。
每个VLAN一个生成树的模式提供负载均衡功能,但在VLAN数目增长是会消耗更多的CPU处理能力用于处理BPDU。在CatOS的发行公告中提供单个交换机中能支持的生成树个数的指导性意见,对于6000 SUP1的公式为:
端口数 + (Trunk数 * Trunk上的VLAN的数目) < 4000
Cisco MISTP和新的802.1s标准是一个发展方向,例如可以只定方两个STP进程,将所有的VLAN映射到这个两生成树中,这个技术可以在启用负载均衡的情况下支持到数千个VLAN。
BPDU 格式
为了支持IEEE 802.1Q标准, Cisco将现有的STP实现扩展为以支持穿越802.1Q单生成树域,这样PVST+同时支持802.1Q的MST和Cisco的PVST,而不需要额外的命令或配置。另外, PVST+提供用于确认交换机之间的Trunking和VLAN IDs不会出现不一致的配置的验证机制。
运行PVST+协议有如下注意事项:
PVST+通过在802.1Q trunk链路上的称做通用生成树(CST)的协议来实现和802.1Q MST的互操作。CST永远运行在VLAN1上面,为了和其它厂商的设备实现互操作,VLAN1在链路上应该存活。CST BPDUs是透明传输的,不打标记,发送到IEEE标准桥组地址(MAC地址01-80-c2-00-00-00, DSAP 42, SSAP 42). 为了描述的完整性,一组BPDUs被并行地发送到VLAN1上的Cisco分享生成树的MAC地址
PVST+将PVST BPDUs以组播数据的形式穿越802.1Q VLAN域. Trunk上每个VLAN中Cisco's分享生成树BPDUs被发送到MAC 地址01-00-0c-cc-cc-cd (SNAP HDLC协议类型0x010b),Native VLAN上的BPDUs不做标记,其它所有VLAN中的BPDUs将打上相应的标记。
PVST+检查端口和VLAN的冲突,PVST+阻塞收到不一致的BPDU的端口以避免出现循环,也通过syslog信息提示检测到的任何错误配置。
PVST+在运行在ISL trunk上的PVST提供后向的兼容,ISL封装的同样通过IEEE MAC进行接收和发送,换句话说,每个BPDU的类型都是针对一个链路的,不存在转换的说法。
建议
所有的交换机在缺省状态下都是启用了STP的,就算在不存在二层循环的情况下仍然推荐使用。因为如下原因,Cisco建议启用STP:
如果出现了循环(包括插错了线、电缆有问题等), STP可以防止由于组播和广播所引起的网络破坏。
保护EtherChannel不中断。
绝大多数网络配置了STP,最大限度地提高网络的透明度,越透明就意味着越稳定。
避免双网卡的误操作或服务器启用了桥接所导致的严重后果;
许多协议(如PAgP、IGMP snooping和trunking)的软件都和STP紧密相关,所以不运行STP将引起一些不必要的麻烦。
不要改变计时器,这可能会影响网络的稳定性。在绝大多数网络布署中都没有修改计时器,因为虽然可以很方便地通过命令行进行修改,但很难周全地考虑修改后所引起的各个可能的变化。 在理想状态下,不应该上用户数据在管理VLAN上传送,特别是在老的Catalyst交换机处理器的尾部 下,最好将用户数据和管理VLAN相分离以避免STP出现问题,一个有问题的工作问可以使用超级引擎疲于处理广播包而无法处理BPDU。
不要设计过量的冗余,这会造成故障诊断的恶梦--太多的blocking端口将严重影响网络的稳定性。保持整个STP直径在七跳以内,条件允许的情况下,在设计中使用多层模块,减小交换域和,使用确定的blocked端口。
手工设计Root特性和Blocked端口,并在拓朴图上明确标注,STP的故障诊断往往从blocked端口开始,使Block端口从blocking状态切换到转发状态是诊断过程中的一个关键组成部分,选择分布层或核心层交换机做为Root/Secondary Root Bridge,因为这是整个网络中最为稳定的,使用最优化的第三层和HSRP来覆盖每二层数据转发路径,可以使用下述宏命令将交换机设置为Root或secondary root:
set spantree root
注意:这个宏命令将交换机的优先级设置为8192(缺省状态下)、当前root优先级减1(如果存在另一个root bridge)或当前root优先级(交换机Mac地址比当前Root Bridge小)。
在Trunk端口上清楚不需要的VLAN,(需要进行双向配置),这可以限制STP的范围并减轻NMP的处理负担, VTP的自动修剪不会将这些VLAN从STP计算中移除。从CatOS5.4开始,VLAN1同样可以从Trunk链路上修剪掉。
其它选项
Cisco还有一个叫做VLAN-Bridge的STP协议,它使用01-00-0c-cd-cd-ce的目标MAC地址,协议类型为0x010c.
当需要在VLAN间桥接不可路由的信息或使用一些无法和IEEE生成树无法协同工作的传统协议时这是一个相当有用的功能。如果VLAN间的桥接因为第二层被阻塞时,第三层的流量同样会出被阻塞掉,这是一个不希望发生的副作用,这时使用VLAN-bridge就可以创建一个独立于STP的单独的实例,提供一个单独的拓朴,这样就可以不会影响到第三层的IP流量。
Cisco建议在需要在如MSFC之类的路由器上VLAN之间做桥接时使用VLAN-bridge。
PortFast
PortFast用于在访问层端口上跳过正常的生成树操作,加快终端工作站接入到网络中的速度,在一些如IPX/SPX中,需要工作站一接入网络就立即转发数据以避免出现GNS的问题。
运行机制
当一台主机接入到网络时,PortFast跳过了STP正常的listening和learning状态,直接从blocking状态进入到转发状态,如果没有启用这个特性,STP在它认为端口可以进入转发状态前将抛弃所有的用户数据包,这会用到两个ForwardDelay计时器(在缺省情况下是30秒)。
PortFast模式也避免了端口状态改变发出STP TCN后需要众learning状态到forwarding状态的转变。STP PortFast在Catalyst 5000多层交换网络和Multicast CGMP中都相当重要,这些环境中的TCNs可能会引起CGMP CAM表超时。结果就会丢失在下一个IGMP报前的组播包,也会引起多层交换Cache的清空,并增加router CPU的负担。(对Catalyst 6000中的MLS实现没有影响)
建议
Cisco建议在所有接计算机端口上启用portfast,在所有接交换机或未使用的端口上禁用portfast.
在接计算机的端口上同样应该禁用Trunking和Channeling,在缺省状态下,每个访问层端口都是启用了Trunk和channeling的。如果任由这些协议的协商,将引起一些不希望发生的后或,如DHCP请求不被发送等。使用如下宏命令达到上述要求:
set port host <port range>
该命令是如下三个命令的集合:
set spantree portfast <port range> enable
set trunk <port range> off
set port channel <port range> mode off
注意:PortFast并不意味着生成树协议在这些端口上完全不运行了,实际上BPDU仍然在发送、接收并处理。
其它选项PortFast BPDU-Guard提供了一个防止循环的机制,在一个Portfast端口上收至BPDU时,将会把该端口设置为errdisable状态。
在一个接入层端口上应该不会收到BPDU包,因为这些端口不是接在交换机上面。一但在这上面收到了BPDU包,就说明出现非常危险的错误配置,需要管理员及时采取行动。当启用BPDU-Guard特性后,生成树协议将关闭portfast配置,并将这些端口设置为生成树Blocking状态。
使用如下命令进行配置:
set spantree portfast bpdu-guard enable
可以使用SNMP trap或syslog消息通知管理员这个端口down了,也可以为ErrDisabled的端口配置一个自动恢复时间。
注意:从CatOS7.x版本开始提供Trunk端口上的PortFast特性,Trunk口上的Port特性用于加快第三层网络的收敛,为了实现这个特性,CatOS7.x也提供了每端中的PortFast BPDU-Guard配置命令。
UplinkFastUplinkFast在接入层提供了一个在出现直接链路失效时的STP快速收敛功能。它不需要改变STP协议,就可以在特殊环境中将收敛时间从30秒减少到3秒
运行机制在接入层使用Cisco的多层交换模型进行设计,如果转发的上行链路出现了问题,则处于blocking状态的上行链路可以直接转换为转发状态,而不必经过listening和learning状态。
每个VLAN中的一个上行组由一个root端口和备份root端口组成,在通常情况下,root端中保证到root bridge的连接能,如果主"root-connection"因为任何原因而失效,备用root链路立即成为转发状态,而不必要经过传统的30秒收敛延时。
因为这个特性跳过了通常的STP拓朴收敛,在域中的交换机上一个候选的拓朴修正机制,以便能够通过候选的链路到达本地终端工作端。这样,运行UplinkFast的接入层交换机将会把它的CAM表的每一个MAC地址放到一个多播帧中传送到01-00-0c-cd-cd-cd( HDLC 协议类型0x200a),用于更新域中其它交换机的CAM表。
建议Cisco建议在有block端口的交换机上启用UlinkFast,典型的就是接入层交换机,不要在没分布层或核心层交换机上使用uplinkfast,使用如下命令:
set spantree uplinkfast enable
这个命令同时也会提高bridge优先级和port优先级以降低交换机成为root bridge和指定端口的风险。
注意: 在启用"protocol filtering"特性的情况下,需要使用 "all protocols"关键字,因为CAM表中会和MAC、VLAN信息一样记录协议类型。UplinkFast需要产生每个MAC地址的每个协议,"rate"关键字指出每秒产生一个Uplink拓朴更新帧。
Backbone FastBackbone Fast通过在STP协议上增加功能的方式提供间接失效环境下的快速收敛,典型地,收敛时间可以从缺省的50秒减少到30秒。
运行机制在一个root端口或blocked端口从它的指定bridge收到"inferior BPDUs"就进行初始化,这可能会在下级交换机在丢失它到root的接时并发出它自己的BPDUs的时候发生,inferior BPDU意味着交换机即是一个root bridge又是一个指定gridge。
根据通常的生成树规则,收到BPDU的交换机将根据配置的Maxage计时器(缺省为20秒)忽略该BPDU,然而在配置了backbone Fast的情况下,交换机在收到inferior BPDU时就认为拓朴可能发生了改变,并开始尝试通过Root链路查询(RLQ) BPDUs检测是否存在一个通向root bridge的候选路径,不管root是否可用,这个协议都允许交换机进行检测,并以更少的时间将block端口切换为转发状态,并提示发出inferior BPDU的交换机root仍然可用。
该协议应该注意如下事项:
只在root端口上发送RLQ包。
如果收到RLQ的交换机是root交换机或丢失了到root的连接,则这个交换机则会进行回复,如果它不知道这些情况,它必须从它的root端口转发这些查询。
如果一个交换机丢失了到root的连接,它必须回答一个否定答案。
只能在收到查询的端口上发出答复
Root交换机必须给一个肯定的答复
丢弃在非Root端口上收到的答复
这样STP的收敛时间可以减少约20秒,因为不需要等待Maxage超时。
建议Cisco建议在所有支持STP的交换机上启用Backbone Fast,它不会造成生产环境的中断。使用如下命令配置Backbone Fast:
set spantree backbonefast enable
注意:需要在域中的所有交换机上配置这条全局命令,这样才能理解这个增加的特性。
其它说明2900xl和3500xl系列交换机不支持BackboneFast,在有这些交换机的环境中不能启用Backbone Fast.在未来,IEEE 802.1w快速收敛STP将提供类似的功能,这样就可以和其它厂商的设备进行互操作了。