为了提高网络可靠性,交换网络中通常会使用冗余链路。然而,冗余链路会给交换网络带来环路风险,并导致广播风暴以及MAC地址表不稳定等问题,进而会影响到用户的通信质量。
根据交换机的转发原则,如果交换机从一个端口上接收到的是一个广播帧,或者是一个目的MAC地址未知的单播帧,则会将这个帧向除源端口之外的所有其他端口转发(泛洪)。如果交换网络中有环路,则这个帧会被无限转发,此时便会形成广播风暴,网络中也会充斥着重复的数据帧。
交换机是根据所接收到的数据帧的源地址和接收端口生成MAC地址表项的。
如上图,PC1向外发送一个单播帧,假设此单播帧的目的MAC地址在网络中所有交换机的MAC地址表中都暂时不存在。LSW2收到此数据帧之后,在MAC地址表中生成一个MAC地址表项,对应端口为G0/0/3,并将其从G0/0/1和G0/0/2端口转发。此例仅以SWB从G0/0/1端口转发此帧为例进行说明。
LSW1接收到此帧后,由于MAC地址表中没有对应此帧目的MAC地址的表项,所以LSW1会将此帧从G0/0/2转发出去。
LSW3接收到此帧后,由于MAC地址表中也没有对应此帧目的MAC地址的表项,所以LSW3会将此帧从G0/0/2端口发送回SWB,也会发给主机B。
LSW2从G0/0/2接口接收到此数据帧之后,会在MAC地址表中删除原有的相关表项,生成一个新的表项,对应端口为G0/0/2。此过程会不断重复,从而导致MAC地址表震荡。
由于华为交换机设备默认开启MSTP(后面文章会讲到),所以我们在搭建完拓扑之后,虽然看上去有环路,但是已经被MSTP消除。所以再给PC配上IP地址之后两台PC是可以通信的,可以用ping
验证:
随便在交换机之间端口抓包,会发现MSTP报文传递。
在交换机每个端口关闭生成树协议:进入接口,关闭生成树协议:stp disable
即可。
此时再用PC1ping
PC2发现无法通信:
查看抓包程序:
注意:由于在eNSP中,模拟程序性能相较于实体设备差很多,所以在实际设备中广播量要大的多。
此时进入LSW2,通过display mac-address
不断查看交换机MAC地址表,发现MAC地址表
震荡:
那么如何解决上述环路引起的问题呢?
非常的简单,三个交换机之间随机拔掉一根链路就可以了。这样环路是消除了,但是链路也没有了冗余备份的功能。(本来PC1到PC2有两条路可以走,现在就剩下一条了)。
既然物理的拔网线行不通,那么我就从逻辑上将交换机的一个端口堵塞掉(逻辑上的把网线),使一条链路不通。正常情况数据通信走主干道,若是主干道出现了问题,则逻辑堵塞的端口就恢复,备用链路就可以作为通信不就行了。
以上过程,就是STP生成树协议的工作原理。
生成树协议STP(Spanning Tree Protocol)可以在提高可靠性的同时又能避免环路带来的各种问题。
STP通过阻塞端口来消除环路,并能够实现链路备份的目的。
STP主要作用
STP通过构造一棵树来消除交换网络中的环路。
每个STP网络中,都会存在一个根桥,其他交换机为非根桥。根桥或者根交换机位于整个逻辑树的根部,是STP网络的逻辑中心,非根桥是根桥的下游设备。当现有根桥产生故障时,非根桥之间会交互信息并重新选举根桥。
STP中定义了三种端口角色:
1. 指定端口(DP)
2. 根端口(RP)
3. 预备端口/预备端口(AP)
为了计算生成树,交换机之间需要交换相关的信息和参数,这些信息和参数被封装在BPDU(Bridge Protocol Data Unit)中。
BPDU有两种类型:
1. 配置BPDU
2. TCN BPDU
配置BPDU中包含了足够的信息来保证设备完成生成树计算,其中包含的重要信息如下:
字段 | 长度 | 说明 |
---|---|---|
PID | 6字节 | 协议ID |
字段 | 长度 | 说明 |
---|---|---|
PVI | 6字节 | STP协议版本(三种) |
1. STP(802.1D)传统生成树 值为0
2. RSTP(802.1W)快速生成树 值为2
3. MSTP(802.1S)多生成树 值为3
字段 | 长度 | 说明 |
---|---|---|
BPDU Type | 1字节 | BPDU类型 |
1. 0x00:STP的Configuration BPDU:配置BPDU,负责建立,维护STP拓扑
2. 0x80:STP的TCN BPDU(Topology Change Notification BPDU):传达拓扑变更
3. 0x02:RST BPDU(Rapid Spanning-Tree BPDU)或者MST BPDU(Multiple Spanning-Tree BPDU)
字段 | 长度 | 说明 |
---|---|---|
Flags | 1字节 | 标记域 |
共有8bits,但是STP中只用了两位:最高位与最低位
1. TCA=1时:拓扑变化响应消息(拓扑变化确认)
2. TN=1时:拓扑变化消息
字段 | 长度 | 说明 |
---|---|---|
Root Identifier | 8字节 | 网桥ID |
前两个字节时网桥优先级,后六个字节是网桥MAC地址。
字段 | 长度 | 说明 |
---|---|---|
Root Path Cost | 4字节 | 根路径开销 |
Bridge Identifier | 8字节 | 发送者BID,本交换机的Bridge ID |
Port Identifier | 2字节 | 发送端口PID,发送该BPDU的端口ID |
Message Age | 2字节 | 该BPDU的消息年龄,以秒为单位 |
Max Age | 2字节 | 消息老化年龄,以秒为单位,超时则认为到根交换机的链路故障(缺省20s) |
Hello Time | 2字节 | 发送两个相邻BPDU间的时间间隔,以秒为单位。(缺省2s) |
Forward Delay | 2字节 | 控制Listening和Learning状态的持续时间,以秒为单位 |
STP协议中包含一些重要的时间参数,这里举例说明如下:
Message Age是从根桥发送到当前交换机接收到BPDU的总时间,包括传输延时等。如果配置BPDU是根桥发出的,则Message Age为0。实际实现中,配置BPDU报文每经过一个交换机,Message Age增加1。
Max Age是指BPDU报文的老化时间,可在根桥上通过命令人为改动这个值。Max Age通过配置BPDU报文的传递,可以保证Max Age在整网中一致。非根桥设备收到配置BPDU报文后,会将报文中的Message Age和Max Age进行比较:如果Message Age小于等于Max Age,则该非根桥设备会继续转发配置BPDU报文。如果Message Age大于Max Age,则该配置BPDU报文将被老化掉。该非根桥设备将直接丢弃该配置BPDU,并认为是网络直径过大,导致了根桥连接失败。
(大致功能与IP报文中的TTL值相似,但是工作机制相反,TTL值每经过一个三层设备-1,MSG Age每经过一个交换机+1。)
STP选举过程非常的简单,通过构造一棵以根桥为根的逻辑树来消除环路。
所有选举的过程都交互BPDU报文来完成。
交换机启动后就自动开始进行生成树收敛计算。**默认情况下,所有交换机启动时都认为自己是根桥,自己的所有端口都为指定端口,这样BPDU报文就可以通过所有端口转发。**对端交换机收到BPDU报文后,会比较BPDU中的根桥ID和自己的桥ID。如果收到的BPDU报文中的桥ID优先级低,接收交换机会继续通告自己的配置BPDU报文给邻居交换机。如果收到的BPDU报文中的桥ID优先级高,则交换机会修改自己的BPDU报文的根桥ID字段,宣告新的根桥。
选举依据:桥ID(Bridge ID) ,STP中的每个交换机都会有一个桥ID(Bridge ID) 。
在所有非根交换机上选举根端口。
分别依据该端口的根路径开销(RPC)、对端BID(Bridge ID)、对端PID(Port ID)和本端PID。
RPC:
交换机的每个端口都有一个端口开销(Port Cost)参数,此参数表示该端口在STP中的开销值。默认情况下端口的开销和端口的带宽有关,带宽越高,开销越小。从一个非根桥到达根桥的路径可能有多条,每一条路径都有一个总的开销值,此开销值是该路径上所有接收BPDU端口的端口开销总和(即BPDU的入方向端口),称为路径开销。非根桥通过对比多条路径的路径开销,选出到达根桥的最短路径,这条最短路径的路径开销被称为RPC(Root Path Cost,根路径开销),并生成无环树状网络。根桥的根路径开销是0
PID(端口ID):
运行STP交换机的每个端口都有一个端口ID,端口ID由端口优先级和端口号构成。
在链路上抑制其他端口(无论是自己的还是其他设备的)发送BPDU报文的端口,就是该网段的指定端口。每个网段都应该有一个指定端口,根桥的所有端口都是指定端口(除非根桥在物理上存在环路如下图:此时G0/0/1与G0/0/2口选举根端口指定端口)。
选举依据:根路径开销(注意这里为该端口的交换机到达根桥最短路径)、本端BID、本端PID
网络收敛后,只有指定端口和根端口可以转发数据。其他端口为预备端口,被阻塞,不能转发数据,只能够从所连网段的指定交换机接收到BPDU报文,并以此来监视链路的状态。
端口状态 | 解释 | 详情 |
---|---|---|
Forwarding | 转发状态 | 端口既可转发用户流量也可转发BPDU报文,只有根端口或指定端口才能进入Forwarding状态。 |
Learning | 学习状态 (过程态) | 端口可根据收到的用户流量构建MAC地址表,但不转发用户流量。增加Learning状态是为了防止临时环路。 |
Listening | 侦听状态(过程态) | 端口可以转发BPDU报文,但不能转发用户流量。 |
Blocking/(Discrading(华为设备中)) | 阻塞状态 | 端口仅仅能接收并处理BPDU,不能转发BPDU,也不能转发用户流量。此状态是预备端口的最终状态。 |
Disabled | 禁用状态 | 端口既不处理和转发BPDU报文,也不转发用户流量。 不收发任何报文 |
由于STP没有确认机制,报文的传输需要时间,为了防止网络拓扑出现临时环路(上游收敛较快,下游收敛较慢,上游若是收敛完毕就开始转发数据可能会造成临时环路)。于是STP采用Forward Delay机制,来避免环路的产生(给下游交换机足够多的时间来收敛)。Forward Delay为15s,从Listening到Learning需要经过一个Forward Delay,从Learning到Forwarding需要经过一个Forward Delay共30s。
在稳定的STP拓扑里,非根桥会定期收到来自根桥的BPDU报文。如果根桥发生了故障,停止发送BPDU报文,下游交换机就无法收到来自根桥的BPDU报文。如果下游交换机一直收不到BPDU报文,Max Age定时器就会超时(Max Age的默认值为20秒),从而导致已经收到的BPDU报文失效,此时,非根交换机会互相发送配置BPDU报文,重新选举新的根桥。根桥故障会导致50秒左右的恢复时间,恢复时间约等于Max Age加上两倍的Forward Delay收敛时间(50s)。
此例中,SWA和SWB使用了两条链路互连,其中一条是主用链路,另外一条是备份链路。生成树正常收敛之后,如果SWB检测到根端口的链路发生物理故障,则其Alternate端口会迁移到Listening、Learning、Forwarding状态,经过两倍的Forward Delay后恢复到转发状态(30s)。
本例中,LSW1与HUB之间的链路发生了某种故障,LSW2因此一直收不到来自SWA的BPDU报文。等待Max Age定时器超时后,LSW2会认为根桥LSW1不再有效,并认为自己是根桥,于是开始发送自己的BPDU报文给LSW3,通知LSW3自己作为新的根桥。在此期间,由于LSW3的Alternate端口再也不能收到包含原根桥ID的BPDU报文。其Max Age定时器超时后,LSW3会切换Alternate端口为指定端口并且转发来自其根端口的BPDU报文给LSW2。所以,Max Age定时器超时后,LSW2、LSW3几乎同时会收到对方发来的BPDU。经过STP重新计算后,LSW2放弃宣称自己是根桥并重新确定端口角色。非直连链路故障后,由于需要等待Max Age加上两倍的Forward Delay时间,端口需要大约50秒才能恢复到转发状态。
在交换网络中,交换机依赖MAC地址表转发数据帧。缺省情况下,MAC地址表项的老化时间是300秒。如果生成树拓扑发生变化,交换机转发数据的路径也会随着发生改变,此时MAC地址表中未及时老化掉的表项会导致数据转发错误,因此在拓扑发生变化后需要及时更新MAC地址表项。
本例中,SWB中的MAC地址表项定义了通过端口GigabitEthernet 0/0/3可以到达主机A,通过端口GigabitEthernet 0/0/1可以到达主机B。由于SWC的根端口产生故障,导致生成树拓扑重新收敛,在生成树拓扑完成收敛之后,从主机A到主机B的帧仍然不能到达目的地。这是因为MAC地址表项老化时间是300秒,主机A发往主机B的帧到达SWB后,SWB会继续通过端口GigabitEthernet 0/0/1转发该数据帧。
拓扑变化过程中,根桥通过TCN BPDU报文获知生成树拓扑里发生了故障。根桥生成TC用来通知其他交换机加速老化现有的MAC地址表项。
拓扑变更以及MAC地址表项更新的具体过程如下:
[SWA]stp mode ?
mstp Multiple Spanning Tree Protocol (MSTP) mode
rstp Rapid Spanning Tree Protocol (RSTP) mode
stp Spanning Tree Protocol (STP) mode
[SWA]stp mode stp //华为设备默认模式为MSTP,所以选择STP需手动更改
stp priority [4096]
。注意优先级步长为:4096。stp root primary
指定根桥。原理是将交换机优先级修改成0stp cost [1000]
。华为设备端口开销为20000stp port priority [0]
。注意端口优先级步长为16。display stp