为什么要使用生成树协议

   生成树协议是二层链路上的协议。

如上图所示,在二层网络中,交换机起到了很重要的作用,如果有一台交换机出现故障会影响网络的使用,为了避免存在单点故障,在实际的二层链路中会采用链路冗余,也就是采用交换设备之间多条联络连接,即多台交换机之间都有连接,这样即使一台交换机故障了,也可以使用其他交换机。这就是链路冗余

这种做法虽然很好,但是会产生一个致命的问题各个交换机设备之间都有链路连接,数据报到达目的主机的路线会增多,从而使数据报在交换机之间不断的被转发,形成一个环路。

多链路形成环路的致命问题

1. 形成广播风暴:  数据报在环路在不断的被广播转发形成广播风暴。

2. 多重复帧复制: 交换机在接受到不确定单播帧时,将执行泛洪操作,这意味着,在环路中一个单播帧在传输中被复制为多个复本。

3. MAC地址表不稳定: 如果交换机在不同的端口收到同一个帧,它的MAC数据库将会变得不稳定。

   以上三种情况不论是哪一种,都将会使二层网络链路发生崩溃。

解决问题分析 

   我们知道之所有发生这种情况的原因是二层链路形成了环路,为什么形成环路呢?是因为数据帧为到达目的主机会在各个相连的交换机之间互相复制转发和传输形成环路。

   如果我们能给各个数据帧指定一条到达目的主机的最短路径,那么就不会形成环路了,因为数据帧是沿着我们给定的路线传输。这样就解决了因数据帧胡乱传输而形成的环路问题,进而解决了以上的种种问题,而且还能是实现链路冗余的目的。那么这条指定的最短路径要怎么指定呢?可以在链路中加上一个协议,这个协议就是生成树协议

 

生成树协议有哪些

   IEEE协会通过了IEEE802.1d协议,即开天辟地的第一代生成树协议STP,这个协议和其他协议一样,都是随着网络的不断发展而不断更新换代的。到现在为止,该协议一共有三代;

 

 

     第一代 STP/RSTP 

     第二代PVST/PVST+(思科特有)

     第三代 MTSTP/MSTP

我们只对STPRSTPMSTP进行讲解

救世主STP802.1d)又叫 生成树协议

  在这种环路肆虐的时候,如同救世主般的STP来到了我们身边。呵呵     

  STP的主要功能是通过一系列的运算来解决由于备份连接所产生的环路问题。

注意单纯标准的802.1d STP协议并不能实现真正的冗余和负载分担。

STP运行原理简介:

   通过阻断冗余链路将一个有环路的桥接网络修剪成一个无环路的树形拓扑结构,即:能够确保数据帧在某一时刻从一个源出发,到达网络中任何一个目标的路径只有一条,而其他的路径都处于非激活状态(不能进行转发),如果在网络中发现某条正在使用的链路出现故障时,网络中开启了STP技术的交换机会将非激活状态的阻塞端口打开,恢复曾经断开的链路,确保网络的连通性。

 如上图所示:从PC0到达PC1的数据帧会经过中间由三台交换机组成的环路,STP协议会选择一条最短的路径让数据帧从PC0到达PC1。假如,STP协议通过计算,认为走2路——3路到达PC1是最短路径,那么1路就会处于非激活状态,即1路上有关的端口会处于堵塞状态。如果交换机S1出现了故障导致2路和3路不能走了,那么STP就会激活1路,确保数据帧能够到达PC1.

STP原理----顺序四步走:

  1.选择根桥(根交换机)RB

       在网路中需要选择一台根交换机RB,选择RB就需要交换机们自己选择,需要交换机们通信,这些信息被称为BPDU(桥协议数据单元),每2秒发送一次,BPDU中包含的信息较多,但是RB的选择只比较BID(桥ID),BID最小的就是根交换机

      BID=桥优先级+MAC地址。先比较桥优先级,然后再比较桥MAC地址的优先级,一般来说,桥优先级都是一样的,都是32768,所以一般只比较桥MAC地址,MAC地址最小(也就是BID最小)的作为RB

      例如SW1Default优先级 32768   MAC 0c0011111111      

            SW2Default优先级 32768   MAC 0c0022222222

  很明显,在优先级相等的情况下,MAC地址SW2的小,所以SW2为根交换机。

 2.选择根端口RP(要从离根桥最近的端口选)

     对于每台非根桥,要选择一个端口用来连接到根桥,这就是根端口

      注意:根端口只能在非根交换机上选取的。

      当非根桥有多个端口可以连接到根桥时,应该选择性能比较好的端口作为根端口,选择的依据是: 首先比较开销Q,其次比较PID(端口ID

   比如:如下图所示;                                             

 

根据根桥的选取,可以判断SwitchZ为根桥,也就是根交换机。那么SwitchXSwitchY为非根桥,非根桥SwitchX需要选择一个端口(只能选择一个端口)用来连接SwitchZ(根桥),首先比较的是开销Q


带宽 

IEEE802.1d(STP)

IEEE802.1w(RSTP)

10Mb/s

100

2000000

100Mb/s

19200000

1000Mb/s

420000

  通过Port0连接到根桥,Q=19. 

  通过Port1连接到根桥,Q=100+19=119.

 很明显通过Port0连接到根桥的开销Q小,所以选择SwitchXSwitchYPort0为根端口。

    但是假设Q相同的话,就需要比较PID了,PID=端口优先级+端口号,一般来说端口优先级是默认的,所以,端口号越小的端口,将成为根端口。

 注意: 先比较开销,再比较PID

 3.选择指定端口DP

在每一个交换机之间的链路上选择一个端口,作为指定端口。

   例如:如下图所示:

 

上图中共有3个网段,X-YY-ZX-Y,其中前两个网段的指定端口都是SwitchZ(根桥)上的端口,因为根桥没有根端口,有的只是指定端口,而X-Y(红线网段)的指定端口需要选择,依据如下:

X到达根桥的开销Q=19

Y到达根桥的开销Q=19

由于Q相同,需要比较BID(指定端口ID),SwitchXBID小,所以位于SwitchX上的port1将成为该网段的指定端口。

 4.RP、DP设置转发状态,其他端口设为阻塞状态

      选出来的RPDP将设为转发状态,既不是根端口也不是指定端口的其他端口将被Block

 通过上述四部走,就可以形成无环路的网络。

STP计时器

  一共有3个:

   1. Hello Time:  根桥发送BPDU之间的时间间隔,也是网络初始化的时候,每个网桥发送各自的BPDU的时间间隔。

  2.Forwarding Time : 指一个端口ListeningLearning的各自时间,默认为15s,为了保证BPDU在全网中的转发,所以做如此设定,这个值是可以配置的,由于Forwarding Time 的限制,一般建议网络的直径应小于7

3. Max Age : 存储BPDU最长的时间,超过这个时间端口接受不到BPDU,就会采取相应的措施。这个时间默认为20s.

注意: 这三个时间在拓扑稳定后都是由根桥发出的,由根桥在全网统一计时器,在根桥修改才有效。

STP端口状态概述

  当协议信息BPDU通过一个交换网络时。可能发生传播延时,那么交换网络的拓扑结构就可能会发生改变。

   每一个使用STP的二层LAN端口存在以下5种状态:

  1.  阻塞(Blocking10s 端口不能参与帧的转发发

  2.  侦听(Listening15s 这是端口自阻塞状态后的第一个过渡状态。STP认为这种状态的二层LAN端口应当参与帧的转发

  3. 学习(Learning15s 处于准备参与帧转发状态

  4.转发(Forwarding:端口可以正式转发帧了

  5. 禁止(Disabled):端口不参与STP,不转发帧。

STP端口拓扑变化:

 当启用STP后,设备开启电源后,每个端口和网络都要经历阻塞、侦听、学习这类的过渡状态。如上图所示。

   1.阻塞状态端口变化: 网络设备在交换BPDU之前,都是假设自己为根的,并且端口在初始化时,总是先置于阻塞状态。交换BPDU后就可以确定哪个设备作为根桥。

处于阻塞状态的端口执行以下任务:

     丢弃从所在网段中接收的帧; 

     丢弃与其他转发端×××换的帧

     不把终点位置添加到地址数据库中。

     接收BPDU,并且把它们直接传到系统模块中。

     不传输从系统模块中接收到的BPDU

   2. 侦听状态端口变化: STP确定这个二层LAN端口应当参与帧转发时,进就进入到了侦听状态

处于侦听状态的端口执行以下任务:

      丢弃从所在网段中接收的帧; 

     丢弃与其他转发端×××换的帧

     不把终点位置添加到地址数据库中。

     接收BPDU,并且把它们直接传到系统模块中。

         接收、处理和传输从系统模块中接收到的BPDU

3.学习状态:从侦听状态进入到学习状态:

 处于学习状态将执行以下任务:

     丢弃从所在网段中接收的帧; 

     丢弃与其他转发端×××换的帧

     把终点位置添加到地址数据库中。

     接收BPDU,并且把它们直接传到系统模块中。

         接收、处理和传输从系统模块中接收到的BPDU

4.转发状态端口变化 处于转发状态的端口可以正式转发帧了。

处于侦听状态的端口执行以下任务:

     转发从所在网段中接收的帧; 

     转发与其他转发端×××换的帧

     把终点位置添加到地址数据库中。

     接收BPDU,并且把它们直接传到系统模块中。

         处理和传输从系统模块中接收到的BPDU

5.禁用状态的端口变化处于禁用状态的端口不参与帧转发或者STP

         注意: 这种把二层端口置于禁用状态的行为是不建议的,因为这相当于一宗浪费

 

处于侦听状态的端口执行以下任务:

     丢弃从所在网段中接收的帧; 

     丢弃与其他转发端×××换的帧

     不把终点位置添加到地址数据库中。

     不接收BPDU,并且把它们直接传到系统模块中。

这就是整个网络中交换机拓扑端口的变化,直到最后网络稳定。


 

总结---STP运行过程梳理

假设S1为根交换机

   当网络稳定后,这种稳定状态下,根交换机S1 向网络中以2s一次的频率发送BPDU报文,非根交换机S2通过根端口接受BPDU,然后通过指定端口向S3发送BPDU报文。通过这种方式,BPDU报文可以顺利的扩散到网络的每台交换机。 

但是当网络拓扑发生变化时,交换机会向根交换机方向发送TCN BPDU报文,这儿的变化有以下几种情况:(当出现以下几种情况后,当事交换机就会发送TCN BPDU

     1. 处于转发状态或者监听状态的端口过渡到阻塞状态,这个状态通常是链路故障

      2. 处于未启用状态的端口进入转发状态,这个状态通常是增加了新的链路

     3. 交换机从指定端口收到TCNBPDU报文。

假设S3出现了以上情况中的一种,那么交换机就认为网络拓扑发生了变化,将执行步骤1S3从根端口向根交换机的方向发送TCN BPDU报文(这儿的方向是向S2),S2通过指定端口接受TCN BPDU ,执行步骤2,然后发送给S3 一个TCA,同时执行步骤3,向根交换机的方向发送TCN BPDU报文,S1(根交换机)收到TCN BPDU报文后执行步骤4,向S2发送TC BPDUS2接受到TC BPDU后再转发给S3。接受到TC BPDU报文后的交换机S2S3将自己的MAC地址表老化时间(生存时间)设置为15s,开始学习新的转发路径,达到网络的稳定。


   在端口的变化中,从阻塞到侦听状态,需要10s的时间,从侦听到学习需要15s,从学习到转发需要15s

    这个时间在现在高速发展的网络中是不能接受,因为太慢了,有没有一种可以收敛这些时间的生成树协议呢?

    答案是有的,那就是RSTP---快速生成树协议。我们的下一篇文章再来探讨,看看RSTP到底快在什么地方。