【网桥】早期的网桥就是用来连接两个由集线器构成的网络,因此说网桥可以隔离冲突域。可以将网桥看成只有两个端口的交换机,同样的,若交换机使用两个端口连接着两个网络,则也可以说这个交换机的两个端口实现了一个网桥。所以常将网桥与交换机混为一谈
【STP】它通过选择一条主干链路,将其它冗余链路置为阻塞状态,从而避免数据包在网络中产生环路。实际应用中为了使链路更加稳定,用户总是使用多条路径来实现链路以达到的目的,或网络相当复杂时就会产生一个或数个环路。环路的产生易导致广播风暴、多帧复制和MAC地址表抖动等副作用,为了解决这些问题就产生了“生成树协议”。生成树将复杂的网络拓扑看成是一棵树,选取其中一个交换机作为树根称为“根桥”,与之相连的交换机选取一个“根端口”用于接收来自根方向的数据,选取一个“指定端口”用于发送来自根方向的数据,并将其他端口阻塞。实现了数据从根出发后可到达网络中所有设备但不会出现环路和重复接收的情况,同样,数据从任意设备出发到达另一设备的路径都是唯一的。
STP适用于较小规模的网络,但它的收敛速度较慢,对网络中的拓扑变化反应不够迅速
为了改善STP的收敛速度和性能,RSTP(快速生成树协议)被引入。RSTP是STP的改进版本,它在保持STP基本原理的同时,引入了一些新的机制来加快网络的收敛速度。
RSTP的主要改进包括:
- 端口状态的改变:RSTP将端口状态划分为三种:指定(designated)、根(root)和备份(alternate),相比STP的端口状态,RSTP减少了状态切换的次数,从而加快了收敛速度。
- 快速收敛:RSTP通过减少BPDU的发送间隔和超时时间来加快收敛速度。当网络拓扑发生变化时,RSTP可以更快地重新计算生成树。
- 持续监听:RSTP通过定期发送BPDU消息来持续监听网络状态。当RSTP设备在一定时间内没有收到BPDU消息时,它会假设网络中的链路出现故障,并快速重新计算生成树,以确保网络的稳定性。
RSTP相对于STP来说,具有更快的收敛速度和更好的性能。它适用于中等规模的网络,并能够更好地适应网络拓扑的变化。RSTP与STP协议兼容,可以在STP和RSTP混合的网络环境中工作,如果某个树结构中,两台交换机用RSTP协议,第三台使用STP协议,那么两台交换机与第三台连接的端口会向下兼容使用STP工作模式,但是两台交换机之间仍然采用RSTP协议进行通信。
MSTP(Multiple Spanning Tree Protocol)
在一些大规模的网络中,需要同时支持多个VLAN(虚拟局域网),而STP和RSTP只能为整个网络构建一个生成树。为了解决这个问题,MSTP(多生成树协议)被引入。MSTP允许在一个网络中为每个VLAN构建独立的生成树,从而提供更好的灵活性和可伸缩性。
- 多生成树实例:MSTP允许在一个网络中创建多个生成树实例,每个实例负责不同的VLAN。
- 负载均衡:通过将不同的VLAN分配到不同的生成树实例,MSTP可以实现链路资源的负载均衡。
- 向后兼容RSTP和STP:MSTP与RSTP和STP协议兼容,可以在混合的网络环境中工作。
下表对比了STP、RSTP和MSTP在功能方面的特点:
功能 | STP | RSTP | MSTP |
---|---|---|---|
环路消除 | 是 | 是 | 是 |
快速收敛 | 否 | 是 | 是 |
支持多VLAN | 否 | 否 | 是 |
拓扑可扩展 | 适用于小规模网络 | 适用于中等规模网络 | 适用于大规模网络和多VLAN环境 |
在华为设备上配置STP,可以使用以下命令:
<Huawei> system-view
[Huawei] stp mode stp
[Huawei] stp enable
为了优化拓扑结构,可以通过以下命令调整STP的优先级:
[Huawei] stp priority <priority>
【环路的危害】环路主要导致三个问题,广播风暴、多帧复制和MAC地址表抖动。
广播风暴:简单的讲是指当广播数据充斥网络无法处理,并占用大量网络带宽,导致正常业务不能运行,甚至彻底瘫痪,这就发生了“广播风暴”。假设AB两点成环,位于同一交换机。A发出未知地址的广播包,B接收到后由于交换机中无此MAC,重新发起一个广播,此广播包又到达A,由于目标无法从MAC表中匹配,A会再次发一起个广播,这样不停循环下去,就产生了广播风暴。
多帧复制:单播的数据帧可能被多次复制传送到目的站点。很多协议都只需要每次传输一个拷贝。多帧复制会造成目的站点收到某个数据帧的多个副本,不但浪费了目的主机的资源,还会导致上层协议在处理这些数据帧时无法选择,严重时还可能导致不可恢复的错误。
MAC地址表抖动:也就是MAC地址表不稳定,这是由于相同帧的拷贝在交换机的不同端口上被接收引起的。如果交换机将资源都消耗在复制不稳定的MAC地址表上,那么数据转发的功能就可能被消弱了
1、BPDU报文格式
交换机之间使用BPDU(Bridge Protocol Data Unit网桥协议数据单元)来交换STP(生成树协议)信息,BPDU报文分为配置BPDU和TCN BPDU两类分别对应STP的两种应用场景(STP工作在数据链路层)。
帧头 | Data(BPDU报文) | FCS |
配置BPDU(Configuration BPDU)报文:用来进行生成树计算和维护生成树拓扑。
Protocol ID | Protocol Version ID | BPDU Type | Flags | Root ID | Root Path Cost | ||
2字节 | 1字节 | 1字节 | 1字节 | 8字节 | 4字节 |
Bridge ID | Port ID | Message Age | Max Age | Hello Time | Fonward Delay | |
8字节 | 2字节 | 2字节 | 2字节 | 2字节 | 2字节 |
TCN BPDU(Topology Change Notification BPDU)报文:当拓扑结构发生变化时用来通知相关设备的报文。
Protocol ID | Protocol Version ID | BPDU Type | |
2字节 | 1字节 | 1字节 |
Protocol ID:协议类型,固定为0x0000,表示生成树协议。
Protocol Version ID:协议版本号,生成树目前有三个版本,0x00代表STP。
BPDU Type:BPDU类型,这个值用来区分该报文是配置BPDU还是TCN BPDU。
Flags:BPDU标志位,由8位组成,其中最低位(0位)为TC(Topology Change,拓扑改变)标志位,最高位(7位)为TCA(Topology Change Acknowledge,拓扑改变确认)标志位,其他6位保留不使用。
Root ID:根桥ID,标识已被选为根桥的设备标识,前2字节代表优先级,后6字节为其MAC地址。
Root Path Cost:根桥路径开销,到根桥的路径开销。
Bridge ID:发送网络桥ID,发送该BPDU的网桥信息,前2字节代表优先级,后6字节为其MAC地址。
Port ID:端口ID,发送该BPDU的网桥端口ID,包含该端口的编号和优先级。
Message Age:BPDU在网络中传播的生存期,代表该BPDU报文在网络中已传播了多久。
Max Age:超时时间,若超过该时间还没有收到根桥发出的BPDU数据包,则交换机将向其他所有的交换机发出BPDU数据包,重新计算生成树。
Hello Time:根网桥连续发送BPDU的时间间隔。
Fonward Delay:传输时延,交换机端口状态迁移所用时间。当网络发生故障导致生成树重新计算时,重新计算得到的新配置消息无法立刻传遍网络,如果端口状态立刻迁移的话可能会产生暂时性的环路。所以生成树协议采用状态迁移机制,保证新的配置消息已传遍整个网络。
2、交换机端口状态
运行生成树协议的交换机在正常工作期间其端口总是处于转发或阻塞状态,当设备识别到网络拓扑结构发生变化时,交换机自动进行状态转换,期间端口暂时处于监听和学习状态。
Listening:监听,交换机启动、接入网络或识别到网络拓扑结构发生变化时所有端口都切换到监听状态,此状态下不会接收和转发数据,但可以接收和发送BPDU。监听状态下各设备和端口将确定自己的角色,选举出根桥、根端口、指定桥和指定端口。随后根据选举结果将部分端口转为Learning状态,部分端口转为Blocking状态。
Learning:学习,选举完成后交换机参与工作端口的将转为学习状态,主要是学习并完善MAC地址表。该状态下不会接收和转发数据,但可以接收和发送BPDU。
Forwarding:转发,MAC地址表学习完成后交换机就可以开始工作,参与工作的端口就进入转发状态。该状态下可以接收和转发数据、学习MAC地址、接收和发送BPDU。
Blocking:阻塞,选举完成后交换机部分端口进入阻塞状态,并在工作期间保持该状态。该状态下不能接收或转发数据,不能发送BPDU,只能接收BPDU。
3、STP的工作过程
选举根桥:开启STP协议的交换机启动后默认自己为根桥,此时所有端口进入监听状态并向端口上相连的其他交换机发送配置BPDU报文。该报文中根桥ID就是发送设备自己的ID,交换机发出BPDU的同时也会接收到来自其他设备的BPDU,它会将这两个BPDU报文进行对比。先比较根桥ID中的优先级,数值越小则优先级越高。该优先级可由用户设置,若用户没有设置则所有交换机的默认优先级都是一样的,此时就比较根桥ID中的MAC地址,也是数值越小的优先级越高。若设备发现自己收到的BPDU中根桥ID的优先级较自己当前发送的BPDU高,则设备开始转发优先级较高的BPDU。通过这种方式整个网络很快地就只会发送根桥ID优先级最高的BPDU,同时大家也都知道了那台设备的BPDU优先级最高,并认同该设备为根桥。

在上图所示的网络中,由于交换机的默认优先级一致,所以比较其MAC地址得到SW1的优先级最高,故应选取SW1为根桥。
选举根端口:选举出根桥后,网络中所有设备都只会转发根桥发出的BPDU。根桥发出的BPDU中有一个“根路径开销”字段,BPDU从某端口进入交换机时该字段会累加该端口的“开销值”,于是交换机向其他设备转发根桥的BPDU时,根路径开销字段会不断累加各交换机接收端口的开销值,此值可由用户设置,若不设置则默认都是一样的(一般设置时会将链路两端的开销值设置为一样)。网络中某交换机可能从多个端口都收到来自根桥的BPDU,他比较所有的BPDU中路径开销字段的值,并认为路径开销字段值最小的BPDU为最佳,接收到该BPDU的端口为根端口。若多个端口收到的BPDU中路径开销字段值都一样,交换机就将端口ID最小的那个指定为根端口,若端口ID也一样则MAC地址值较小的为根端口。根端口在同一台交换机上不同端口中选出,其意义在于若根桥发送一段数据到该设备,则通过根端口进来的路径是最佳的。根桥没有根端口。

上图所示的网络中,以SW1为根桥,交换机的各端口收到来自根桥的BPDU的路径开销计算和根端口选举如下表所示:
交换机 | 端口 | 路径开销 | 根端口 |
SW2 | sw2-0 | 19 | sw2-0 |
sw2-1 | 19+4+19 = 42 | ||
SW3 | sw3-0 | 19+19 = 38 | sw3-1 |
sw3-1 | 19+4 = 23 | ||
SW4 | sw4-0 | 19 | sw4-0 |
sw4-1 | 19+19+4 = 42 |
选举指定端口:选举出根桥后,交换机SW2和SW3会在各自端口收到不同方向发来的BPDU,其中sw2-1会收到sw3-0转发的BPDU,而sw3-0也会收到sw2-1从另一方向发来的BPDU。交换机SW2和SW3各自收到后就会对这两个BPDU进行比较,根路径开销字段值较小的那个为优,若值一致则编号较小的那个为优,若编号也一致则MAC地址值较小的为优,发送该BPDU的端口就选为指定端口。指定端口从两台不同设备的两个互连端口中选出,其意义在于从两台互相发送BPDU的设备中选出最优的发送方向。

上图所示的网络中,交换机各端口发出的BPDU的路径开销计算和指定端口选举如下表所示,由于所有BPDU都是从根桥即SW1发出的,所以根桥端口发出的BPDU路径开销为0:
交换机 | 端口 | 路径开销 | 指定端口 | |
SW1 – SW2 | sw1-0 | 0 | sw1-0 | |
sw2-0 | 19+4+19 = 42 | |||
SW1 – SW4 | sw1-1 | 0 | sw1-1 | |
sw4-0 | 19+19+4 = 42 | |||
SW2 – SW3 | sw2-1 | 19 | sw2-1 | |
sw3-0 | 19+4 = 23 | |||
SW3 – SW4 | sw3-1 | 19+19 = 38 | sw4-1 | |
sw4-1 | 19 |
阻塞端口:选举出指定端口和根端口后,各交换机就有了最佳接收端口和最佳发送端口,此时将非指定端口、非根端口阻塞,则整个网络的环路消失,同时根桥到各交换机的路径为最优。
BPDU报文攻击的原理
在多个网桥(交换机也是网桥的一种)互联时,当一台网桥接入网络、撤出网络(可能因为损坏或断电)时,生成树需要重新计算、重新生成,而在重新生成的过程中,整个网络时不转发数据的,按照最基本的的要求,这个时间可能长达40秒,也就是说这段时间内网络是瘫痪的,当然各个厂家对此都有一定的改进,时间会缩短,起码正常工作的部分受影响会大大减小。
BPDU报文攻击时会发送BPDU报文,通知网络内的交换机,生成树发生变化,需要重新计算,这样就会造成网络暂时中断,如果这种现象出现很频繁,那么整个网络也就不可用了。
原理:利用rstp中flages位中的Proposal与Agreement来进行协商,从而快速从 discarding 转成 forwarding而不用等待30秒超时。
RSTP端口状态:
discarding
listening
learning
bpduguard安全特性

- 作用:防止黑客DOS攻击(短时间内发送大量的BPDU或ARP请求),一般应用于portfast接口
- DOS攻击(简单理解):此时SW1为根桥;PC1为黑客,短时间内它向SW3发送大量BPDU报文且优先级小于32768,这就导致生成树重新收敛,PC1成为根桥;PC1成为根桥以后,它会继续向SW3发送BPDU报文且优先级大于32768,生成树又一次重新收敛,SW1成为根桥;就这样生成树一直处于收敛状态,而生成树在收敛过程中不转发用户数据帧,导致网络瘫痪
- SW3(config)#int f0/0
SW3(config-if)#spanning-tree bpduguard enable
SW3(config-if)#exit
接口下配置bpduguard,此接口(如上面0/0接口)一旦收到BPDU报文会自动把此接口置为Err-disable状态,Err-disable相当于接口down状态, 如果想把此接口重新启用需要进入这个接口先执行shutdown再执行no shutdown;此命令一般用在连接PC或者服务器的接口上面启用 - sw3(config)#spanning-tree portfast bpduguard default //全局模式 —– 在所有Portfast接口启用bpduguard特性
RSTP对STP保证机制
1.根端口保护:如果黑客用一台优先级比较高的交换机连接到树里,那么会导致整个网络的流量都被黑客
所控制,为了防止交换机的端口角色发生改变,可以在交换机里配置根保护,配置了根保护的交换机
的某个端口如果收到比现有根桥更忧的BPDU会主动把端口状态置为 discading 直到黑客的交换机撤离
2.边缘端口保护:如果对交换机的某个端口设置了边缘端口,而这个边缘端口却收到了BPDU会导致
边缘端口的功能失效,甚至从边缘端口发来一些TC报文来刷新网络交换机的MAC地址攻击网络,
为了防止这一情况,可以对边缘端口做保护配置,相当于绑定边缘端口。保护后收到BPDU的边缘端口就
会直接置为 err-down (直接关闭,需要管路员手动恢复) 。因此不能再非边缘端口配置此保护
3.环路保护:如果阻塞端口可以发BPDU 却一直收不到别人的BPDU,这样会导致BPDU超时,从而使得
阻塞状态转变成转发状态,从而造成树结构有转变成环形结构。因此可以在AP端口配置环路保护,配置环路
保护后AP端口如果持续收不到 BPDU 就会认为链路故障单方向故障,从而使端口状态保持 discarding