一个局域网通常由多台交换机互连而成,为了避免广播风暴,我们需要保证在网络中不存在路径环路,也就是说所有链路应该组成一颗无回环的树,交换机上的STP(生成树协议)就实现了这样的功能。在本章中我们首先会学习有关STP协议的一些基本概念,以及STP协议是如何通过实现冗余链路的闭塞和开启从而实现一棵动态的生成树的,最后我们还会介绍一下RSTP(快速生成树协议)和MSTP(多生成树协议),以及如何在交换机上对生成树进行配置。


STP产生背景

路径回环的影响

第十三章 生成树协议_第1张图片

    在交换网络中,网桥不会对以太网数据帧做任何修改,帧中也不会记录到底经过了几个网桥。如果网络小红存在环路,帧有可能在环路中不断循环和增生,造成网络带宽被大量重复帧占据,导致网络拥塞。

    上图中是一个由于环路造成数据帧循环和增生的例子。

    开始,假定PCA还没有发送过任何帧,因此网桥SWA、SWB和SWC的地址表中都没有PCA的地址记录。

    当PCA发送了一个帧,最初三个网桥都接收了这个帧,记录PCA的地址在物理段A上,并将这个帧转发到物理段B上。

    网桥SWA会将此帧转发到物理段B上,从而SWB和SWC将会再次接收到这个帧,因为SWA对于SWB和SWC来说是透明的,这个帧就好像是PCA在物理段B上发送的一样,于是SWB和SWC记录PCA在物理段B上,将这个新帧转发到物理段A上。

    同样的道理,SWB会将最初的帧发到物理段B上,那么SWA和SWC都接收到这个帧。SWC认为PCA仍然在物理段B上,而SWA又发现PCA已经转移到物理段B上了,然后SWA和SWC都会转发新帧到物理段A上。如此下去,帧就在环路中不断循环,更糟糕的是每次成功的帧发送都会导致网络中出现两个新帧。

STP的作用

第十三章 生成树协议_第2张图片

    尽管透明网桥存在这个隐患,但是它的应用还是相当有诱惑力的,因为透明网桥在无回路的网络中发挥的作用是无可指摘的。那么是不是就认为我们不能组建有回路的网络呢?这显然是不合适的,因为回路的存在可以在拓扑结构的某条链路断开之后,仍然保证网络的连通性。

    为此,我们找到了一种很好的算法,它通过阻断冗余链路将一个有回路的桥接网络修剪成一个无回路的树形拓扑结构,这样既解决了回路问题,又能在某条活动(active)的链路断开时,通过激活被阻断的冗余链路重新修剪拓扑结构以恢复网络的连通。

    上面的图中给出了一个应用生成树的桥接网络的例子,其中字符ROOT所标识的网桥是生成树的树根,实线是活动的链路,也就是生成树的枝条,而虚线则是被阻断的冗余链路,只有在活动链路断开时才会被激活。

STP生成树协议

第十三章 生成树协议_第3张图片

    STP(Spanning Tree Protocol,生成树协议)是根据IEEE协会制定的802.1D标准建立的,用于在局域网中消除数据链路层物理环路的协议。运行该协议的设备通过彼此交互信息发现网络中的环路,并有选择的对某些端口进行阻塞,最终将环路网络结构修剪成无环路的树型网络结构,从而防止报文在环路网络中不断增生和无限循环,避免设备由于重复接收相同的报文造成的报文处理能力下降的问题发生。

    STP包含了两个含义,狭义的STP是指IEEE 802.1D中定义的STP协议,广义的STP是指包括IEEE 802.1D定义的STP协议以及各种在它的基础上经过改进的生成树协议,如RSTP、MSTP。

    STP采用的协议报文时BPDU(Bridge Protocol Data Unit,桥协议数据单元),BPDU中包含了足够的信息来完成生成树的计算。

    BPDU在STP协议中分为两类:

  • 配置BPDU(Configuration BPDU):用来进行生成树计算和维护生成树拓扑的报文。

  • TCN BPDU(Topology Change Notification BPDU):当拓扑结构发生变化时,用来通知相关设备网络拓扑结构发生的报文。


配置BPDU的生成和传递

    STP协议的配置BPDU报文携带了如下几个重要信息:



    • 根桥ID(RootID)

      由根桥的优先级和MAC地址组成。通过比较BPDU重根桥ID,STP最终决定谁是根桥。

    • 根路径开销(RootPathCost)

      到根桥的路径开销。根端口选举时,开销最小的端口被选举为根端口:指定桥选举时,开销最小的桥北选举为指定桥。

    • 指定桥ID(DesignatedBridgeID)

      根端口选举时,所连桥ID最小的端口被选举为根端口。指定桥选举时,桥ID最小的桥被选举为指定桥。

指定端口ID(DesignatedPortID)

根端口选举时,所连端口ID最小的端口被选举为根端口。

各台设备的各个端口再初始时会生成以自己为根桥的配置消息,根路径开销为0,指定桥ID为自身设备ID,指定端口为本端口。各台设备都向外发送自己的配置信息,同时也会收到其他设备发送的配置消息。通过比较这些配置消息,交换机进行生成树计算,选举根桥,决定端口角色。


网络收敛后,根桥会按照一定的时间间隔产生并向外发送配置BPDU,其他的设备对该配置BPDU进行转发,从而保证拓扑的稳定。


根桥的选举

第十三章 生成树协议_第4张图片

    树形的网络结构,必须要有树根,于是STP引入了根桥(Root Bridge)的概念。

    网络中每台设备都有自己的桥ID,桥ID由优先级(BridgePriority)和桥MAC地址(BridgeMacAddress)两部分组成。因为桥MAC地址在网络中是唯一的,所以能够保证桥ID在网络中也是唯一的。在进行桥ID比较时,先比较优先级,优先级值小者为优;在优先级相等的情况下,再用MAC地址来进行比较,MAC地址小者为优。

    网络初始时,网络中所有的STP设备都认为自己是“根桥”。设备之间通过配置BPDU而比较桥ID,网络中桥ID最小的设备被选为根桥。根桥会按照一定的时间间隔产生并向外发送配置BPDU,其他的设备对该配置BPDU进行转发,从而保证拓扑的稳定。

    在上图中,因为SWA的桥ID最小,所有SWA被选举为根桥。

端口角色的确定

第十三章 生成树协议_第5张图片

    STP的作用是通过阻断冗余链路使一个有回路的桥接网络修剪成一个无回路的树型拓扑结构。它通过将环路上的某些端口置为阻塞状态,不允许数据帧通过而做到这一点。下面是确定哪些端口是阻塞状态的过程:

  1. 根桥上的所有端口为指定端口(Designated Port);

  2. 为每个非根桥选择根路径开销(RootPathCost)最小的那个端口作为根端口(RootPort),该端口到根桥的路径是此网桥到根桥的最佳路径;

  3. 为每个物理段选出根路径开销最小的那个网桥作为指定桥(Designated Bridge),该指定桥到该物理段的端口作为指定端口,负责所在物理段上的数据转发;

  4. 既不是指定端口也不是根端口的端口置于阻塞状态。

根路径开销


    根路径开销(RootPathCost)是生成树协议中用来判断到达根的距离的参数。它是到达根的路径上所有链路开销(Cost)的代数和。

    非根桥进行根端口选举时,会首先比较各端口的根路径开销,开销最小的端口被选举为根端口;物理段进行指定桥选举时,也会首先比较各桥的根路径开销,开销最小的桥北选举为指定桥。

    通常情况下,链路的开销与物理带宽成反比。带宽越大,表明链路通过能力越强,则路径开销越小。

    IEEE802.1D和802.1t定义了不同速率和工作模式下的以太网链路(端口)开销,H3C则根据实际的网络运行状况优化了开销的数值定义,制定了私有标准。上述三种标准的常用定义如表所示。其他细节定义请参照相关标准文档及设备手册。

第十三章 生成树协议_第6张图片

    H3C交换机默认采用私有标准定义的链路开销。交换机端口的链路开销可手工设置,以影响生成树的选路。

通过桥ID决定端口角色


  在跟路径开销和指定桥ID都相同的情况下,生成树协议根据端口ID来决定端口角色。

  如果非根桥上多个端口经过相同的上游到达根,且根路径开销相同,则协议会比较端口所连上游桥的端口ID,所连端口ID最小的端口被选举为根端口。

    端口ID由端口索引号和端口优先级两部分组成。在进行比较时,先比较端口优先级,优先级小得端口优先;在优先级相同时,再比较端口索引号,索引号小得端口优先。

    上图中,SWB上的2个端口连接到SWA,这2个端口的根路径开销相同,上游指定桥ID也相同,协议根据上游指定端口ID来判定,所连指定端口ID小得端口为根端口。

    在通常情况下,端口索引号无法改变,用户可通过设置端口优先级来影响生成树的选路。

端口状态

第十三章 生成树协议_第7张图片

    事实上,在802.1D的协议中,端口共有五种状态:

  • Disabled:表示该端口处于失效状态,不接收和发送任何报文,这种状态可以是由于端口的物理状态(比如端口物理层没有up)导致的,也可能是管理者手工将端口关闭。

  • Blocking:处于这个状态的端口不能够参与转发数据报文,但是可以接收配置消息,并交给CPU处理。不过不能发送配置消息,也不进行地址学习。

  • Listening:处于这个状态的端口也不参与数据转发,不进行地址学习;但是可以接收并发送配置消息。

  • Learing:处于这个状态的端口也不参与数据转发,但是开始地址学习,并可以接收、处理和发送配置消息。

  • Forwarding:一旦端口进入该状态,就可以转发任何数据了,同时也进行地址学习和配置消息的接收、处理和发送。

    以上五种状态中,Listening和Learing是不稳定的中间状态。