转载地址为: http://taisongts08.blog.163.com/blog/static/7813435020121110114043328/
1、生成树基础
(1).生成树简介
STP的任务是找到网络中的所有链路,并关闭任何冗余的链路,这样就可以防止网络环路的产生。STP通过交换BPDU(网桥协议数据单元)数据报文,首先选举一个根桥,由根桥来负责决定网络拓扑。一旦所有的交换机都同意将某台交换机选举为根桥,其余的每台交换机就必须找到其根端口。(如果在交换机之间有多条链路,就只能由唯一的一个指定端口)。
(2).生成树的种类
当前STP相关的协议有:IEEE 802.1D(STP),802.1W(RSTP),802.1S(MSTP)。
STP(Spanning Tree Protocol)802.1D是最早关于STP的标准。
RSTP(Rapid Spanning Tree Protocol)802.1W 是STP的扩展,其主要特点是增加了端口状态快速切换的机制,能够实现网络拓扑的快速转换。
MSTP(Multiple Spanning Tree Protocol)802.1S提出了多生成树的概念,可以把不同的vlan映射到不同的生成树,从而达到网络负载均衡的目。
PVST Per-VLAN Spanning Tree PVST是cisco私有的技术,per-vlan即给网络中的每个vlan都创建一颗生成树,这样可以解决CST的问题,为不同vlan通过冗余连接进行负载平衡。但是,是cisco的私有技术,只能通过cisco的中继链路ISL中继封装发送,这样协议的兼容性就差。
PVST+ 是cisco的另一个STP专利,但是与PVST不同,PVST+的诞生就是为了兼容其他版本的BPDU而产生的,它可以通过ISL封装与PVST互通,也可以不给BPDU封装与802.1Q互通。
(3).生成树的原理
-
生成树收敛计算
所有的网桥都发送以自己为根桥的配置消息,比如网桥B发送的配置消息为(B,0,B,PortID); 网桥将接收到的配置消息和自己的配置消息进行优先级比较,保留优先级较高的配置消息,并据此完成生成树的计算。BPDU数据包【见附表术语】,在下图中目的MAC为二层组播地址。
那么我们是如何根据优先级比较的结果计算生成树的呢?主要分如下的几个步骤进行:
首先,配置消息中最小的那个根网桥ID将成为生成树的根;
如果自己就是根网桥,则最短路径开销为0;否则将最优配置消息中的路径开销加上接收端口对应链路的路径开销就是本网桥到根的最短路径开销;
然后选择根端口,一般来说对应最短路径开销的那个端口就是根端口,但是如果对应最短路径开销的端口不止一个,则ID号最小的端口将成为根端口;
确定根和最短路径之后,并将自己作为接收到的配置消息优先级比之劣的那些端口的指定网桥,而这些端口就是指定端口。
最后,网桥从指定端口将自己的配置消息发送出去。
-
生成树拓扑变更
拓扑改变报文有三种:拓扑改变通知消息,拓扑改变应答消息,拓扑改变消息。下面分别来介绍一下三种报文的含义:
1 拓扑改变通知消息:发现拓扑改变的网桥从根端口以hello time为周期定时向根网桥的方向发送拓扑改变通知消息,每一个收到这个通知消息的非根网桥也同样要向根桥的方向发送这个消息。这个消息是一个格式比较特殊的报文,它没有数据项,只需要让根知道拓扑改变即可。
2 拓扑改变应答消息:收到拓扑改变通知消息的网桥如果不是根网桥需要响应一个拓扑改变应答消息,收到应答消息的网桥就知道了:哦,你已经收到我的通知消息,那我就停止发送通知消息吧。这个消息是携带在该网桥发送的下一个配置消息中,用一个拓扑改变应答标志位来标识。
3 拓扑改变消息:根网桥收到拓扑改变通知消息,或者自己发现拓扑改变之后,则在一个时间段内,在以hello time为周期定时向其他网桥发送的配置消息中,携带一个拓扑改变的标志位。收到这个消息的网桥将会应用那个较短的地址表项生存期,直到收到的配置消息中不再有这个标志。
STP交换机检查到端口状态发生变化后,通过发送拓扑变更通知(TCN)bpdu告诉根桥,收到拓扑改变通知消息的网桥如果不是根网桥需要响应一个拓扑改变应答消息,根桥通过发送TC消息通知拓扑变更,传递到其他所有交换机。
2、生成树快速会聚特性
Portfast
access接口和Trunk接口都可以配置Port Fast功能。如果将交换机连交换机的接口变成Port Fast,则是制造环路。当开启了Port Fast功能的接口,如果在接口上收到BPDU后,就认为对端连接的是交换机,而并非主机或服务器,因此默认在接口收到BPDU后会立即关闭该接口的Port Fast功能。
接口下配置命令:sw(config-if-range)#spanning-tree portfast
全局配置下命令:sw(config)#spanning-tree portfast default (只能对access接口生效)
UplinkFast
为在接入层冗余链路上快速汇聚,可是使用此特性。UplinkFast要真正起到作用,交换机上必须有Blocking的端口存在才行,因为根交换机上所有的接口最终都会变成指定端口,所以UplinkFast在根交换机上开启是毫无意义的,UplinkFast只适合在非根交换机,即普通交换机上开启,普通交换机有时又称接入交换机。
UplinkFast只能在交换机上全局开启,不能针对VLAN单独开启,也不支持MSTP模式。 UplinkFast恢复网络的时间大约在1到5秒。
命令为:Sw(config)#spanning-tree uplinkfast
BackboneFast
为在核心层链路发生间接故障(当不直接和交换机相连的链路故障)后,能快速收敛生成树(通常的STP需要等到bpdu的max-time到期才会收敛),可以开启BackboneFast功能,需要在网络中所有交换机上开启,不能针对VLAN单独开启,也不支持MSTP模式。BackboneFast是对UplinkFast的强化与补充。
交换机通过根端口或阻断端口收到来自指定网桥的下级BPDU时,便确定发生了间接链路故障。(下级BPDU是:失去到根网桥的连接的指定网桥发送的,用于宣布自己是新的根桥)。接受下级BPDU交换机向下级发送RLQ请求,如果交换机通过非根端口收到RLQ的应答,就必须选择一条替代路径,最长寿命定时器立即过期,以便寻找新的根端口。
BackboneFast缩短了链路故障的检测时间,但是链路的任需要经过2个转发延迟定时器时间,即只将会聚延迟从50秒降至30秒。
配置命令:Sw(config)#spanning-tree backbonefast
3、生成树防护
(1)、防止意外BPDU
为确保根网桥的位置和稳定,需启用:
根防护
保护现有会聚拓扑冗余链路中的根桥,不会被新接入的较低桥ID改变网络拓扑。在根防护的端口上,收到新接入网桥ID最佳BPDU,端口就进入根网桥不一致状态。这种状态下,不能发送和接受数据,但能监听接口上收到的BPDU,可以检测将自己通告为根网桥的交换机。
当端口不再收到新接入优越BPDU后,端口将经历STP各种状态,恢复正常使用状态。
根防护的端口只能转发BPDU,不能收BPDU,禁止端口成为根端口。
命令配置:sw(config-if)#spanning-tree guard root (所有端口默认未启用根防护)
BPDU防护
为进一步保护启用了PortFast的端口,如果在启用BPDU防护的端口上收到任何BPDU,该端口就进入errdisable状态,在错误状态下,端口将关闭。必须手动重启端口或等待errdisable超时功能自动恢复。
在启用了PortFast端口上启用BPDU防护的全局命令:Sw(config)#spanning-tree portfast bpduguard default
在接口上启用防护:sw(config-if)#spanning-tree bpduguard enable
(2)、防止突然丢失BPDU
STP拓扑会聚后,根网桥仍需要发送BPDU,其他交换进行转发,会聚稳定性依赖定期的BPDU。如果拓扑没有变化,但突然也收不到BPDU了,则阻断端口可能就会启用造成环路。为防止以为丢失启用:
环路防护
为防止非指定端口,收不到BPDU后,进入转发状态,可以通过环路防护,跟踪非指定端口上bpdu的活动。能够收到,正常运行。不能收到时,环路防护将端口置为环路不一致(loop-inconsistent)状态。此时,端口被阻断。端口重新收到BPDU后,端口自动将经历STP状态,恢复活动端口。无需人工干预。
可以在所有端口上启用环路防护,而不考虑端口角色。交换机将判断哪些端口是非指定的,通过BPDU监控行为,保持他们的非指定,命令为:
Sw(config)#spanning-tree loopguard default
在接口上配置命令为:sw(config-if)#spanning-tree guad loop
UDLD
通过双向链路连接的交换机,如GBIC 、SFP的链路中物理层出现单向故障时,可以利用cisco专用的STP功能,UDLD 单向链路检测。交换机定期(默认间隔15秒)的发送2层UDLD帧,用于表示其端口,同时期望远端的交换机通过相同的链路回送这些帧,并在其中加入端口标识。
如果收到返回帧,且它标识了两个端口标识,则链路肯定是双向的,然而如果没有收到,则链路肯定是单向的。
检测到单向链路的故障时间不会超过15×3=45秒。链路会聚前(50秒),检测到链路故障。
UDLD两种模式:
常规模式:检测到单向链路状态后,允许端口继续操作。只是标记端口为undetermind状态,并产生一条系统消息。
激进模式:检测到单向链路状态后,交换机采取措施重建链路,每个1秒发送一条UDLD消息,并持续8秒,如果没有回应,就将端口置为errdisable状态,使其不可用。
在全局下配置命令:Sw(config)#udld [ enable|aggressive|message timeseconds]
在接口下配置命令:sw(config-if)udld [ enable|aggressive|disable ]
启用udld时,会先检查邻居,没有邻居回应时,链路不会禁用。
(3)、防止端口产生BPDU,禁用端口STP功能
将环路消灭在萌芽状态,可以启用BPDU的过滤,即禁用端口的STP功能。
在所有PortFast端口上禁用STP功能命令:Sw(config)#spanning-tree portfast bpdufilter default。
在接口下启用命令:sw(config-if)spanning-tree bpdufilter [enable|disable]
4、快速生成树的原理
快速生成树(RSTP)是从生成树算法的基础上发展而来,承袭了它的基本思想,即也是通过配置消息来传递生成树信息,并通过优先级比较来进行计算。快速生成树能够完成生成树的所有功能,不同之处就在于:快速生成树在不会造成临时环路的前提下,减小了端口从阻塞到转发的时延,尽可能快的恢复网络连通性,提供更好的用户服务.
802.1d生成树协议计算出一个新拓扑是非常快的,问题在于当一个端口被选为指定端口要工作时,需要经历30秒的转发延迟,这意味着有30秒的数据中断。原因是802.1d没有反馈机制用来通知实际上几秒钟后网络已达到收敛的信息。802.1w采纳了反馈机制及其他一些特性使端口快速转换到转发状态
RSTP添加标志位,如图8-20所示。在STP中,标志位只有0为TC和7为TCA使用,RSTP使用其中保留的6位。
BPDU的处理方式和802.1d也有些不同,取代原先的BPDU中继方式(非根桥的RP收到来自根桥的BPDU后,会重新生成一份BPDU朝下游交换机发送出去)。非根桥不停地发送BPDU,缺省为每2秒发送一个,即使没有收到任何根桥的BPDU它也这么做,而802.1d则不这样。在这里BPDU实际上充当了交换机之间的存活信号(keepalive)的作用,一旦交换机连续3个BPDU数据没有收到,它就会认为与直连的根桥或指定网桥失去了连接。
802.1w里如果在连续3个hello time里没有收到任何BPDU,那么BPDU信息将超时不被予以信任。那么网桥将认识它丢失了到达相邻网桥RP或DP的连接,这种快速老化的方式使得链路故障可以很快的被检测出来。
仅在非边缘接口进入转发状态时才检测拓扑变更,且会向网络中所有其他交换机传播TC拓扑变更消息,通知更新MAC地址表。
RSTP可以主动的将端口立即转变为转发状态,而无需通过调整计时器的方式去缩短收敛时间。为了能够达到这种目的,就出现了两个新的变量:边缘端口(edge port)和链路类型(link type).
边缘端口:指连接终端的端口(该端口保留了portfast的概念,如果收到bpdu,它就立刻失去边缘端口的状态)。
连接类型:根据端口的双工模式来确定,全双工操作的端口为点到点链路,通过同步提议,可以实现快速收敛 。
1)拓扑改变检测
在RSTP中,只有非边缘端口进入转发状态时,才引起拓扑的改变,端口改变到其他状态不引起拓扑改变(不产生TC),RSTP网桥检测到拓扑改变,发生以下动作:
非边缘的指定端口和根端口启动一个等于两倍Hello Time的TC等待计数器。
泛洪MAC地址到所有的端口上。(改变拓扑的端口MAC)
只要TC等待计时器在端口中运行,该端口发送的带有TC位的BPDU,在计时器激活期间,根端口也发送BPDU信息。
2)拓扑改变传播
当一个网桥收到带有拓扑改变(TC)标志为BPDU,按照以下两种方式进行处理:
清除交换机上所有端口学来的MAC地址除了拓扑改变收来的MAC地址。
启动拓扑改变(TC)等待计数器,发送带有TC标志位的BPDU到所有的指定端口和根端口。
通过这样的机制,SW-4的TCN通过一步快速泛洪到整个网络中,如图8-24所示,无须经过根桥。
3)收到TC拓扑变更信息后,根据端口类型作出决策
-
为根端口和指定端口设置了快速切换
用的替换端口(Alternate Port)和备份端口(Backup Port)两种角色 。AP提供了到达根桥的替代路径,因此,一旦RP挂掉后,AP可以取代RP的位置.BP也提供了到达同一桥接网段以及 AP所不能保证到根桥连接性的 冗余链路。
在802.1w中类UplinkFast功能-【新增端口角色】
替代端口-RP 提供一条面向根网桥方向的预备路径,由拥有根端口的网桥所提供。需要接收BPDU来保持处于堵塞状态。
备份端口-BP 扮演一条面向生成树叶子方向的备份路径,由拥有指定端口的网桥所提供。需要接收BPDU来保持处于堵塞状态。
在802.1w中类BackboneFast功能
在RSTP里,类似Backbone Fast的下级BPDU(inferior BPDU)也被集成进去。当交换机收到来自RP或DP的下级BPDU时,它(这里指B)立刻替换掉之前的BPDU并进行存储:
如上图,由于C知道根桥仍然是可用的,它就立刻向B发送关于根桥的BPDU信息,结果是B停止发送它自己的BPDU,接收来自C的BPDU信息并将连接到C的端口做为新的RP。 (传统的802.1d标准里,STA是被动的等待层2网络的收敛(由STP默认的最大寿命计时器控制)。
-
点对点链路中指定端口
只连接了两个交换端口的点对点链路中指定端口只需与下游网桥进行一次反馈机制的协商同步就可以无时延地进入转发状态 。协商仅可能发生在由点到点链路互连的交换机之间。
使用反馈机制的协商同步(称为proposal/agreement,提议/同意握手机制)。在802.1d环境下,一个端口被选为指定端口后需要经历一个转发延迟时间才到达转发状态。而802.1w不使用任何计时器,使用反馈协商的办法快速达到转发状态【见下文附表术语】。
-
边缘端口
可以直接进入转发状态,不需要任何延时。
5、多生成树协议-MST
在冗余拓扑网络中,生成树的可以基于vlan提供冗余负载的功能,但是以pvst(+)的扩展协议,执行多个vlan的stp生成树实例,对交换机性能又有更高要求。
多生成树独立于vlan,可根据链路定义stp实例,每个实例可以关联一个或多个vlan组。
MST-Region区域
MST可以与STP/PVST+兼容运行,但是运行MST时,必须确定对端设备的STP类型,为此可以通过区域关联相同配置属性的MST设备,即有相同配置属性的MST属于同一个区域。
MST的BPDU包含配置属性,在邻居收到后检测属性是否一致,以此承接和共享该MST实例。不一致时,说明处在MST区域边界,需要与其他区域或者传统STP进行兼容运行。
MST配置属性包括:MST配置名字,配置修订号,mst映射的vlan信息。
MST实例
MST是将多个VLAN映射到一个实例,需要均衡负载时可以多个实例。MST可以创建16个实例(0-15),其中MST 0为内部生成树实例(IST),在启用mst后默认启用。其他实例可根据需要手动创建。
MST通过实例0发送和接受MST BPDU,其他所有的实例信息通过M-record附加在BPDU中,即使有16个实例,在网络中也只有一个实例MST0的BPDU在传输。
MST实例只在区域内有意义,即使邻接的MST实例配置相同。在区域边界MST实例通过与IST合并后接发,换句话,只有MST0=IST实例可以进出MST区域。
MST配置
MST启用后,PVST+自动禁用,MST和PVST+不能同时使用。关于MST运行参数如定时器的修改,是针对整个MST,不是针对某个实例的,因为所有的实例都是通过IST实例和BPDU决定的。
Switch(config)# spanning-tree mode mst
Switch(config)# spanning-tree mst configuration #进入MST配置模式
Switch(config-mst)# instance 1 vlan 10-20 #映射VLAN到实例
Switch(config-mst)# name region1 #MST配置名字
Switch(config-mst)# revision 1 #MST配置修订号
Switch(config-mst)# show pending #显示未提交的MST配置
Pending MST configuration
Name [region1]
Revision 1
Instance Vlans Mapped
-------- ---------------------
0 1-9,21-4094
1 10-20
-------------------------------
Switch(config-mst)# exit #退出并提交MST配置
附表术语:
STP中网桥协议数据单元(BPDU):
①配置(CFG)BPDU: 初始时每个网桥都会发送,假设自己就是根网桥
收敛后,只从根网桥发出,其他网桥在根端口接收后向下中继。
②拓扑改变提示(TCN)BGDU:当拓扑发生变化时,其他网桥可以从根端口发出该BPDU,到达根网桥。
根网桥在配置BPDU中设定TCN位,提示其他网桥快速清理MAC地址表。
STP中时间值:
①HELLO间隔:2秒,CFG BPDU发送间隔
②MAX AGE: 20秒,CFG BPDU的保留时间
③FWD_DELAY: 15秒,监听(listening)和学习(learning)的时间
STP中端口状态:
①关闭(disable):端口处于管理关闭状态
②阻塞(blocking): 不能转发用户数据
③监听(listening): 接口开始启动
④学习(learning) : 学习MAC地址, 构建MAC表进程项
⑤转发(forwarding): 可以转发用户数据
图中显示了端口的五种状态的迁移关系。从图中我们可以看出来,当一个端口被选为根端口或指定端口,就会从blocking状态迁移到一个中间状态listening状态;经历forward delay的延时,迁移到下一个中间状态learning状态;再经历一个forward delay延时,迁移到forwarding状态。
当一个端口由于拓扑发生改变不再是根端口或指定端口了,就会立刻迁移到blocking状态。并且,处于任何状态的端口都可能因为端口可用或者不可用变成disabled状态。
从listening迁移到learning,或者从learning迁移到forwarding状态,都需要经过forward delay延时,通过这种延时迁移的方式,能够保证网络中需要迁移到discarding状态(即为胶片中的Blocking状态)的端口已经完成了迁移,因此能够有效的避免临时环路的形成。
RSTP中的协商同步
以下图所示的拓扑解释快速生成树的运行过程。本例中假设在交换机A和根桥(root)之间有一条非直连路径(经由C、D,原来的链路),当在它们之间新增了一条直连链路后,下面的过程将会发生。
(1) 新的链路建立之后,链路两端的端口立即处于discarding状态,这与802.1d没什么区别。不同的是此时A和root会发起协商,双方交换BPDU(如图过程1所示),root向交换机A发送的BPDU称为proposal(提议)。A一收到来自root的BPDU,就把自己的非边缘端口阻塞掉,这种操作称为sync(意思是与新的根桥BPDU信息同步)。一旦sync结束,交换机A就会明确地授权(同意agreement)交换机root把它(交换机A)的端口置于转发状态(A发送给root的BPDU称为agreement).
提示:边缘端口和处于discarding状态的端口被认为已经同步了。
(2)当交换机A把自己的非边缘端口阻塞掉之后,它和root之间的链路就转变为forwarding状态。在这一阶段,交换机A上新近被阻塞的端口也会向它的邻居端口(分别在B和C上)进行协商(发送proposal BPDU),试图快速转向forwarding状态(如图过程2所示),这时两条链路上都进行sync的操作。假设交换机B只有边缘端口,所以它可以立即授权A把端口置为转发状态(发送agreement BPDU)。假设交换机C上也有两个边缘端口,那么交换机C只需把与D相连的端口置于discarding即可授权A把端口置于转发状态,而后过程进入第三步。
过程2的图例
(3)交换机C的端口与相邻的交换机D的端口协商,进入sync操作。在没有得到邻居的授权后(假设D的端口在选举过程中落选,成为非指定端口,那么它处于discarding状态,所以已经sync),交换机C的端口转变为转发状态。最终的拓扑如图过程3所示,在D和C之间的链路上,D的端口被阻塞。
C其实也会收到来自D发来的授权(同意),让C端口快速进入转发状态,但是由于D端口本身是个非指定端口,所以在收到C的提议信息(proposal BPDU)后,也不会立即进入转发状态。
过程3的图例
如果一个指定为丢弃状态的端口,在发出提议BPDU信息后没有收到认可信息,该端口会回退到802.1d标准,从监听到学习,再慢慢进入转发状态.这种情况多发生在不理解RSTP BPDU的交换机端口上.
上述过程显示,RSTP没有采纳任何计时器,而是使用了协商机制,使端口快速转变为forwarding状态,绕过了30秒的转发延迟。为了有效利用RSTP的快速收敛特性,管理员应该注意以下两点:
协商仅可能发生在由点到点链路互连的交换机之间。
边缘端口的角色更加重要了,需要正确配置,否则影响收敛。