一、STP算法
     IEEE802.1D标准定义了STP的生成树算法。该算法依赖于BID、路径开销和端口ID参数来做出决定。
     1、BID(网桥ID):
     BID是生成树算法的第一个参数,BID决定了桥接网络的中心,称为根网桥或根交换机。
BID参数是一个8字节域。前2个字节(10进制)称为“网桥优先级”,后6个字节(16进制)是交换机的一个MAC地址。
网桥优先级用来衡量一个网桥的优先度,范围是0-65535,默认是32768。
思科交换机中的PVST+(每VLAN生成树)生成树协议使每个VLAN都有一个STP实例。
比较两个BID的大小的原则:一是网桥优先级小的BID优先,二是如果网桥优先级相同,BID中的后六个字节的MAC小的则BID优先。
     2、路径开销:
     路径开销是生成树算法的第二个参数,决定到根网桥(根交换机)的路径。
     通俗说,路径开销是用来衡量网桥之间的距离的远近的,其值是两个网桥之间某条路径上所有链路开销的总和。
     路径开销与跳数无关。
     路径开销决定到根网桥或根交换机的最佳路径,最小的路径开销是到根交换机的最佳路径。
     路径开销的值的规律:带宽越大,STP开销越小。
     3、端口ID:端口ID是生成树算法的第三个参数,也决定到根交换机的路径。它由2个字节组成,包括“端口优先级”和“端口号”,各占8位。
     端口优先级值从0-255,默认128;端口号包括256个。
     端口ID大小的判定与BID大小的判定相同。
     二、STP的过程
     1、STP判决和BPDU交换:
     当创建一个逻辑无环的拓扑时,STP总是通过发送BPDU的第二层帧来传递生成树协议,并执行相同的4步判决顺序:
     步骤1,确定根交换机;
     步骤2,计算到根交换机的最小路径开销;
     步骤3,确定最小的发送者BID;
     步骤4,确定最小的端口ID。
     网桥为每个端口存储一个其收到的最佳BPDU,当有其他的BPDU到达交换机的端口时,交换机会使用四步判决过程来判断此BPDU是否比该端口原来存储的BPDU更好,如果新收到的BPDU(或者本地生成的BPDU)更好,则替换原有值。
     当一个网桥第一次被激活时,其上所有端口每隔一个HELLO时间(默认2秒)发送一次BPDU;如果一个端口发现从其他网桥收到的BPDU比自己发送的好,则本地端口就停止发送BPDU;如果在MAX AGE(最大生存时间,默认20秒)内没有从邻居网桥收到更好的BPDU,本地端口则重新开始发送BPDU,即最大生存时间是最佳BPDU的超时时间。
     2、STP收敛的三个步骤:
     生成树算法收敛于一个无环拓扑的初始过程包含三个选举步骤:
     步骤1    选举一个根交换机。
     步骤2    选举根端口。
     步骤3    选举指定端口。
     在网络第一次“初始”时,所有网桥都洪泛混合的BPDU信息,网桥通过执行STP四步判决过程,形成整个网络或VLAN惟一的生成树。在网络稳定后,BPDU从根网桥流出,沿着无环支路到达网络中的每一个网段。网络发生变化时,生成树协议按照收敛三个步骤做出处理。
     (1)选举根交换机:
     根交换机是一个具有最小BID的网桥,它是惟一的,是通过交换BPDU选举得出来的。
BPDU的格式:BPDU是网桥之间用来交换生成树信息的特殊帧,它在网桥之间传播,包括交换机和所有配置来进行桥接的路由器,BPDU不携带终端用户流量。
BPDU包括根BID、根路径开销、发送者BID和端口ID信息。
     也就是说,交换机通过传递BPDU来发现谁是最小的BID,从而将具有最小BID的网桥做为根交换机。最初时,交换机总将自己认为是根网桥,当它发现有比自己小的BID时,就将收到的具有最小BID的交换机作为根网桥。
     (2)选举根端口:
     在根交换机选举完后,就开始选举根端口了。所谓根端口,就是按照路径开销最靠近根交换机的端口,也就是说具有最小根路径开销的端口。每一个非根交换机都必须选举一个根端口。
     (3)选举指定端口:
     通过以上两个步骤后,生成树算法还没有消除任何环路,因为还没有选举指定端口。所谓指定端口,就是连接在某个网段上的一个桥接端口,它通过该网段既向根交换机发送流量也从根交换机接收流量。桥接网络中的每个网段都必须有一个指定端口。
     指定端口也是根据最小根路径开销来决定,因此根交换机上的每个活动端口都是指定端口,因为它的每个端口都具有最小根路径开销(实际是它的根路径开销是0)。
     注意:指定端口只在中继端口(TRUNK口)起作用。接入端口在指定端口选举中不起任何作用。接入端口是用来连接到主机或者三层端口的。
     3、STP状态
     在网桥已经确定了根端口、指定端口和非指定端口后,STP就准备开始创建一个无环拓扑了。
     为创建一个无环的拓扑,STP配置根端口和指定端口转发流量,非指定端口阻塞流量。
     实际上,STP决定端口转发和阻塞看似只有这两个状态,实际上是有五种状态的。
     (1)、Disabled(为了管理目的或者因为发生故障将端口关闭);
     (2)、Blocking(在初始启用端口之后的状态。端口不能接收或者传输数据,不能把MAC地址加入地址表,只能接收BPDU(bridge protocol data unit)。如果检测到有一个桥接环,或者端口失去了它的根端口或者指定端口的状态,那么就会返回到Blocking状态);
     (3)、Listening(如果一个端口可以成为一个根端口或者指定端口,那么它就转入监听状态。此时端口不能接收或者传输数据,也不能把MAC地址加入地址表,但可以接收和发送BPDU);
     (4)、Learning(在Forward Delay计时时间到(默认15秒)后,端口进入学习状态,此时端口不能传输数据,但可以发送和接收BPDU,也可以学习MAC地址,并加入地址表);
     (5)、Forwarding(在下一次转发延时计时时间到后,端口进入转发状态,此时端口能够发送和接收数据、学习MAC地址、发送和接收BPDU)。
     在这些状态过程中,会引发网络拓扑结构发生改变。此时,发生变化的交换机会在它的根端口上每隔hello time时间就发送TCN BPDU,直到上级的指定网桥邻居确认了该TCN(拓扑结构变化通知)为止。当根网桥收到后,会发送设置了TC(topology change,拓扑改变)位的BPDU,通知整个生成树拓扑结构发生了变化。这会让所有的下级交换机把它们的Address Table Aging(地址表老化)计时器从默认值(300秒)降为Fordwarding Delay(默认为15秒),从而让不活动的MAC地址比正常情况下更快地从地址表更新掉