STP 详解

一、STP 出现背景

高可用场景带来的就是冗余链路,而冗余链路会带来几个问题。


如图所示 br0 和 br1 有两条线路,它们之间任何一条链路出现故障另外一条线路可以马上顶替出现故障的那条链路,这样可以很好的解决单链路故障引起的网络中断,从而实现高可用,但在此之前有下面三个需要考虑的问题。

1.1 广播风暴

交换机传送的二层数据不像三层数据一样有TTL,如果存在环路且数据不能被适当终止,它们就会在环路中永无止境地传输,如图1所示:
1、PC1 发出一个广播帧,br0 收到后从其他端口泛洪出去(即发往eth1 eth4 eth5)
2、br1 的 eth2 和 eth6 收到 br0 发过来的相同广播帧,又会泛洪出去。
3、广播帧又传回 br0 ,br0收到后再泛洪。
除非物理线路遭到破坏,否则 PC 们会不停收到广播帧,从而引起广播风暴,造成网络拥塞甚至瘫痪。

1.2 MAC 地址不稳定

这是由于广播风暴形成的。
1、当 br0 收到 PC1 的广播帧,会记录 PC1 的 MAC 地址对应 eth0 端口写入 MAC 缓存表中
2、br0 将此广播帧泛洪出去, br1 会从 eth2 和 eth6 收到广播帧,假设 eth2 先收到,就会记录 PC1 的 MAC 和对应的入接口 eth2 ,然后 eth6 收到同样的广播帧,又会记录 PC1 的 MAC 和对应的入接口 eth6,刷新了 MAC 缓存表。
3、当广播帧又回到 br0 ,这样 PC1 的 MAC 地址会不停的在两台交换机的 eth1 eth2 eth5 eth6之间变动,MAC 地址缓存表也不断的被刷新,影响交换机的性能。

1.3 重复帧拷贝

1、假设 PC1 发送一个单播帧给 PC3,这个单播帧到达 br0,假设 br0 还没有学习到 PC3 的 MAC 地址,则会对未知单播帧进行泛洪转发
2、br1 分从自己的 eth2 和 eth6 接收到这个单播帧,br1 知道 PC3 连接在自己的 eth3 接口上,所以 br1 将这两个单播帧都转发给 PC3
3、PC1 只发送了一个单播帧,PC3却收到了两个单播帧,这会给某些网络环境比如流量统计带来不精确计算等问题

二、STP 工作流程

STP 通过交换 BPDU 报文,使用 STA (Spanning Tree Algorithm 生成树算法)来决定堵塞(禁用)交换机上的哪些端口来阻止环路。其流程如下:

BPDU 报文格式

2.1 根桥选举

18-25 字节即为 BID ,优先级占2个字节,MAC 地址占6个字节。一个广播域所有交换机都参与选举根交换机,刚启动时,所有交换机假设自己是根桥,每隔两秒发送 BPDU 帧,帧中的 Root ID(Root Identifier)和本机的BID(Bridge Identifier)相同,同时他们也接收别的交换机发来的 BPDU 报文并检查 Root ID 是否比自己的 Bridge ID 小,如果接收到的 Root ID 更小,则将自己的 BPDU 报文的 Root ID 改为这个更小的 Root ID发出去,若还是自己的 Bridge ID 更小,则 Root ID 还是填自己的 Bridge ID。直到最后在同一个生成树实例中拥有一致的 Root ID,这个 Root ID 对应了这个广播域中某台交换机的 BID(并且这个 BID 一定是这个广播域最小的),这台交换机就被选作根交换机。

优先级可以通过bridge-utils管理工具中的brctl命令修改,优先级默认为32768(必须为4096的倍数)

[root@huangy ~]# brctl setbridgeprio br0 4096
[root@huangy ~]# brctl showstp br0
br0
 bridge id      1000.000000000000
 designated root    1000.000000000000
 root port         0            path cost          0
 max age          20.00         bridge max age        20.00
 hello time        2.00         bridge hello time      2.00
 forward delay        15.00         bridge forward delay      15.00
 ageing time         300.00
 hello timer           0.00         tcn timer          0.00
 topology change timer     0.00         gc timer           0.00
 flags                

根桥选举后只会由根桥每隔2秒发送一次BPDU包,其他的非根桥接收后转发

2.2 根端口选举(Root Port,RP)

本交换机各端口到达根交换机路径的开销—到达根桥的链路开销之和,找到一条开销最小的路径(RPC root path cost),交换机的这个端口就是根端口;如果路径开销相同,则比较发送 BPDU 交换机的 Bridge ID ,选较小的;如果发送者 Bridge ID 相同(即同一台交换),则比较发送者交换机的 port ID ,选较小的;如果发送者 Port ID 相同,则比较接收者的 port ID ,选较小的。

Port ID—发送该BPDU的端口ID 由两部分组成=端口优先级(默认128,必须配置为16的整数倍) + 端口ID 端口优先级也可以通过 brctl setportprio
Root Path Cost —本交换机认为的根路径开销 也可以通过 brctl setpathcost 修改

2.3 选举指定端口(Designated Port,DP)

每个LAN选举指定端口(Designated Port,DP),与选举根端口同时进行。每条链路上还要选举一个指定端口,即为连接网段并通往根桥的唯一端口,负责发送和接收该网段和根桥之间的流量(每个LAN的通过该口连接到根交换机)。如果每个网段到达根桥只有一条通路,则无环路。 默认情况下根桥的所有端口都是指定端口

2.4 将所有根端口和指定端口设为转发状态

2.5 其他端口设为阻塞状态

三、STP 端口状态

3.1 Forwarding

只有根端口或指定端口才能进入 Forwarding 状态。Forwarding端口既转发用户流量也处理BPDU报文。

3.2 learning

过渡状态,增加 Learning 状态防止临时环路。(15s)设备会根据收到的用户流量构建 MAC 地址表,但不转发用户流量。

3.3 Listening

过渡状态。(15s)确定端口角色,将选举出根桥、根端口和指定端口。

3.4 Blocking

阻塞端口的最终状态。端口仅接收并处理BPDU报文,不转发用户流量

3.5 Disabled

端口状态为Down。端口既不处理BPDU报文,也不转发用户流量。

四、三种定时器

4.1 Hello Time

Hello Timer定时器时间的大小控制配置BPDU发送间隔。

4.2 Forward Delay Timer

Forward Delay Timer定时器时间的大小控制端口在Listening和Learning状态的持续时间。

4.3 Max Age

Max Age定时器时间的大小控制存储配置BPDU的超时时间,超时认为根桥连接失败。

五、参考文档

  • STP生成树协议实例详解

你可能感兴趣的:(STP 详解)