关于STP这东西,就是一棵树,树是没有环的,因此在网络里STP这技术的目的,就是为了在有环的冗于网络里,构建一棵存根的树。树有一个根,网络里支持STP的环境中,也有一个根就是根交换机。由根张出许多个枝条,注意,根上会与许多枝条连着,而枝条之间绝对不会连接,而我门的STP环境中,交换机之间的线就是枝条,物理连接实际是有环的,为什么?因为这样可以提高网络的可靠性,增加可用性,但STP做了件伟大的事,就是可以随时随地的制造出一棵动态的树,注意动态2个字的意义,就是说这个树的根,以及枝条的状态随时都会变,但他们的本质不变:在有环的冗于网络制造无环路的可靠网络。如果做到这点?
   实际利用的是一种机械的算法,呵呵。算法这种机制的东西总是机械的。当然制定它很难,是个女的制定了,应用STP的分布式算法。名字不记得了,她还写了ISIS据说。
   好了,既然叫生成树协议。STP是一种协议,只要是协议就会有报文,又叫PDU,用来干什么的?使多台运行同样协议的设备达成一致,通信用的。那STP的PDU我门叫它BPDU,这里包含了一些STP算法所需要的东西,它的格式如下:
Protocol ID ― 恒为0。
Version ― 恒为0。
Type ― 决定该帧中所包含的两种 BPDU 格式类型(配置 BPDU 或 TCN BPDU)。
Flags ― 标志活动拓朴中的变化,包含在拓朴变化通知(Topology Change Notifications)的下一部分中。
Root BID ― 包括有根网桥的网桥 ID。可以细分为两个 BID 子字段:网桥优先级和网桥 MAC 地址。
Root Path Cost ― 通向有根网桥(Root Bridge)的所有链路的积累资本。
Sender BID ― 创建当前 BPDU 的网桥 BID。
Port ID ― 每个端口ID都是由端口优先级别和端有限ssage Age ― 记录 Root Bridge 生成当前 BPDU 起源信息的所消耗时间。
Max Age ― 保存 BPDU 的最长时间,也反映了拓朴变化通知(Topology Change Notification)过程中的网桥表生存时间情况。
Hello Time ― 指周期性配置 BPDU 间的时间。
Forward Delay ― 用于在 Listening 和 Learning 状态的时间,也反映了拓朴变化通知(Topology Change Notification)过程中的时间情况。
这里最重要的就是4个内容完成了STP的一系列比较及选举 ROOT BID。 SENDER BID, PORT ID, ROOT PATH COST其他的都
是协议会话而准备的东西。
到了这里我要解释下ID的意思,ID在这里通常是有2个元素组成,如:ROOT BID,就是由优先级别,以及MAC地址构成,SENDER BID是发送桥的BID也是同上组成,PORT ID,是由接口的优先级别,与接口的号组成。还有网桥就是交换机OK
1:
   既然是树那我门总得把树的根张出来吧,首先需要在STP环境的交换网络里找到一个ROOT。那如何来呢,通过选举
要选ROOT,在一开始所有STP环境中的交换机,在开机之后,都认为自己是ROOT,当然它会把这样的信息发送出去,用的是一个组播MAC地址01-80-2C-00-00-00 ,之所以用组播为的是节约资源。好了这样在经过一些交互之后,大家都知道邻局BPDU的状态了,别望了BPDU中的字段,ROOT BID的意义,它的存在就是为了选根的,一开始这里填的都是自己的,我说过,ROOT是民主选举出来的,也就意味着,我门需要把这个字段的值,与我收到的别人的BPDU中的这个字段的内容进行比较,先看ROOT BID的优先级别,默认是32768,这玩意自己可以改的,如果一样我门就比MAC地址,这东西是唯一的。选小的优先。因此我门总会比较出一个根交换机来,好了到了这里根交换机比出来了,该做什么?根有了自然是枝干。
2:
   我门现在要来选的是非根桥交换机的枝干,其实又叫选根接口,注意了,根接口是在非根交换机上存在的其实就是离根网桥最近的那个接口叫根接口,如何判断是否离根近?
我门有3步比较:
一 比较到根桥的开销,小的优先。注意这个地方根桥发出来的COST永远是0,对方发来的COST,加上自己端口所对应的链路开销之和,来与其他接口收到的消息的计算结果比较,如这里根发的是0。那我并不是直接拿0去比较,我比较的是0+接收该消息接口所对应的COST,之后拿该消息,与其他类式接口的计算结果比较。谁小选谁)
二 比较发送桥的ID,就是SENDER BID,也是小的优先
三 比较端口ID,包过2个内容优先级别和端口号,也是小的优先(注意这里比的是对方的即:发送方的端口,因为BPDU是别人给你的)
这样看来最后绝对会选出一个根接口。其实就是收到的BPDU最好的那个接口,因为以上信息全是在BPDU中携带的。
3
   最后一步选出一个2台交换机之间直连的物理网段的指定接口,这也是之所以无环路的原因所在,关键就是在这里要阻塞个端口。
要知道的是,根交换机上的所有接口都是指定接口,为什么,因为根网桥的优先级别是最高的,因此无论谁的BPDU和它比较都是自杀行为。那在此之后呢,到了这里我门会想到,那在一个物理网段上的2个接口,(就是一根网线的2头),哪一个是阻塞,哪一个是转发的指定接口呢?依然是比较BPDU,看谁的好,之后大家把对接受到对方发的与自己想要发送出去的那份BPDU即自己认为最优的,来一比较,(注意这次比较并不会将COST加上接收接口的COST,因为这次的选举是在一个物理线路的2头进行的,并非要看谁离根最近)。如果对方的好,自己阻塞掉。如果自己的好呢,不用说也知道,自己为指定别人阻塞了嘛

好了到这里3大选举完了,我门选了些什么?根桥,非根桥的根接口,非根桥的指定接口,那在这里只有2个东西是转发的,根接口,指定接口。当然他们有时也会动荡的DOWN下去,那此时怎么办?这个时候就表示拓扑改变了,在这个时候,需要发送TCN消息也就是拓扑改变通知,朝根的方向发过去的,在这段路上,所有的交换机都会用一种叫TCA的消息做应答,除了根以为,因为它还有个重大的认为,就是把TOP改变了告诉树里的所有交换机,也就是说它要告诉大家,现在要重新计算树了。因为有改变。
   每一次改变,接口都会经历5个状态,为什么呢?因为为了解决一些比较愚蠢的接口,在新的STP计算过后,他还不知道自己因该阻塞,而它依然转发,那这时可能会存在临时的环路,因此人门搞出了个办法,给一个足够的时间,让接口知道自己因该处于的状态,所以指定了5种状态,而从阻塞到转发,必须字少经过2个15秒即30秒,(2倍的FLOOWDING DELY)可后来的快速树改变了它又叫RSTP。标准是802.1w,关于STP的 种类和细节,在此不做深入讨论。因为有点多。希望自己看书!

在TOP发生改变之后,就会产生新的BPDU消息,故障接口所在交换机会重新计算STP,然后制造新的BPDU发给全网,但这个BPDU可能因为网络的时延使得网络中其他交换机,的STP计算开始的很晚,这样一来,有些交换机并不知道自己在新TOP中的接口角色,这样的话可能会造成临时环路,解决的办法是,给接口定义一个转发时延,然后定义一个中间状态,当任何一个交换机收到新的BPDU后都会重新计算STP,然后决定接口角色,新的接口不会轻易的进入转发状态,它仅仅是停留在学习状态上,然后再经过一个转发周期即15秒,这样的话所有的交换机都应该已经接收到新的BPDU而计算STP了,那我就能减少环路的可能了。当然你认为不保险你可以吧15秒设置的更大一些。
转发时间是为了估计BPDU能够到达全网而定义的个时间。
而TC消息只是为了让接受TC消息的交换机吧MAC的老化时间定义的短一点这样好快速适应网络的变化。
RSTP,它的握手和替代接口,等方法,在交换机受到BPDU后开始计算STP之后,接口的状态想进入转发的话可以不必要去等待30秒。而是通过一些办法来直接到达转发。
当RSTP接到TC的时候会立刻老化MAC地址这个也是它快的地方。

在运行传统生成树协议时,一个交换网络从初始化到最终的收敛(即交换机的端口处于稳定状态:转发状态或者阻塞状态)需要的时间为Max_Age(端口从Blocking状态进入Listening状态的时间)+Forward_Delay(端口从Listening状态进入Learning状态的时间)+Forward_Delay(端口从Learning状态进入Forwarding状态的时间),缺省配置情况下为20秒+15秒+15秒=50秒,收敛速度缓慢,不适用于承载对延迟敏感的语音、视频等业务的网络。

好了这里有道有意思的题大家来看看,
设交换机1的MAC地址为00-e0-fc-00-00-10,其优先级配置为缺省值32768,交换机2的MAC地址为00-e0-fc-00-10-00,优先级配置为4096。所有端口的优先级采用缺省值,端口号如图,端口1相连的链路的路径费用值为200,端口2相连的链路费用值为20。则被阻塞的端口为(   )}
A. 交换机1的端口1
B. 交换机1的端口2
C. 交换机2的端口1
D. 交换机2的端口2
从题里一看没图,没关系他只要把3大关键内容给了就可以了,BID桥ID,PATHCOST链路开销,PORT ID 端口ID。来看题
SW 1的 优先级别是默认的32768,而交换机2的优先级别是4096,不用思考SW2 肯定是根了。这样来说2上的端口都是指定接口,指定接口不会阻塞。
这里只有2个交换机自然图因该是SW1=====SW2。 中间2根线,连接2台交换机的各自2个接口。2的端口不会阻塞了,那这样说,只会是SW1上的了,
既然是SW1那我门就得选个非根桥的根接口,怎么选?1比连路开销,这里很明显是直接连着的都是0,2比什么发送桥ID,这里都是SW2发的,自然都一样。3,比什么端口ID,先别优先级别,题目有条件所有的端口优先级别都是缺省的即都是128,优先级别一样端口号总不可能一样吧,因此看端口号,1 ,2 谁小?自然是1了,那答案选什么?还等什么呢?
当然是B 因为根接口是1,那非根是2,这里SW2是根桥,SW1是非根桥,根桥所有接口是指定的,那只有SW1的2号接口阻塞了

SW1=====SW2 假设SW1上运行了STP 而SW2上没运行STP,那SW1将收到自己的BPDU注意并不会引起问题,BPDU是会被SW1处理的因为它终结于SW1的1号接口了。而SW2由于不处理BPDU因此FLOODING了。
BPDU消息它人收到之后并不转发,而是处理了,再更新自己的BPDU再发出去。
配置环路保护(port view)
stp loop-protection
对于某一个端口,其中环路保护和根桥保护以及边缘端口只能配置其中之一。
主要是解决链路单通的情况,这个时候如果发现链路收不到对方的BPDU
如SW===SW2 SW上2个接接口1个是根接口,另一个是替换接口,这个时候2根线都是单方向通的半双工的
这个时候SW可能2个接口 都想转到DP状态即指定接口,这个时候开启环路保护,会抑制他们转变状态。
配置TC保护( system view )
stp tc-protection enable
端口由Discarding到Forwarding,系统本实例其它端口会向外发送tc报文。
收到tc报文,会根据mac更新arp。
stp loop-detec... 环路检测
主要是发送报文探询是否有环路如:
SW----SW2---
         |    |
          ---
SW不知道SW2上存在环路了,因为它只有1个接口接SW2 ,而SW2 又没有开启STP因此可以开环路测试,发现则关闭SW上的某接口
STP