STP解决什么问题
生成树协议(Spanning-Tree Protocol,以下简称STP)是一个用于在局域网中消除环路的协议。运行该协议的交换机通过彼此交互信息而发现网络中的环路,并适当对某些端口进行阻塞以消除环路。由于局域网规模的不断增长,STP已经成为了当前最重要的局域网协议之一。
二层网络环路会引发哪些问题
环路导致网络报文风暴:
由于在二层网络中,广播,组播,未知单播都采用了泛洪的方式,如果网络中存在环路,会导致报文无限复制,直到最终网络崩溃。
由于泛洪导致网络报文转发环路
环路导致MAC表震荡
如上图,在报文复制的过程中,SwitchB会发现PC1的报文一会儿从上面接口收到,一会儿从下面接口收到,反复震荡,导致MAC表不稳定。
即使是已知单播,也可能会导致问题,如下图:
已知单播导致的MAC震荡
PCB发送单播报文给PCA,该报文源Mac为MacB,目的Mac为MacA。
SW1从B接口收到该报文,所以SW1认为MacB对应的出接口为B
该单播报文也会被SW2转发,从A端口进入SW1,这样SW1又认为MacB对应的出接口为A。
改过程反复出现,导致SW1的MAC表不停震荡。
STP如何解决问题
下图是一个有环路的网络演示例子,我们看看STP如何在这个网络中计算出一个生成树,并将会导致环路的链路阻塞。
一个有环路的网络
1. 选根桥:首先各交换机根据优先级和MAC地址,选出一个BID最小的交换机,作为整个网络的根。
相关术语:
网桥:比较早期的网络中,称交换机为网桥。在某些场景中网桥和交换机会交替使用。
网桥ID:BID—网桥的优先级+网桥MAC。
根桥:BID(网桥ID)最小的网桥定为根桥。在没有配置优先级的网络中,根桥将有MAC地址最小的网桥担任。如果网络中配置了各个交换机的优先级,则由优先级最小的交换机当人跟桥。
选出整个网络的根节点
2. 确定根端口、指定端口、可选端口
根端口和指定端口和可选端口的内涵:
根端口(RP-RootPort),交换机上最优的端口。
根端口的概念是针对交换机的,是指(一个非根桥的STP)交换机上离根桥最近的端口。
一个STP交换机上有且仅有一个RP。
对于根桥发出的报文来看,流量从根端口进入交换机
指定端口(DP-DesignatedPort),链路上的最优端口。
指定端口的概念是针对于某链路的,指定端口是链路上离根桥最近的端口。
一个链路上有且仅有一个DP。
对于根桥发出的报文来看,流量从指定端口流出交换机。
可选端口(AP-AlternatedPort):, 非最优端口
即非根端口,也非指定端口,说明该端口不在生成树上,则该端口需要阻塞。所以可选端口也称为阻塞端口。
我们看看根端口RP和指定端口DP的简单示例,对RP和DP有一个直观的认识。指定端口DP就是树中父节点上的端口,根端口RP就是树中子节点上的端口。
一颗生成树中的根端口和指定端口
3. 关闭所有阻塞端口的流量转发功能
相当于把可能形成环路的端口流量转发功能全部关闭(俗称破环或剪枝),通过这样的操作,将物理上的一个网状拓扑改造为一个逻辑上的树状拓扑。从而消除网络环路。
看看完整的示例,包括根端口RP,指定端口DP和可选端口AP。STP通过关闭AP端口的转发功能,将物理上的网状拓扑,转变为逻辑上的树状拓扑。从而消除网络环路。
网络中的RP,DP和阻塞端口的完整示例
在整个网络消除环路,稳定后,应该处于这样一种状态
根桥在周期性的发送Hello BPDU
这些BPDU报文从根往叶子周期性发送(基于根桥的保活周期)
非根桥周期性的从RP端口收到这些BPDU(如果有必要,更新本地信息后),
从DP端口将这些报文往树的叶子方向对于阻塞接口,应该能周期性的收到DP发送过来的报文。
拓扑变化后的响应
从上面过程可以看到,BPDU会周期性的从树根往叶子发送。
每一个端口的最优BPDU都有一个有效期,如果超过这个有效期有没收到BPDU,则认为该BPDU已经无效。尝试重新收敛。
*---
*---
更多的细节
1. 协议基础:报文格式
要实现STP功能,网桥之间必须要进行一些信息的交互,这些信息交互单元就称为配置消息BPDU(BridgeProtocolDataUnit)。STPBPDU是一种二层报文,目的MAC是多播地址01-80-C2-00-00-00,所有支持STP协议的网桥都会接收并处理收到的BPDU报文。该报文的数据区里携带了用于生成树计算的所有有用信息。具体如下:
BPDU报文格式
各字段的含义
在BPDU中,最核心的字段是根桥ID,跟路径成本,发送网桥ID,端口ID四个字段。这四个字段组成四元组,用来比较两个BPDU的“好坏”。四元组越小,说明越好。
注:发送网桥ID,端口ID仅仅在路径成本相同时发挥作用
字段名 | 字段含义 |
---|---|
协议ID: | 该值总为0。 |
版本号: | STP的版本(为IEEE 802.1d时值为0)。 |
报文类型: | BPDU类型(配置BPDU=0,TCN BPDU=80)。 |
标记域: | LSB(最低有效位)=TCN标志;MSB(最高有效位)=TCA标志。 |
根网桥ID: | 根信息由2字节优先级和6字节ID组成。 这个信息组合标明已经被选定为根网桥的设备标识。 |
根路径成本: | 路径成本为到达根网桥交换机的STP开销。 表明这个BPDU从根网桥传输了多远,成本是多少。 这个字段的值用来决定哪些端口将进行转发,哪些端口将被阻断。 |
发送网络桥ID: | 发送该BPDU的网桥信息。由网桥的优先级和网桥ID组成。 |
端口ID: | 发送该BPDU的网桥端口ID。 |
计时器: | 计时器用于说明生成树用多长时间完成它的每项功能。 这些功能包括报文老化时间、最大老化时间、访问时间和转发延迟。 |
最大老化时间: | 网桥将将根桥看做不可用前保留根ID的最大时间。 |
访问时间: | 根网桥连续发送BPDU的时间间隔。 |
转发延迟: | 网桥在监听学习状态所停留的时间。 |
2. 协议运行过程
自认老大(根桥):最初,每一台交换机都认为自己是根桥,尝试向外通告这一信息。
周期通告:STP交换机在每一个端口上定期(2s)发送BPDU报文
发现强者,归顺强者:每台交换机除了发送BPDU外,也从所有端口上接收BPDU,一旦在某端口上收听到比自己发的还要“好”的BPDU,那么这个端口就提取该BPDU中的某些信息,更新自己的信息。并停止在该链路上发送BPDU。
收到更好的BPDU后需要更新的信息包括:自己认为的根桥BID(总体决策):从所有端口中最好的BPDU中获得。
本路由器的根端口(RP,总体决策):从所有端口中最好的BPDU中获得。
链路上的指定端口(DP,端口决策):如果从该端口收到更好的BPDU,则说明别人李根桥更近,则自己端口不是DP,否则则认为自己是DP。
再次强调一下,比较BPDU的“好坏”的方式(自己的或其他交换机的),都是根据上面提到的四元组来完成的,即最低桥ID、最低根路径成本,最低发送者BID,最低端口ID。该端口缓存他人BPDU后,自己则立即停止发送BPDU。
当发送BPDU的时候,交换机填充Sender BID字段的总是自己的BID,而填充Root BID字段的是“当前我所认为是根桥的”BID。
最终收敛:此过程一直持续,直到最终网络收敛:最优的根桥最终被选举出来,并且RP,DP端口也被确定下来。整个网络归顺到一颗以最优BID为根的生长树上来。
3. 具体过程分析:选举根桥
1. 初始状态,自立山头:,虽然A的BID最小,但初始状态还没有互通信息,各自自立山头,此时正确的树上仅有孤零零的一个根节点。
初始状态,自立山头
2. 发现强者,归顺强者:通过BPDU的对外通告,树逐渐向外生长,收复C和D两个节点,但B节点还不再王化之内。
发现强者,归属强者
3. 通告全网,天下归心:随着根桥的势力范围扩大,已归顺节点(如图中的C和D)也帮着A对外宣传根桥是A,最终该信息传遍全网,天下归心,大家都臣服在A的STP树下。至此,全网就有了一个统一的根,即BID最小的A。
归顺中央,统一全网
4. 具体过程分析:最佳树的生成与RP和DP的确定
整个网络的破环与剪枝过程与选举根桥过程类似,都是从根桥出发,这棵树逐步向外生长,直到最后长满整个网络。
1. 天地初开,一片混沌:此时正确的树上仅一个跟节点,其他节点的信息都是错误或不可信的。
天地初开,一片混沌(左边是物理视图,右边是树的逻辑实体)
2. 树开始向外“生长”:离根最近的交换机首先收到根节点的召唤(根节点会发送“最优”的BPDU),加入到树上来。产生了正确的RP,DP信息。
树开始向外生长(左边是物理视图,右边是树的逻辑实体)
3. 树“生长”至整个网络:随着树的进一步生长,节点一个接一个的加入到树上来(通过向外发布“更好”的BPDU吸引其他节点加入)。最终遍布整个网络,形成了一颗全网的STP树。
树长满整个网络(左边是物理视图,右边是树的逻辑实体)
注1:当然树的生长并不是一帆风顺的,有时候由于网络时延或定时器的原因, 某些节点可能会加入错误的分枝,但最终这些误入歧途的节点都能重新找到正确的分枝加入 注2:虽然我们上面为了说明简单,将根节点的选举和DP,RP的确定分两个阶段来说明, 实际协议运行过程中,并没有明确的区分这两个阶段。他们是统一在“最佳BPDU传递”这 个统一的协议处理流程中的。
5. 拓扑变化后的收敛
与拓扑变化后的收敛密切相关的几个基本概念:
1. 端口状态机
STP交换机端口一共有五个状态:
Disable:表示端口还没有使能
Blocking:表示端口是AP(即非DP,也非RP),不能进行报文转发工作。
Listening,Learning,Forwarding:表示端口是DP或RP,可以进行报文转发工作,但如果端口当选DP或RP就开始转发工作的话,可能网络中还有环路。(这是因为此时网络还没有完全收敛,可能自己的信息还不全,做出的决策时错误的;也有可能虽然自己的是正确决策,但别人还没有获得完整的信息,别人的决策不正确。),为了避免这种情况发生,STP采用了延迟转发工作的决定,等待网络完全稳定收敛下来后才进入转发工作状态。
STP端口状态机
STP端口状态机说明
2.几个相关定时器
Hello Timer:STP交换机发送BPDU的时间间隔。当网络拓扑稳定之后,该计时器的修改只有在根桥修改才有效。根桥会在之后发出的BPDU中填充适当的字段以向其他非根桥传递该计时器修改信息。但当拓扑变化之后,TCN BPDU的发送不受这个计时器的管理。
Forwarding Delay Timer:指一个端口Listening 和Learning的各自时间,默认为15秒,即Listening状态持续15秒,随后Learning状态再持续15秒。这两个状态下的端口会处于Blocking状态,这是STP用于避免临时环路的关键。
Max Age:端口的BPDU老化的时间,前文已经探讨过。端口会根据接收到的BPDU存储所接收到的最好的四个信息(根桥BID、累计根路径开销、发送者BID和发送端口PID)。每次接收到合适的BPDU,端口都会启动这个Max Age计时器。超过这个Max Age时间端口接收不到合适BPDU,就会认为该BPDU已经失效。这个时间默认为20秒。
3. 拓扑变化后重新收敛需要解决那些问题
让网络逻辑拓扑重新恢复成一颗完整的树。
网络拓扑变化后,可能新增了链路,导致树上又引入了环,此时需要重新破环。
也可能树中某些链路断了,导致树的断裂,此时需要启用原来被删链路,恢复树的连通性。
甚至是根桥down掉了,需要重新选择根桥。
解决方法:其实重新生成STP树没有什么特别的,其过程与初始收敛过程完全相同。
有一点需要说明的是:如果DR端口down了,或者根桥down了,需要等待MaxAge时间,
到了MAXAge时间后,通过BPDU的老化机制将无效BPDU删除,并重新尝试生成新的BPDU。
![Uploading Paste_Image_518231.png . . .]
即使恢复了STP树,拓扑变化可能会MAC表错误,需要尽快清除这些错误MAC,否则流量仍然不能恢复。
比如:一个网络最初如下:假设网桥 B1 阻塞了通向 B4 的链路。A 和 B 是具有已建立连接的两个工作站。流量从 A 到 B 进入 B1、B2、B3,然后进入 B4。
最初网络拓扑
现在,假设 B2 和 B3 之间的链路发生故障。在 B1 以转发模式将其端口应用于 B4 之前,A 和 B 之间的通信会中断(使用默认参数的情况下最长中断 50 秒),这个比较容易理解。但是我们发现,即使B1-B4之间链路打开了,A->B的通讯仍然无法恢复,这是因为当 A 要向 B 发送帧时,B1 交换机上MAC表错误导致的,(B1仍然认为主机B的出接口是B2),数据包将被发送到黑洞。当B要到达A. Communication丢失在五分钟,直到A和B MAC地址的条目老化。
错误的MAC表导致转发黑洞
解决方法:为了尽快恢复流量转发,STP引入了变更通知和应答消息
在常规 STP 操作中,网桥一直从其根端口上的根网桥接收配置 BPDU。但是,它从未派出BPDU往根网桥。为此,引入了称为拓扑更改通知 (TCN) BPDU 的特殊 BPDU。因此,当网桥需要对拓扑更改发出信号时,它开始在其根端口上发送 TCN。指定的网桥接收并确认 TCN,还为自己的根端口生成另一个 TCN。此过程将一直持续,直到 TCN 发现根网桥为止。
TCN 是非常简单的 BPDU,不包含网桥每 hello_time 秒(这是本地配置的 hello_time,不是配置 BPDU 中指定的 hello_time)发送的任何信息。指定的网桥通过立即发回设置了拓扑更改确认 (TCA) 位的正常配置 BPDU 来确认 TCN。通知拓扑更改的网桥不停地发送其 TCN,直到指定的网桥确认它为止。因此,指定的网桥将应答 TCN,即使不从其根网桥接收配置 BPDU 也是如此。
变更通知上报,直到树根
将事件广播到网络
只要根网桥得知网络中有拓扑更改事件,就会开始发送设置了拓扑更改 (TC) 位的配置 BPDU。这些 BPDU 将由网络中设置了此位的每个网桥转发。因此,所有网桥都注意到拓扑更改情况,并可以将其老化时间缩短到 forward_delay。网桥在转发和阻塞端口上接收拓扑更改 BPDU。
TC 位在 max_age + forward_delay 秒(默认情况下为 20+15=35 秒)内由根网桥设置。
BPDU从根向下发送
BPDU发送时机
对于根桥,主动发送BPDU:根据Hello周期,主动通过所有DP发送BPDU
非根桥,中继BPDU:从RP收到BPDU,从所有DP发送出去。
什么时候认为是拓扑发生了变化
1.网桥至少有一个指定端口,并且某端口从其他(Blocking、Listening、Learning)状态转到Forwading状态。
2.某端口由Forwading、Learning状态转到Blocking状态。
拓扑变化的实例分析
根桥宕机
根桥如果down机的话,所有网络都收不到保活报文,到了MaxAge后,网络重新选举。
(皇上驾崩,天下大乱,群雄逐鹿,重立新主)某条链路break,比如下图:SW1是ROOT,SW1和SW3之间cost 是100,其他cost 都是20.所以正常情况下,会将SW1和SW3之间的链路剪枝。如果SW1和SW2之间的链路出现故障,我们看看重新收敛过程如何。
一个例子
出现故障的链路是SW2的RP端口链路,SW2无法从他的RP端口收包根桥的保活BPDU.
因为SW2也无法从其他端口收到BPDU保活,所以一段时间过后,SW2认为网络中没有根了(实际上是因为信息的缺失而导致错误的认为)。SW2开始自立为王(根桥)。
SW4发现根桥发生了变化,但他也不知道具体是什么情况,领导(上游节点)既然这么说了,就跟着领导走吧。他也宣称根桥变成了SW2。并把这一信息向外扩散。
SW3收到SW4的宣告,发现不对,SW1应该比SW2更强,并且自己离SW1更近,随即SW3宣告SW1应该是老大,并自己变成该网段的DP,开始在该网段上发送BPDU。随后大军压境,重新收复SW4和SW2.最终恢复天下太平。
STP配置
stp mode?
基本能配的有三种
1、BID的优先级:stp priority 4096----后面数的值必须是4096的倍数。前4bit是优先级,后12bit是扩展系统ID。4的12次方:4096
修改优先级是用来改变根桥的选举。
2、接口的cost值:stp cost 2000
3、配置修改接口的port ID的优先级,完成链路切换。