一.STP:
在谈本主题之前,先简单的对STP(802.1d)做个回顾.STP是用于打破层2环路的协议,但这个协议有个最明显的缺点,就是当层2网络重新收敛的时候,至少要等待50秒的时间(转发延迟+老化时间).50秒的时间对于一个大型的层2网络来说,是一个漫长的过程(何况这只是个理论时间,实际情况还会更长).虽然CISCO对STP的这些缺点开发出了些弥补性的特性,比如PortFast,Uplink Fast和BackboneFast,用于加快层2网络的收敛时间.套用王朔的话"看上去很美".虽然这些"新"特性能够改善STP的一些不足,但是,这些特性是CISCO私有的,而非行业标准;此外,这些特性要求我们做额外的配置,如果缺乏对这些技术的理解,还有可能导致环路问题.
二.RSTP:
RSTP是IEEE 802.1w标准定义的,目的就是为了改进STP的一些不足,并且在某些情况下,RSTP要比之前所提到的那些PortFast,Uplink Fast和Backbone Fast技术更为方便.但是在比较古老的交换机型号中比如CATALYST 2900XL/3500XL里,不支持RSTP与RPVST+(或叫PVRST+),还有些型号比如CATALYST2948G-L3/4908G-L3,CATALYST 5000/5500和CATALYST8500不支持RSTP.
802.1d标准中对端口状态的定义有:
1.监听(listening).
2.学习(learning).
3.堵塞(blocking).
4.转发(forwarding).
5.禁用(disabled).
802.1w标准中对端口状态的定义有:
1.丢弃(discarding).
2.堵塞(blocking).
3.转发(forwarding).
丢弃状态,实际上就类似802.1d中监听,学习和禁用状态的集合.
在802.1w中,根端口(rootport,RP)和指定端口(designatedport,DP)仍然得以保留;而堵塞端口被改进为备份端口(backup port,BP)替代端口(alternateport,AP).不过,生成树算法(STA)仍然是依据BPDU决定端口的角色.和802.1d中对RP的定义一样,到达根桥(rootbridge)最近的端口即为RP.同样的,每个桥接网段上,通过比较BPDU,决定出谁是DP.一个桥接网段上只能有一个DP(同时出现两个的话就形成了层2环路).
在802.1d中,非RP和DP的端口,它的状态就为堵塞状态,这种状态虽然不转发数据,但是仍然需要接收BPDU来保持处于堵塞状态.AP和BP同样也是这样.AP提供了到达根桥的替代路径,因此,一旦RP挂掉后,AP可以取代RP的位置.BP也提供了到达同一桥接网段以及AP所不能保证到根桥连接性的冗余链路.
在RSTP里,BPDU的格式稍稍变化了一些,在802.1d里,BPDU只有两个标签选项:
1.拓扑改变(TC).
2.拓扑改变确认(TCA).
而RSTP中的BPDU采用的是版本2的BPDU,换句话说802.1d网桥将丢弃这种新的BPDU.这种新的BPDU,在原先的BPDU基础上增加了6个标签选项:
BPDU的处理方式,和802.1d也有些不同,取代原先的BPDU中继方式(非根桥的RP收到来自根桥的BPDU后,会重新生成一份BPDU朝下游交换机发送出去),802.1w里的每个网桥,在BPDUhello time(默认2秒)的时间里生成BPDU发送出去(即使没有从根桥那里接收到任何BPDU).如果在连续3个hellotime里没有收到任何BPDU,那么BPDU信息将超时不被予以信任.因此,在802.1w里,BPDU更像是一种保活(keepalive)机制.即,如果连续三次未收到BPDU,那么网桥将认识它丢失了到达相邻网桥RP或DP的连接.这种快速老化的方式使得链路故障可以很快的被检测出来.
在RSTP里,类似Backbone Fast的下级BPDU(inferiorBPDU)也被集成进去.当交换机收到来自RP或DP的下级BPDU时,它(这里指B)立刻替换掉之前的BPDU并进行存储:
如上图,由于C知道根桥仍然是可用的,它就立刻向B发送关于根桥的BPDU信息.结果是B停止发送它自己的BPDU,接收来自C的BPDU信息并将连接到C的端口做为新的RP.
传统的802.1d标准里,STA是被动的等待层2网络的收敛(由于转发延迟的定义).对STP默认的计时器进行修改,可能又会导致STP的稳定性问题;而RSTP可以主动的将端口立即转变为转发状态,而无需通过调整计时器的方式去缩短收敛时间.为了能够达到这种目的,就出现了两个新的变量:边缘端口(edgeport)和链路类型(link type).
边缘端口(EP)的概念,和CISCO中PortFast特性非常相似.由于连接端工作站的端口,是不可能导致层2环路的,因此这类端口就没有必要经过监听和学习状态,从而可以直接转变为转发状态.但是和PortFast不同的是,一旦EP收到了BPDU,它将立即转变为普通的RSTP端口:
RSTP快速转变为转发状态的这一特性,可以在EP和点到点链路上实现的.由于全双工操作的端口被认为是点到点型的链路;半双工端口被认为是共享型链路.因此RSTP会将全双工操作的端口当成是点到点链路,从而达到快速收敛.
当STA决定出DP后,对于802.1d,仍然要等待30秒的转发延迟才能进入转发状态;在802.1w里:
假设根桥和交换机A之间创建了一条新的链路,链路两端的端口刚开始均处于堵塞状态,直到收到对方的BPDU.当DP处于丢弃或者学习状态,它将在自己将要发送出去的BPDU里设置提议位(proposalbit),如上图的p0和步骤1.由于交换机A收到了上级(superior)信息,它将意识到自己的P1应该立即成为RP.此时交换机A将采取同步(sync)动作,将该上级BPDU信息洪泛到其他的所有端口上并保证这些端口处于同步状态(in-sync).
当端口满足下列标准之一时,即处于同步状态:
1.端口为EP.
2.端口为堵塞状态(即丢弃,或者为稳定拓扑).
假设交换机A的P2为AP,P3为DP,P4为EP.P2和P4满足上述标准之一,因此为了处于同步状态,交换机A将堵塞P3,指定它为丢弃状态,其他端口处于同步状态(步骤2).交换机A将解除P1的堵塞状态做为新的RP,并向根桥反馈确认信息(步骤3),这个信息其实是之前步骤1所发的提议BPDU信息的拷贝,只不过是把提议位设置成了认可位(agreementbit).当P0收到这个认可信息后,它立即进入转发状态.由于P3之前被堵塞了,当步骤3完成后,P3也执行之前P0所经过的步骤1,向下游交换机发出提议BPDU信息,尝试快速进入转发状态.依次类推.
由于提议机制非常迅速,因此RSTP不需依赖任何计时器.如果一个指定为丢弃状态的端口,在发出提议BPDU信息后没有收到认可信息,该端口会回退到802.1d标准,从监听到学习,再慢慢进入转发状态.这种情况多发生在不理解RSTPBPDU的交换机端口上.
RSTP里另外一个快速进入转发状态的机制,和CISCO对STP的扩展技术UplinkFast很相似.当网桥丢失了RP后,它会把自己的AP直接设置为转发状态(新的RP).因此对于RSTP来说,UplinkFast的特性无需手动配置.还有一点和802.1d不同的是,当交换机检测到拓扑变化后,产生TC信息,直接洪泛给整个网络,而无需像802.1d那样先报告给根桥:
三.MST:
MST是由IEEE 802.1s标准制定,来自CISCO私有的MISTP协议(Multiple Instances SpanningTree Protocol).和RSTP一样,MST在某些CATALYST交换机上也不支持,比如:CATALYST2900/3500XL,CATALYST 2948G-L3/4908G-L3,CATALYST 5000/5500以及CATALYST8500.
简单的说,STP/RSTP是基于端口的,PVST/PVST+是基于VLAN的,而MISTP就是基于实例的.所谓实例就是多个VLAN的一个集合,通过多个vlan捆绑到一个实例中去的方法可以节省通信开销和资源占用率.
在谈MST之前先说说关于trunk的原始版本IEEE802.1q,该标准制定了CST(Common SpanningTree).CST假定整个层2网络只有一个STP的实例,也就是说不管整个层2网络划分了多少个VLAN,都只有一个STP的实例.CST的一些优劣:
1.缺点:无法实现STP的负载均衡.
2.优点:节约CPU资源,整个层2网络只需要维护一个STP的实例.
而后续的802.1q增强了对VLAN的支持,出现了PVST+(每1个VLAN有1个STP的实例).
802.1s结合了PVST+和802.1q的优点,将多个VLAN映射到较少的STP实例.之前的PVST+的优点,可以实现STP的负载均衡,对CPU资源是个负担.而MST(802.1S)减少了不必要的STP的实例.如下图,假设D1和D2分别为VLAN1到500和VLAN501到1000的根桥,如果用PVST+,就将有1000个STP的实例,但是实际上整个层2网络只有2个逻辑拓扑,所以优化办法是将STP的实例减少到2个,同时保留STP负载均衡的优点:
从技术角度来看,MST的确是最佳解决方案,但是对端用户而言却并不是必需的,因为MST通常要求比802.1d和802.1w更为复杂的配置,并且还可能遇到与802.1d的协同操作问题.
之间提到了,多个VLAN可以映射到一个STP的实例上.但是,决定哪个VLAN和哪个STP实例相关联,以及BPDU的标签方式以便交换机可以鉴别出VLAN与STP实例信息,这是个问题.这个时候就出现了一个类似BGP里AS的概念:区域(Region).MST的区域是指处于同一管理范围的交换机组.为了能够成为MST区域里的一部分,交换机必须享有相同的配置属性:
1.以26个字母命名的配置名(32字节).
2.配置修正号(2字节).
3.对应4096个VLAN的元素表.
在做VLAN到STP实例映射的时候,要先定义MST的区域,但这个信息不会在BPDU里传播,因为对于交换机来说,它只需要知道自己和邻居交换机是否处于同一个MST区域.因此,只有一份VLAN到STP实例的映射摘要信息,配置修正号,与配置名随着BPDU被传播出去.当交换机端口收到该BPDU后,它将解读该摘要信息,和自身的摘要信息做个比较,如果结果不同,那么该端口将成为MST区域的边界:
根据802.1s的定义,MST网桥必须能够处理至少两种实例:
1.一个IST(Internal Spanning Tree).--->(singlespanning tree,单生成树)
2.一个或多个MSTI(Multiple Spanning Tree Instance).
IST是一种RSTP实例,它扩展了MST区域内的802.1D单一生成树.IST连接所有MST网桥,并从边界端口发出,作为贯穿整个网桥域的虚拟网桥.
MST实例(MSTI)是一种仅存在于区域内部的RSTP实例.它可以默认运行RSTP,无须额外配置.不同于IST的是,MSTI在区域外既不与BPDU交互,也不发送BPDU.
cisco实例定义了16种实例:一个IST(实例0)和15个MSTI,而IEEE802.1S则支持一个IST和63个MSTI.
当然到目前为止,802.1s只是个"准标准",这些术语可能随着最终版的802.1s而有不同的叫法.CISCO支持1个IST和15个MSTI.
由于MST源自IEEE 802.1s,因此,要必须让802.1s和802.1q(CST)协同操作.IST实例向CST发送或从CST那里接收BPDU.IST实例其实是RSTP实例的简化,它扩展了MST区域里的CST.IST可以看做CST外部的整个MST区域的代表:
如上图,这两种图例职能相同.在典型的802.1d环境里,你可能会看到堵塞M和B之间的通信;同样的,你可能期望堵塞图中MST区域里(MSTRegion)的某个端口(而不是堵塞D).但是,由于IST是做为整个MST区域(MSTREgion)的代表,因此,你看到的就是对B和D的堵塞.
MSTI也是RSTP的简化版实例,它只存在于MST区域的内部.MSTI默认自动运行RSTP,而无需额外的配置.和IST不同的是,MSTI永远不会和MST区域(MSTRegion)外部通信.另外,只有IST会向MST区域(MSTRegion)外发送BPDU,而MSTI不会.在MST区域内,网桥相互交换MST BPDU,这些MST BPDU对IST来说可以看成是RSTP BPDU.
配置MST示例:
Switch(config)# spanning-tree mst configuration/---进入MST配置模式---/
Switch(config-mst)# instance 1 vlan 10-20 /---将VLAN10到20映射到实例1里,VLAN范围为1-4094,实例范围为0-4094---/
Switch(config-mst)# name region1 /---命名MST区域,32字节长的字符,大小写敏感---/
Switch(config-mst)# revision 1 /---配置修正号,范围是0到65535---/
Switch(config-mst)# show pending /---显示等待用户确认的配置信息---/
Pending MST configuration
Name [region1]
Revision 1
Instance Vlans Mapped
-------- ---------------------
0 1-9,21-4094
1 10-20
-------------------------------
Switch(config-mst)# exit /---应用配置并退出MST配置模式---/
Switch(config)# spanning-tree mode mst/---启用MST,同时让RSTP生效---/
指定MST根桥与配置MST网桥的优先级:
Switch(config)# spanning-tree mst {instance-id} root{primary|secondary} [diameter net-diameter [hello-time ses]]
对于MST,半径范围只能为0;默认配置信息2秒发送1次,可选修改范围为1-10秒.
Switch(config)# spanning-tree mst {instance-id} priority{priority}
端口优先级的值范围是0-61440,以4096递增,值越低,优先级越高,默认为32768.
配置MST端口优先级与路径开销:
Switch(config)# spanning-tree mst {instance-id} port-priority{priority}
端口优先级的值范围是0-240,以16递增,值越低,优先级越高.
Switch(config)# spanning-tree mst {instance-id} cost {cost}
路径开销的值范围是1到200000000,取决于接口带宽.
配置MST的相关计时器:
Switch(config)# spanning-tree mst hello-time {sec}
默认配置信息2秒发送1次,可选修改范围为1-10.
Switch(config)# spanning-tree mst forward-time {sec}
默认转发延迟为15秒,可选修改范围为4-30.
Switch(config)# spanning-tree mst max-age {sec}
指定MST实例的最大生存周期,默认为20秒,可选修改范围为6-40.
指定BPDU的最大跳数:
Switch(config)# spanning-tree mst max-hops {hop-count}
默认为20跳,可选修改范围为1-255.
定义链路类型为点到点:
Switch(config-if)# spanning-tree link-type point-to-point
一些验证命令:
Switch#show spanning-tree mst configuration
验证MST区域信息.
Switch#show spanning-tree mst [instance-id]
验证MST实例信息.
Switch#show spanning-tree mst interface [interface-id]
验证特定接口的MST实例信息.