STP生成树(IEEE 802.1D)
- 为什么需要生成树?
链路聚合技术只有线路的冗余,没有设备的冗余,如果要做设备上的冗余,就可以做生成树。表面上看生成树的作用是做设备冗余时,防止成环的一种途径,但实际上可以避免做生成树,使用堆叠技术和虚拟化技术来达到防止出现环路的作用(将两个设备做成一个设备,使得整个拓扑还是一个树状结构),所以生成树并不是必须项,但如果担心交换机出现环路风险,就一定要使用生成树。从冗余角度来讲,生成树是不会带来冗余的,是因为冗余出现了环路才使用生成树的,并不是一个冗余关系。 - 如果出现环路,怎么使用生成树来处理?
交换网络出环的概率是非常大的,尤其是在企业网中,网络环境复杂,管理上的不严格是随处可见的,所以大部分的企业网都会使用生成树。环路会引发几个现象:广播风暴、MAC地址表反复重写,都会对交换机造成严重损害,都会迅速的把设备搞成资源不足的情况,不管说是转发资源还是MAC表的内存资源问题,都会造成宕机,导致数据无法通过交换机。 - 交换机如何防环?
将拓扑结构做成树状结构,防止出环,凡是阻碍成树的线路全部砍掉。
生成树是一种依靠BPDU信息来形成交换机间通信的技术
BPDU
- 协议ID:表明哪一种生成树
- 版本:生成树的版本(如cisco的pvst/pvst+)
- Message type:BPDU的包的种类(配置BPDU、拓扑变更BPDU)
- Flags:标记
- Root ID:根ID
- Cost of path:到达根的开销,带宽越大,开销越小,叠加值
- Bridge ID:自己的桥ID
- Port ID:描述端口的两个参数,端口优先级、端口MAC
- Message age:按照时间算,最大20s(Max age)
- Hellotime:2s
- Forward delay:15s
20s+15s*2=50s,即原始生成树的切换时间
第一个20s的来源是BPDU最迟被收集到的时间,转发延时牵扯到侦听和学习,指的是一个数据包(无论是BPDU数据包还是普通数据包)在一个有限的交换网络中从一个交换机到达另一个交换机的转发时间最长是15s。
原始生成树的运算过程
总的来说,在最开始的时候,每个交换机会发送BPDU,收集完BPDU后开始选举,选完根交换机选根端口,选举完成后收敛完成。
发送BPDU之前,交换机的接口会同步它的全局BPDU参数,即交换机将BPDU同步给接口,接口将BPDU保存后向外发送,到达对端接口的时候,对端接口由于同步了自己的全局BPDU,会将自己的BPDU与收到的BPDU进行比对(BID),比对后同步较优的BPDU,此时交换机会认为较优BPDU的发送者是本地的根交换机,同时接口会同步全局BPDU后再同步给其他接口,因为周期的存在,其他接口会根据周期发送所同步的BPDU,一直扩散。只要保证自己所发出的BPDU一定能被其他设备接收到,全网一定会同步出一个唯一的根ID,这就是选根的过程,也因此必须等待20s,否则可能会导致某一条BPDU没有同步结束,此时选的根就不一定是一个准确的根。如果想加快收敛,可以手动将max age改小,但不建议改动,后期生成树因为更改了选举方法,故不会有这样的问题。
根接口:设备对端的接口会被同步,被同步后会计算cost-path,远端设备的BPDU同步时,会叠加cost-path,其他设备的接口在同步BPDU比对RID时会发现RID相同,接着会比对cost-path,设备在同步全局BPDU时,会保留最优的cost-path,此时被同步cost-path的接口即为根接口。如果cost-path依旧相等,就比对对方的BID,因为此时全局BPDU被对端设备同步了,此时的BID就是对端的BID,大部分人会认为是因为对端的BID越小,就越能成为下一代根,但实际上这是从结果推导出来的结论,存在逻辑上的问题 然后比对对端的port ID(port优先级/port MAC),在port优先级相同时比对MAC,MAC值小为优。
如果要修改参数以达到更改原有线路的目的,cost-path一般在本端修改,PID优先级在对端接口修改。
SW(config-if)#spanning-tree vlan 1 ?
Cost Change an interface’s per VLAN spanning tree path cost
Port-priority Change an interface’s spanning tree port priority
根的选举
根据BID的参数来选,越小越优,先看优先级后看MAC
根端口选举
越小越优
- cost-path
- 对端BID 桥优先级和桥MAC
- 对端的PID 端口优先级
指定端口的选举
一条线路上只能有一个指定端口
BID本交换机成根的可能性越大越能成为指定接口
状态接口跳转
为什么要有状态切换?
状态切换的其中一个目的是要保证生成树在收敛完成之前没有环路,如果出现环路,数据有可能会无法传递,导致生成树无法收敛。状态切换就是为了保证不会出环并且按照既定步骤完成生成树的收敛。
- blocking 不能收也不能发送数据及BPDU,但可以监听BPDU 20s(max age)
- Listening 收集BPDU信息选举,本质是选举根接口,可以发送BPDU 15s(forward delay)
- Learning 可以发送普通数据,但不能转发,学习接口转发的MAC地址 15s(forward delay)
- Forwarding 可以转发数据及BPDU
其他的生成树都是在STP生成树的基础上改进的,STP生成树最大的问题还是收敛过程太长,所以改进的方向也是以此为主
RSTP(IEEE 802.1w)
Cisco的快速生成树和公有的快速生成树还是有所区别的:公有的快速生成树是所有的VLAN在一棵树内,cisco的快速生成树是每一个VLAN一棵树。
RSTP的增强
STP的速度是由四个状态跳转决定的。可以改进的地方是blocking状态,此处20s花在收集BPDU上了,是一种完全不能收发数据的状态,在此的改进是让生成树在blocking之前就完成BPDU的收集,不需要再花20s,直接跳转到listening状态,随时收发BPDU,此时在四个状态上的优化已经到达极限。
RSTP删除了3种端口状态,增加了2种端口角色,并且把端口的属性充分按照状态和角色解耦,使其可以更加精确地描述端口,从而使得初学者更容易学习协议,同时加快拓扑收敛。通过端口角色的增补,卷花了生成树协议的理解及部署。
RSTP的端口角色一共有4种:根端口、指定端口、替换(Alternate)端口、备份(Backup)端口,将非指定端口重新定义成替换和备份两种角色,根据这两种角色就可以做到快速的切换。
根端口和指定端口的作用通STP协议中定义,替换端口和备份端口的描述如下:
从配置BPDU报文发送角度来看:替换端口就是由于学习到其它网桥发送的配置BPDU报文而阻塞的端口,就是该端口与其他交换机构成了一个大环。交换机判断环路的方式是收到了一个其他交换机发送回来的一个本由自己发出的BPDU从而确定出现环路,进而被阻塞成为替换端口;备份端口就是由于学习到自己发送的配置BPDU报文而阻塞的端口,并没有通过其他交换机转发。替换端口是一种设备的备份端口,备份端口是一种类似于接口的备份端口。
从用户流量角度来看:替换端口提供了从指定桥到根的另一条可切换路径,是一种已经确定角色的备份根端口的接口,当根端口出现问题,会自动切换到替换端口,在切换的过程中不会再进行选根,就意味着可以再节约15s,也不再需要再花15s去学习,而是将原来的根端口的BPDU信息改为当前端口,就可以节约学习的时间,并且将总体的收敛时间缩短到2s之内,而且绝对不会出现环路;备份端口作为指定端口的备份,提供了另一条从根桥到相应网段的备份通路,也是被确定角色的端口,不会出现环路,学习和选根阶段也如同替换端口一样被省略。给一个RSTP域内所有端口分配角色的过程就是整个拓扑收敛的过程。
端口状态的重新划分
RSTP的状态规范把原来的5中状态缩减为3种。根据端口是否转发用户流量和学习MAC地址来划分:
- 如果不转发用户流量也不学习MAC地址,那么端口状态就是Discarding状态
- 如果不转发用户流量但是学习MAC地址,那么端口状态就是Learning状态
- 如果急转发用户流量又学习MAC地址,那么端口状态就是Forwarding状态
配置BPDU的处理发生变化
拓扑稳定后配置BPDU报文的发送方式:根桥按照Hello Timer规定的时间间隔发送配置BPDU。其他非根桥设备在收到上游设备发送过来的配置BPDU后们才会触发发出配置BPDU,此方式使得STP协议计算复杂切缓慢。RSTP对此进行了改进,即在拓扑稳定后,无论非根桥设备是否接收到桥传来的配置BPDU报文,非根桥设备仍然按照Hello Timer规定的时间间隔发送配置BPDU,该行为完全由每台设备自主进行。
更短的BPDU超时计时
如果一个端口连续3个Hello Time时间内没有收到上游设备发送过来的配置BPDU,那么该设备认为与此邻居之间的协商失败。而不像STP那样需要先等待一个Max age。
处理次优BPDU
当一个端口收到上游的指定桥发来的RST BPDU报文时,该端口会将自身储存的RST BPDU与收到的RST BPDU进行比较。如果该端口储存的RST BPDU的优先级高于收到的RST BPDU,那么该端口会直接丢弃收到的RST BPDU,立即回应自身储存的RST BPDU。当上游设备收到下游设备回应的RST BPDU后,上游设备会根据收到的RST BPDU报文中相应的字段立即更新自己储存的RST BPDU。由此,RSTP处理次等BPDU报文不再依赖于任何定时器通过超时解决拓扑收敛,从而加快了拓扑收敛。
快速收敛
Proposal/Agreement机制
当一个端口被选举成为指定端口之后,在STP中,该端口至少要等待一个Forward Delay(Learning)时间才会迁移到Forwarding状态。而在RSTP中,此端口会先进入DIscarding状态,再通过Proposal/Agreement机制快速进入Forward状态。这种机制必须在点到点全双工链路上使用。
- 每一个VLAN一棵生成树 BIDextend system ID是vlan ID
- 接口状态改变,收敛时间减少
Discarding ->learning ->forwarding 15+15=30s - 端口角色改变 代替端口和备份端口
- BPDU的改变 TCN 建议机制
- 网络类型 1.p-to-p 2.share 3.edge
1.proposing:当一个指定端口处于Discarding或Learning状态时,该变量置位,并向下游交换设备传递Proposal位被置位的RST BPDU。
2.Proposed:当端口收到对端的指定端口发来的携带proposal的RST BPDU时,该边浪置位。该变量指示本网段上的指定端口希望尽快进入forwarding状态。
3.Sync:当proposed被置位以后,收到proposal的根端口会依次为自己的其他端口置位sync变量,而收到proposal的非边缘端口则会进入discarding状态。
4.Synced:当端口转到discarding状态后,会将自己的synced变量置位。Alternate端口、backup端口和边缘端口会马上置位该变量。根端口监视其他端口的synced,当所有其他端口的synced全被置位,根端口会将自己的synced置位,然后传回RST BPDU,其中agreement位被置位。
5.Agreed:当指定端口接收到一个RST BPDU时,如果该BPDU中的agreement位被置位且端口角色字段是跟端口,该变量被置位。Agreed变量一旦被置位,指定端口马上转入forwarding状态。
1.p0和p1两个端口马上都先成为指定端口,发送RST BPDU。
2.A的p1口收到更优的RST BPDU,马上意识到自己将成为根端口,而不是指定端口,停止发送RST BPDU。
3.ROOT的p0进入discarding状态,于是发送的RST BPDU中把proposal置1.
4.A收到根桥发送来的携带proposal的RST BPDU,开始将自己的所有端口进入sync变量置位。
5.P2已经阻塞,状态不变;p4是边缘端口,不参与运算;所以只需要阻塞费边缘指定端口p3.
6.P2,p3,p4都进入discarding状态之后,各端口的synced变量置位,根端口p1的synced也置位,于是便向p0返回agreement位置位的回应RST BPDU。该RST BPDU携带和刚才根桥发过来的BPDU一样的信息,除了agreement位置位之外(proposal位清零)。
7.当s1判断出这是对刚刚发出的proposal的回应,于是端口p0马上进入forwarding状态。