STP高级

STP基础部分

技术背景

  • 接入层交换机单链路上联,存在单链路故障
  • 物理链路冗余,解决了单链路故障问题,但是二层环境存在环路
  • 另一个问题的单点故障,如果任意一个汇聚设备宕机,将直接导致下联的接入网络挂掉

  • 生成树可以有效的解决这个问题
  • 通过生成树协议,在逻辑上将特定端口进行block,从而实现物理上存在冗余环境,而二层又阻止环路的产生
  • 当拓扑发生变更的时候,生成树协议能够探测这些变化,并且及时自动的调整接口状态,从而适应网络拓扑的变化,实现链路冗余

生成树的标准

  • 802.1D
  • PVST+ 思科Cisco私有协议,每个VLAN拥有一颗单独的生成树实例
  • 802.1W RSTP
  • 802.1S MSTP
  • PVRST+ Cisco私有,对RSTP的增强版

STP的操作

  • 每个广播域选择一个根桥
  • 每个非根桥上选择一个根端口
  • 每个段选择一个指定端口
  • 选择一个非指定端口
    • 根端口:具有最低根路径的接口要考虑的因素:
    • 1.最低根桥ID
    • 2.到根桥的最低路径成本
    • 3.最低的发送者网桥ID
    • 4.最低的发送者端口ID

端口的状态

  • Disable 不收发任何报文
  • Blocking 不接受也不转发帧,接收但不发送BPDU,不学习MAC地址
  • Listening 不接受也不转发帧,接收并且发送BPDU,不学习MAC地址
  • Learning 不接受也不转发帧,接受并且发送BPDU,学习MAC地址
  • Forwarding 接受并转发帧,接受并且发送BPDU,学习MAC地址

STP 拓扑变更

  • TCN BPDU概述
  • 当网络拓扑出现变更的时候,最先意识到变化的交换机将发送TCN BPDU
  • 在发生以下时间时,交换机将发送TCN:
    • 对于正在处于转发和监听状态的接口,过渡到Block状态(链路故障的情况)
    • 端口进入转发状态,并且网桥已经拥有指定端口
    • 非root网桥在它指定的端口收到TCN

    1. SwitchA挂掉
    1. SwitchB最先检测到拓扑变化,于是产生TCNBPDU并从根端口发送出去(因为根端口是朝着根桥的方向),B将连续发送TCN BPDU直到指定交换机C发送TCNACK进行确认
    1. SwitchB收到这个TCN BPDU,回送一个TCN ACK进行确认,同时向自己的根端口转发这个TCN BPDU
    1. Root收到这个TCN,回送一个TCN ACK给C
    1. Root修改自己的配置BPDU,以此来通告整个交换网络关于拓扑变更的情况。Root在配置BPDU中设置一段时间的拓扑变更(TC标志),这段时间等于转发延迟+Max.Age,默认35S
    1. 当交换机收到Root发出的这个TC标志置位的配置BPDU,它们使用转发延迟计时器(默认15S)来更新其MAC地址表中的条目。也就是说条目的寿命由原来的300S的默认值变成15S,这样能保证MAC地址条目更快速的刷新。交换机将持续这个过程,直到不再从Root收到TC BPDU消息为止。

PVST+

扩展的SystemID

  • CISCO CATALYST交换机的MAC地址池最多可以容纳1024个地址,交换机的型号决定了可用MAC的数目,并不是所有catalyst交换机都能支持到这么多个MAC
  • 这些MAC地址作为VLAN生成树中的网桥ID的MAC地址部分。不同的交换机型号支持不同的可用MAC地址数目。交换机依照次序分配MAC地址
  • Show run int | include bia能看到所有的MAC,其中第一个MAC将被生成树使用,也就是CPU的MAC。接下去就是每个以太网接口的MAC。
  • 我们知道交换机能够支持的VLAN的数据是很庞大的,如果开启PVST+,每个VLAN-棵生成树,而没棵生成树都要有一个独立的标识,都需要耗费一个MAC的话,那么MAC地址池肯定是无法承受的。
  • 因此需要使用到MAC地址缩减方案

Portfast

  • 在交换机上,将连接主机的接口配置为portfast
  • Portfast接口可以绕过listening和learning状态直接进入forwarding状态

RSTP

概述

  • 802.1w
  • 端口角色:根端口、指定端口、替代端口、备份端口
  • 端口状态:转发、丢弃、学习
  • 在思科catalyst交换机上,pvst+(pvrst+)是基于RSTP实现的perVLAN版本

BPDU

  • 00 未知
  • 01 替代/备份
  • 10 根端口
  • 11 指定端口

BPDUs检测过程

  • B丢失了到Root的路径
  • 认为自己是Root
  • 于是发送“我就是Root”的次优BPDU

  • C知道Root还活着
  • 立即发送包含Root信息的BPDU给B
  • B接受BPDU,并且把连接C的接口设定为根端口

BPDUGuard

  • 该接口收到BPDU报文后,会立即切换到err-disable状态
  • 常搭配portfast特性在接口上一起使用,用于连接主机
  • 可在接口上激活,也可在全局模式上配置,两者有所不同

边缘端口edge-ports

  • RSTP定义的端口类型与postfast十分类似
  • 因为这些接口用于连接主机,所以一般不会产生环路。这写端口可以跳过LST或LRN直接过渡到转发状态
  • 而且当这这些接口up down的时候不会引起拓扑变更
  • 另外,边缘端口收到BPDU,则立即丢失边缘端口的特征,变成一个普通的Spanning Tree接口
  • 在catalyst交换机上,可以用postfast关键字来进行手工配置

Rapid Transition to Fowarding State

  • RSTP能够在边缘端口及P2P链路上快速过度。
  • RSTP的链路类型是通过接口的双工状态自动获取到的,如果接口时半双工,那么链路类型是shared port,如果是全双工那么就是p2p。
  • 当然,接口的链路类型可以通过命令修改,接口模式下:spanning-tree link-type ?

链路类型

  • P2P(点对点)
  • shared port(共享端口)

收敛对比:802.1D

  • A及Root之间新增链路Link1
  • A及root在link1两端的接口都进入Listening状态,A将收到Root发出来的BPDU
  • A将BPDU从自己的指定端口发送出去,BPDU被泛洪到网络中
  • B和C收到这个更优的BPDU,继续向网络中泛洪
  • 数秒后,D收到这个BPDU,Block掉端口P1

Tips:**由于缺乏feednack机制,A连接root的接口从listening到Forwarding,需要经历152s的延迟。此时A、B、C下联的用户流量就出现了问题(因为D收到更优的BPDU后,将P1口block了,这时候ABC相当于在A的根端口过渡到forwarding之前都处于网络的“隔离地带”)*

收敛对比:RSTP

  • A及Root之前新增链路Link1

  • A及Root在Link1两端的接口在up之后进入designated blocking。然后双方交互BPDU消息。这个过程实际上是一个协商的过程

  • A在收到Root发送的BPDU后,将自己的所有非边缘端口Block(这个过程称为同步sync),并且回送一个agreement消息给Root
  • 在此之后,Root及A在link1上的端口立即都过渡到转发状态。而网路目前是没有环路的,A往下的网路目前是切断的

  • A与B和C之间,开始一轮新的协商,BC收到A发送的bPDU后,完成同步Sync过程,将自己的非边缘端口Block掉,然后都向A回送agreement信息。同时ABC互联的接口进入转发状态。在BC同步操作的过程中,B下联全是主机,因此没有端口被Blcok(已经完成同步);而C要block掉连接D的端口

  • 完成上一步后,生成树状态如图
  • 最终BPDU到达D,D将P1口Block掉

Tips:

在RSTP收敛过程中,耗费是时间仅仅是BPDU从Root泛洪到网络末端的时间,不用受到任何Timer的限制,直接绕过两个转发延迟时间。因此收敛速度更快。

  • 有两点需注意:
    • 交换机之间的这种协商机制只在P2P链路上被执行
    • 边缘端口的配置非常重要,如果配置不当有可能会在同步过程中被BLOCK。

Proposal/Agreement Squence

Root和A之间新增了一条链路,链路两端的接口在收到对方发送的BPDU前是designated blocking状态

  • 当一个被选举为指定端口的接口在discarding或learning状态(目只在这个状态),它在其发送的BPDU中进行proposalbit置位。这就是步骤1的P0的情况

  • 在A完成同步后,A就可以将新选出的根端口unblock并且发送一个agreement消息给Root。这个agreement消息是A的proposal消息的拷贝,但是agreement bit置位了。
  • 如此一来,P0就收到了应答,立即转为forwarding。注意这时候P3接口仍处于designateddiscarding状态,于是它向它的邻居网桥去发送proposal,而且也在积极等待回传的agreement以便进入forwarding状态

Cisco STP toolkit

  • Portfast
  • BPDUGuard
  • BPDUFilter
  • UplinkFast
  • BackboneFast
  • RootGuard
  • LoopGuard
  • UDLD

基础配置

1
2
3
Switch(config)# spanning-tree vlan-id		#激活特定VLAN的stp
Switch(config)# spanning-tree vlan vlan-id priorty pri #配置桥优先级,这里注意是perVLAN的,优先级默认3
Switch(config)# spanning-tree vlan vlan-id root {primary | secondary} [diameter diameter] #设置主根次根,该交换机在默认优先级的状态下vlan优先级为24576,如果是secondary,则为28672
1
2
3
4
5
Switch(config-if)# spanning-tree [vlan vlan-id] cost cost
Switch(config-if)# spanning-tree [vlan vlan-id] post-priority pri
Switch(config)# spanning-tree [vlan vlan-id] hello-time sec
Switch(config)# spanning-tree [vlan vlan-id] forward-time sec
Switch(config)# spanning-tree [vlan vlan-id] max-time sec
1
2
Switch(config)# spanning-tree postfast default
Switch(config-if)# spanning-tree portfast [trunk]