STP/RSTP原理<2>
STP端口状态
在STP中,端口有三种角色:Root端口、Designated端口和Nondesignated端口。每个端口可能会有五种工作状态,见图8
图8
图9是另一种描述,其中√表示具备该项功能
状态 | 收BPDU | 发BPDU | 学习MAC | 收/发数据 |
Disabled(禁用) | X | X | X | X |
Blocking(阻塞) | √ | X | X | X |
Listening(侦听) | √ | √ | X | X |
Learning(学习) | √ | √ | √ | X |
Forwarding(转发) | √ | √ | √ | √ |
图9
图10表示这五种端口状态之间是可以转换的,导致端口状态转换的发起者有两个:一是STP协议的运行,二是管理员的操作,这两者都可以引起Port在五种状态之间转换。Listening经过一段时间进入Learning状态,Learning状态经过一段时间进入Forwarding状态,这两段时间叫做Forward Delay Time,通过定时器Forward Delay Timer来计时。正是由于有这两个Timer,而且时间还不断,促使STP发展为RSTP。RSTP后面会讲。
图10
STP的初始化
前面讨论了STP的工作原理,下面来看一下STP到底是如何工作的。从STP的初始化开始吧,也就是上电以后,Enable STP的交换机如何动作的。
参与STP的每台交换机需要配置ENABLE STP项,在完成配置以后,这台交换机才会参与到整个网络的STP算法中,下面以交换机上电开始:
选举根桥
注意上电后的交换机,每个参与STP的端口,都要经历阻塞——侦听——学习这类的过渡状态,但各状态之间的切换,是有条件的。
开启STP功能的交换机上电后,默认自己为根桥,并且所有的端口都初始化为Blocked状态。通过图8、9可以知道,处于Blocked状态的端口只能接受BPDU,其他什么都不干。
如果一个Blocked端口,15s之内没有收到任何BPDU,该端口就会从Blocked状态过渡到侦听状态(Listening)。或者这个Blocked端口认为自己应该成为Root端口或者指定端口,也立即进入侦听状态。除此两种情况,Blocked端口一直保持Blocked状态,持续到上述两个触发条件发生。
进入侦听状态后,端口就可以收、发BPDU了。侦听状态下各设备和端口将确定自己的角色,选举出根桥、根端口、指定桥和指定端口。
侦听状态下的端口就向与其相连的其它交换机发送自己所在交换机的配置BPDU报文。该报文中的BID就是发送设备自己的ID,交换机发出BPDU的同时也会收到来自其它交换机的BPDU,交换机会将这两个BPDU报文进行对比。首先比较BID的大小。该BID中的优先级可以由用户对交换机配置,没有配置则所有交换机的默认优先级都是一样的。然后再比较BID中的MAC地址。如果一台交换机发现自己收到的BPDU中BID比其自身的要小,则这台交换机就不再转发自己的BID,而是开始转发较小BID的BPDU。通过这种方式,整个网络很快就只会发送BID最小的BPDU了,于是大家就会都知道哪台交换机的BID最小了,并共同认定该台交换机为根桥。同时除此根桥之外的交换机也都可以确认自己为非根桥,于是每台交换机都确定了自己的角色。根桥确定之后,根桥上的所有端口都变为指定端口,可以接收\转发数据与BPDU了。下一步就是还是在该侦听阶段,确定网络内各端口的角色。
在这个过程中,涉及到一个概念,交换机发出自己的BPDU(或者转发收到的来自其它交换机的BPDU),在转发的时候,原先的Configuration BPDU中的成本字段值是要改变的,要增加本身端口的成本。
非根桥交换机会将从根桥发来的BPDU里面的三个部分进行更改:1.发送BID;2.根路径成本;3.发送端口ID(PID),把更改后的BPDU发给下游交换机。
看图11.
图11路径成本的传递
假设到达Bridge 1的cost为original cost,那么从Bridge1的p1端口出来的BPDU,经过LAN2到达Bridge3的p3端口时,cost为10+ original cost,因为Bridge 1的端口1成本为10。而Bridge3再通过其p1端口转发时,cost将达到original cost+10(Bridge 1 p1端口成本)+2(Bridge 3 p1端口成本),而不是original cost+22,也即只有在发送Configuration BPDU时增加cost,接收时,并不增加cost。通过这种机制,任何一个端口在收到根桥BPDU后,就会知道自己距离根桥到底多远了。
如果网络中已经存在根桥,则网络中其他网桥存储了根网桥的信息,当其他网桥(或根网桥)收到新启动网桥的自认为根桥的Configuration BPDU时,将其Priority vector中的Root Bridge ID与现有根桥的Bridge ID相比较,如果其Root Bridge ID项小于现有根网桥的Bridge ID,则认为新启动网桥为根网桥,并更新本地的根桥配置信息,并转发其Configuration BPDU;如果其Root Bridge ID项不小于现有根网桥的Bridge ID,则将自己知道的根桥信息,生成一个Configuration BPDU,从接收端口发送出去,而后新启动网桥接收到该Configuration BPDU,则获知Root Bridge ID,并更新本地根网桥的配置
确定根端口
每个非根交换机上有且仅有一个根端口,确定步骤如下:网络中的每台非根交换通过比较交换机上每个端口上接收到的BPDU信息来决定每个端口到根交换机的最佳路径。交换机会指定接收到的BPDU中根路径开销信息最小的那个端口作为到达根交换机的端口,即该交换机的"根端口"。若多个端口收到的BPDU中路径开销字段值都一样,交换机就将端口ID最小的那个指定为根端口,若端口ID也一样则MAC地址值较小的为根端口。在确定了根端口后,下一步就是选举指定端口。
确定指定端口
当然了,指定端口,只是在非根端口上进行操作。选举指定端口的原理也很简单,交换机SW的任何一个与其它交换机相连的端口,都会向对方发送一个BPDU1,同时也会收到从对端交换机发送过来的一个BPDU2,这台SW会将这两个BPDU进行比较,其中根路径开销值小的那个BPDU所来自/发出的端口就是Designated端口。即如果BPDU1的根路径开销值比BPDU2的根路径开销值小,则SW就将BPDU1所在的端口(也就是其本身的端口)设置为Designated端口,否则就由对方交换机进行比较,并有对端交换机确定其上的那个端口为Designated端口。
进入学习状态
完成了根桥、Root端口、Designated端口后,其它的端口都设置为Nondesignated端口。
然后,等待一个转发延迟到期(15s), 所有的Root端口、Designated端口进入学习(Learning)状态,其它端口进入Blocked状态。
在学习状态下,建立MAC地址表,然后在一个转发延迟到期(15s)后,所有的Root端口、Designated端口进入转发(Forward)状态,整个STP完成,系统进入稳定状态。即稳定状态下,所有的端口都是要么处于转发状态,要么处于Blocked状态。
注意:上面所提到的端口,都是指的连接交换机的端口。STP不会影响连接到终端设备(工作站或者服务器)的端口。这些直接连接到终端设备的端口,需要特殊配置一下(配置为edge端口),让这些端口处于转发状态,而且它们没有必要参与STP算法处理。
因为交换机对所有端口默认为非edge端口,因此所有的端口都默认参与STP算法处理。在配置为edge端口后有两个好处:一是edge端口可以由Blocked状态直接过渡为Forwarding状态,不需经过侦听-学习-Forwarding,节省时间,二是可以对这些edge端口应用BPDU保护,一旦这些端口收到来自用户的BPDU数据时(这些端口新接入了交换机),交换机就对该端口进行关闭,仅有网络管理员才能够重新开放这个端口,或者经过一定时间后,自动开放。这个BPDU保护功能,非常有用。设想一下,要是没有edge端口,没有BPDU保护功能,那么任何一个用户端口下面,都可以不收控制地连接交换机,那么整个网络就会不断地处于网络重构过程中,严重影响网络的性能,甚至带来不可控的风险。
STP稳定状态的维持
STP拓扑稳定后,所有工作中的交换机接口都将处于转发或阻塞状态,根网桥通过每2s的hello时间创建和发送Configuration BPDU(hello BPDU),非根网桥通过根端口接收BPDU,并且从指定端口转发改变后的BPDU。各交换机通过接收到得的BPDU 消息,来保持各端口状态的有效,直到拓扑发生变化。维持这个稳定状态的具体步骤如下:
(1)根交换机创建成本为0的Hello BPDU,并向其所有接口(非edge端口)转发出去
(2)邻接的非根网桥将接收的hello数据包中的成本加上接收端口的成本后,从指定端口(Designated Port)转发出去。
(3)每经过一个hello时间周期根网桥重复步骤(1),非根网桥重复步骤(2),直到网络拓扑发生变化。
参考图11 路径成本的传递。
总结一下,Configuration BPDU通常在下列情况下发送:
a.根桥以Hello Time为周期,发送广播Configuration BPDU;
b.非根桥向自己的指定端口转发Configuration BPDU;
c.新启动的网桥自以为是根网桥,广播Configuration BPDU;
另外,当网络拓扑发生变化时,也会使用到Configuration BPDU。
a.当响应TCN BPDU时,需要发送带有TCA标志的Configuration BPDU;
b.当根网桥广播网络变化时,于鏊发送带有TC标志的Configuration BPDU;
STP下的网络拓扑改变
运行生成树协议的交换机上的端口,总是处于5个状态中的一个(具体哪5个,看本文开头)。在正常运行期间,端口始终处于转发或阻塞状态。当设备识别网络拓扑结构变化时,交换机自动进行状态转换,在这期间端口就会暂时转入监听和学习状态。
所谓的STP下的网络拓扑改变,指根桥变化,或者网络的连接关系有改变。不外乎以下三种情况:
一是某个网桥的非FORWARDING状态端口变为Forwarding状态。比如原先Disable的端口改为Enable。当处于转发状态的端口被关闭(例如被阻塞)或某端口在交换机已具有指定端口的情况下转换为转发状态时。反之亦然。
二是根网桥ID变化。
三是收到TCN BPDU,意味着另一个网桥发现了拓扑变化。
如果检测到拓扑变更,交换机会通知生成树的根桥,然后根桥将该信息广播到整个网络。
由于在STP稳定状态下,交换机只是通过根端口从根桥接收配置 BPDU 帧,它绝不会向根桥发出 BPDU。为了能够通知根桥,人们引入了一种特殊的 BPDU,称为拓扑更改通知 (TCN,Topology Change Notification) BPDU。当交换机需要将拓扑更改信号发出时,它便开始通过根端口向根交换机发送 TCN,接收交换机(称为指定网桥)会立即回送设置了拓扑更改确认 (TCA) 位的常规 BPDU,以确认收到 TCN,此交换过程会持续到根桥做出响应为止。TCN 是一种非常简单的 BPDU,它按 hello 时间间隔发送,其中不包含任何信息。
当一台交换机从它的指定端口接收到TCN类BPDU时,它必须做两件事:一是立即回复一个带有TCA标志的configuration BPDU,表示已经知道对方有拓扑改变发生。二是把收到的TCN做转发,从它自已的根端口上发送出去,这样一级一级地传到根交换机后,TCN的任务才算完成。
根桥收到一级级传送上来的TCN BPDU后,也做两件事:一是立即给发送给它TCN BPDU的交换机发一个TCA BPDU,表示收到这个TCN。二是通过根桥所有的指定端口,发出带有TC标志的Configuration BPDU响应。这个带有TC标志的Configuration BPDU响应会一级级传到所有交换机。收到带有TC标志的Configuration BPDU后,交换机进入Listen状态,开始新的一轮的STP计算,一直到STP稳定为止。参见图10.
图12为例,讲述STP对TCN的处理过程。已经稳定后的STP,每2秒钟,Root Bridge发送一个BPDU给全部交换机。
假设某一时刻,Switch B与Switch D之间的P1P2链接突然故障,针对整个故障,交换机有两种反应:一是比较理想情况下,Switch B检测到故障后,Switch B立即从它的R端口(本处是P2端口)开始向着Root Bridge的方向发送一个TCN BPDU的数据,紫色箭头①所示,根据TCN BPDU的传输规则:当交换机从它的指定端口接收到TCN类BPDU时,它必须为其做转发,从它自已的根端口上发送出去,这样一级一级地传到根交换机后,TCN的任务才算完成。在以上的过程中,无论是哪台交换机从它的指定端口上收到了TCN类型的BPDU包,它都必须给一个回复,必须从指定端口上发出BPDU Type=0x01 的configuration BPDU包,会会送一个"拓扑改变应答消息",绿色箭头②。其实就是在转发来自根桥的BPDU数据中,置位TCA标志,用以通知发出TCN BPDU的交换机,已经知道发生网络变化。发送TCN 的交换机收到TCA 置位的配置BPDU 停止产生TCN。根网桥收到TCN ,则在新的配置BPDU 中,TCA 、TC 都置为1。Root Bridge收到TCN BPDU后,知道网络结构发生了变化,需要重新生成STP,于是Root Bridge发送配置BPDU消息,黄色箭头③,该消息被层层传递下去。告诉所有交换机,网络拓扑发生了改变,需要开始重新进行生成树计算,端口进入Listening状态。于是后面的过程与交换机初始上电的STP过程一致。
图 12
其实,在Switch B与Switch D之间的P1P2链接突然故障的时候,Switch D 也会检测到这个故障,但Switch D 无法通过其R端口发出一个TCN BPDU,只能等到收到根桥发出的TC BPDU后,重新计算STP。
第二种情况就不那么幸运了,Switch B与Switch D之间的P1P2链接故障后,Switch B和Swtich D 都没有立即检测到这个故障。如果是这种情况,Switch B不可能发出TCN了,Switch D 等不到来自根桥的BPDU,这就需要等待一个最大老化时间(通常默认为20秒),也就是在20秒内,没有收到根桥BPDU,Switch D就会意识到网络发生变化
而当某个端口莫名其妙DOWN了,交换机此时不知道链路DOWN了,会继续等待BPDU,当然接收不到了。所以需要等待MAX AGE老化计时器到期,20秒后才会重新收敛。也就是20+30=50S
从上面的学习中,我们可以知道在整个端口状态转变中,一个端口从Listening状态到转发状态是需要经过两个转发延时周期的(15s+15s),效率比较低,这在现实网络中是无法接受的。这是STP最大的不足,也是它最终被RSTP(快速生成树协议)取代的一个重要原因。
下一讲我们开始学习RSTP。