STP
STP技术背景
![](https://imgkr2.cn-bj.ufileos.com/c4a388f4-8e3e-4aa1-af58-00204773a916.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=YmSNG3RwLhwPSJcR1PjrmFy1mtE%253D&Expires=1604487757)
在上图所示的网络中,接入层交换机SW3单链路上联到汇聚交换机SW1,这是存在单链路故障的,这个网络的可靠性也是比较差的。如果SW3的上联链路发生故障,SW3(以及下联用户)就断网了。网络中存在的另一个单点故障问题,就是SW1如果宕机,SW3也就断网了。为了使得网络更加健壮、更具有冗余性,我们可以考虑将拓扑修改为如下图所示:接入层交换机SW3采用双链路上联到两台汇聚设备,构成一个物理链路冗余的二层环境,解决了单链路及单设备故障问题。
![](https://imgkr2.cn-bj.ufileos.com/474430e1-929d-4c02-ad25-e6008919379d.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=Sqe6iTMDEkDXv6N0TtCY%252BbYKkwQ%253D&Expires=1604487763)
但是这却带来了另一个大问题:网络中存在二层环路(所谓的二层环路指的是由二层链路构成的环路)。这个三角形的二层环路会为网络带来重大问题。我们已经知道交换机的工作机制:当其收到组播、广播数据帧时,会直接在VLAN内进行泛洪,另外,如果收到目的MAC地址未知的单播数据帧时,同样会进行泛洪,这么一来,当网络中出现二层环路时,就可能会导致广播风暴、多帧复制、MAC地址漂移等等多种问题,从而给网络带来巨大影响。即使不是人为搭建冗余的物理环境而导致的环路,网络也有可能因为种种原因出现二层环路引发的故障,例如由于人为的误接线缆等。那么有没有什么办法解决环路的问题呢?
解决方案有许多,实际上以太网中的二层环路问题是一个不小的课题,业界有许多非常经典的解决方案应对这个问题,数据设备厂商为了应对二层环路问题也都纷纷提出了自己的技术或方法论,但是这里不得不提到的是生成树(Spanning-tree,简称STP)协议,这是一个经典的、公有的协议,专门用于应对以太网二层环路。
通过STP,在逻辑上将特定接口进行阻塞(Block),从而实现保持物理上的冗余环境同时、二层环境中又可打破环路。例如在下图中,网络是存在环路的,在三台交换机上运行生成树协议后,STP经过一定的计算,最终决定阻塞掉一个接口,从而打破环路。
![](https://imgkr2.cn-bj.ufileos.com/2c34160a-5052-45f9-bc44-386062c8bedd.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=zpoFofGax%252B%252BA9ZDiCu5WakvpXpw%253D&Expires=1604487836)
当拓扑发生变更的时候,如下图所示,STP能够探测到这些变化,并且及时自动的调整接口状态,从而适应网络拓扑的变化,实现链路冗余。
![](https://imgkr2.cn-bj.ufileos.com/81e6f346-d0ad-4903-8586-37bdbae09781.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=BbR7xieVKdnC%252F2YA2FmCBj%252FFItI%253D&Expires=1604487841)
STP需要运行在网络中的所有交换机上以防止网络出现环路。一旦开启STP,交换机之间就会进行STP报文的交互,而STP的工作及计算正是依赖于这些报文的交互,STP操作的结果是将网络中的特定接口阻塞,从而达到消灭环路的目的,但是具体是什么接口被阻塞,可不是随便定的,STP一套自己的计算方法。本章我们主要介绍的是STP的802.1D标准。这个标准实际上已经非常古老而且基本不再使用了,但是却依然是入门生成树技术的必经之路,后续的更新实际上都是基于这个协议,因此掌握它是非常有必要的。接下来我们先了解一下802.1D标准的STP。
STP基本概念
1. 简单地说STP采用四个步骤来解决二层环路问题:
-
在交换网络中选举一个根桥(Root Bridge,简称RB); -
在每个非根桥上选举一个根端口(Root Port,简称RP); -
在每个段中选举一个指定端口(Designated Port,简称DP); -
阻塞非指定端口(Non-Designated Port,简称NDP)。
说明:这里的桥(Bridge),其实就是指交换机,由于交换机是由早期的网桥发展而来,因此在一些场合下,我们依然
沿用“ 网桥“或者“ 桥“来称呼交换机。
2. 关键字段及比较原则
运行STP的交换机之间会交互一些非常重要的协议报文,该报文称为网桥协议数据单元(BridgeProtocol Data Unit,简称BPDU)。STP之所以能够正常工作并构建一个无环的网络,是依赖于BPDU报文的泛洪。要理解STP的工作过程,非常重要的一点就是要理解BPDU中各字段的含义,因为这些都是STP赖以工作的根本。BPDU报文包含的所有字段在后文中有所涉及,这里我们先关注几个重点字段(此处介绍的是BPDU中的一种关键类型:配置BPDU):
![](https://imgkr2.cn-bj.ufileos.com/6d0d285d-1c42-4273-802d-3838af5a30ca.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=965%252BGetLsEBabH3DF4ISuwpi2%252FI%253D&Expires=1604487854)
-
桥ID(Bridge Identifier) 在STP中,每一台交换机都有一个唯一的标识符,这个标识符就是桥ID, 桥ID长度为8个字节,由两部分组成: 2个字节的桥优先级和 6个字节的桥MAC地址,其中 优先级默认为32768,可以手工更改。而桥MAC地址为网桥的背板MAC(可以简单地理解为系统MAC)。交换机发送的BPDU报文中,桥ID字段存放的就是自己的桥ID,而根桥ID字段存放的就是网络中根桥的桥ID。
![](https://imgkr2.cn-bj.ufileos.com/3e8a5ddb-432a-4bdb-9543-6a5a81ef2918.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=x2opKm3tLAjKTAEEUEsmc%252Fr1igU%253D&Expires=1604487858)
-
根路径开销(Root Path Cost) 根路径开销是一个用于度量接口到根桥的开销的值,交换机的接口到根桥的路径开销越小则被阻塞的可能性也就越小。
根桥发送出来的BPDU中,根路径开销字段值都为0。当非根桥在某个接口上收到这个BPDU再进行STP计算的时候,会把该BPDU中所包含的根路径开销累加上收到该BPDU的接口的STP Cost,从而得到从该接口到达根的总路径开销。
STP接口Cost与接口的带宽有关,接口带宽越高,则接口的STP Cost越小。
![](https://imgkr2.cn-bj.ufileos.com/b143a2c7-a17b-4d6e-b133-3dcbd850350b.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=J%252B%252BUXHRQ%252FW8l0WuoAnUrtXXiS48%253D&Expires=1604487864)
在上面的例子中,SW1是网络中的根桥,因此它发送BPDU报文中Root Path Cost字段为0,SW2在GE0/0/0收到这个BPDU后就可以进行相应的计算,它从GE0/0/0到达根桥的Root Path Cost等于自己接口的Cost加上所收到的BPDU报文中的Root Path Cost,结果就是1,随后SW2将这个BPDU转发给SW3,注意此时BPDU中的Root Path Cost被修改为1。SW3在收到这个BPDU并进行Root Path Cost计算的时候,Root Path Cost就等于自己FE0/0/0接口的Cost加上BPDU报文中的Root Path Cost
,也就是11。
-
端口ID(Port ID) 端口ID(2字节)包含两部分: 端口优先级(1字节)以及 端口编号(1字节)。 缺省时优先级值为128,该值可以通过命令修改,取值范围是0-255,值越小越优。
说明:在本文中,交换机的端口指的就是交换机的接口,在描述交换机时,笔者可能同时使用端口或接口一词。
![](https://imgkr2.cn-bj.ufileos.com/21b8902b-c360-496c-8839-0c1a531a3659.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=WBhAAvxNp3L0I7eJiKJ8%252BT9DppU%253D&Expires=1604487871)
生成树构造一个无环路拓扑时,总是使用相同的4步来判定(下面的信息都是BPDU中的字段):
-
Step1:最小的根桥ID -
Step2:最小的根路径开销 -
Step3:最小的桥ID -
Step4:最小的端口ID
STP操作
1. 在交换网络中选举一个根桥
![](https://imgkr2.cn-bj.ufileos.com/e85f0ea0-78e7-477f-bc95-0e45f7d694d2.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=OCZZO2A7qA6hAot%252F%252F9CnYEJ3MsM%253D&Expires=1604487892)
以上图所示的网络为例,我们在交换机上都开启了STP,初始情况下,所有的交换机都认为自己就是网络中的根桥,于是都向网络中泛洪配置BPDU,在各自发送的配置BPDU中,都声称自己是根桥。经过PK之后,拥有最小桥ID的交换机胜出,成为这个交换网络真正的根桥。
根桥的选举过程:首先比较桥优先级,优先级值最小的交换机胜出,如果优先级相等,则再比较桥MAC地址,也是优选最小的值。所以在上图所示的例子中,SW1胜出成为根桥。
根桥是STP计算得出的无环的拓扑(可以形象地理解为一棵树)的树根,STP后续的计算都是以这个树根作为参考点的。当然,在实际的项目中,我们通常是不会通过MAC地址的比较让交换机自己去选根桥的,为了网络的稳定和可控,一般会将核心交换设备配置为网络的根桥——将其桥优先级调节为最小值,从而确保其成为根桥。
2. 在每个非根桥上选举一个根端口
在选举出根桥后,根桥仍然持续向网络中发送配置BPDU,而非根桥将持续不断地收到根桥发送的配置BPDU。STP计算过程的第二步是在每个非根桥上选择一个根端口,根端口是每台交换机上收到最优BPDU的端口。
一台非根桥可能会有多个端口连接到交换网络,每个非根桥上必须选举一个根端口,而且只会选举一个根端口。当存在多个端口时,交换机在这些端口上都会收到配置BPDU,交换机会比较这些配置BPDU,然后选择比较结果最优的接口作为根端口,按照如下顺序比较:
-
比较配置BPDU中的根桥ID字段,选择值小的; -
如果前者相等,则将配置BPDU中的根路径开销值读取出来,与收到该BPDU的接口的Cost相加,比较相加后的值,选择值最小的; -
如果前者还相等,则比较配置BPDU中的桥ID字段; -
如果前者还相等,则比较端口ID字段。
![](https://imgkr2.cn-bj.ufileos.com/6695628f-7e8a-4f76-8f98-bccea3479805.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=kB1At1dzaW1%252F62WRYaSU78NeTW0%253D&Expires=1604487937)
例如在上图中,SW3有两个接口接入到这个交换网络中:Port1及Port2,现在SW3要在两者之间选举一个根端口。SW3会从Port1和Port2都收到配置BPDU报文(从Port1收到的是SW1直接发送过来的,从Port2收到的是根桥SW1发往SW2,然后由SW2转发过来的),在报文中都有携带“桥ID、根路径开销、桥ID、端口ID”等关键字段,那么SW2就会进行Port1及Port2的PK,PK什么呢?先PK这两个端口到达根桥的根路径开销,优选值更小的,如果相等,则PK这两个接口收到的BPDU中的桥ID,也是优选值更小的,如果连这个也相等呢,那就进一步PK这两个接口收到的BPDU中的端口ID。很明显,这里Port1到根的根路径开销更小,而从Port2到根呢,除了自己接口的开销还要累加上SW2的Port1的开销。所以SW3上,Port1成为了根端口。
3. 为每个段选举一个指定端口(Designated Port)
![](https://imgkr2.cn-bj.ufileos.com/85f2e6ef-74de-4a07-b725-7c38bde1e9fc.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=8MQSdlE2deSUKJ3p%252BfFc4J5r7k4%253D&Expires=1604487942)
非根桥选举出根端口后,会将根端口上收到的配置BPDU进行计算:为本交换机上的其他端口各计算一份配置BPDU,而这些接口也会从网络中收到配置BPDU,此时交换机会比较这两份配置BPDU,如果前者更优,则该端口成为指定端口,如果后者更优,则该端口成为非指定端口并且将被阻塞。
交换机根据根端口上收到的最优配置BPDU后为其他端口计算配置BPDU的过程如下: (1) 配置BPDU中的根桥ID替换为根端口的配置BPDU的根桥ID; (2) 根路径开销替换为根端口配置BPDU的根路径开销加上根端口的开销; (3) 桥ID替换为自身设备的桥ID; (4) 端口ID替换为自身端口ID。
说明:根桥的所有端口都是指定端口,都不会被阻塞。
4. 阻塞非指定端口(Non-Designated Port)
![](https://imgkr2.cn-bj.ufileos.com/639e6459-65d7-4bb8-8d7b-3d555e4cc925.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=z3CO6JNDByKWWQ%252BPsxGR4iLxDCA%253D&Expires=1604487962)
最后,非指定端口被阻塞,环路就打破了。
STP报文
STP的BPDU有两种类型:配置BPDU(Configuration BPDU)及TCN BPDU(Topology Change BPDU)。
两种BPDU各有各的用途。
1. 配置BPDU
在网络刚开始运行的阶段,所有交换机都会从所有端口发送配置BPDU,大家都认为自己是根桥,随着配置BPDU泛洪和收集、计算,根据配置BPDU中所含信息,大家PK出来个结果,根桥被选举出来了。
在此之后根桥以默认2S为周期发送配置BPDU,所有的非根交换机从自己的根端口收到配置BPDU,再从自己的指定端口计算BPDU发出去。这就有点像我们从根桥倒一盆水下来,水在重力的牵引下顺着这颗无环的树从上往下不断的往下流。另外,被阻塞的非指定端口会源源不断的收到链路上的配置BPDU并一直侦听之,当其在一定时间内没有再收到配置BPDU,则认为链路出现了故障,开始进入新的收敛阶段。
下表是配置BPDU的报文格式:
![](https://imgkr2.cn-bj.ufileos.com/80c85d0d-1038-417c-bf8f-36e6d0510d99.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=GUZst9fA0OpuvtJ2pqMXw6t2kWM%253D&Expires=1604487982)
![](https://imgkr2.cn-bj.ufileos.com/ef3b290e-9b6c-47c6-9719-eb0d578cf0d2.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=HOv6QjS3MooFJS0WAvhxQO146Rc%253D&Expires=1604487992)
2. TCN BPDU
![](https://imgkr2.cn-bj.ufileos.com/8cd71329-0394-468d-98fe-ffe60d174e19.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=j1WwfyLTE85Ka%252FOSjnLauiVlFe4%253D&Expires=1604487999)
当网络拓扑发生变化的时候,最先意识到变化的交换机(假设该交换机不是根桥)会从根端口发送TCNBPDU(Topology Change Notofication BPDU,拓扑变更通知BPDU,该BPDU报文中TYPE字段=0x80),也就是朝着根桥的方向发送TCN BPDU,这个报文会一跳一跳地传递到根交换机。上联的交换机在收到了该交换机发送上来的TCN BPDU后,除了向它自己的上一级交换机继续发送TCN BPDU外,还需回送一个TCA BPDU(FLAG字段中TCA位为1的配置BPDU)的确认信息给该交换机。当根桥接收到TCN后意识到了拓扑变化,遂向所有网桥发送TC BPDU(FLAG字段中TC位为1的配置BPDU)。
交换机们收到根桥发出来的TC BPDU后,会立即删除自己的MAC地址表,以便适应新的网络拓扑。
STP的计时器
STP有三个非常重要的计时器:
-
Hello Timer:根桥周期性发送配置BPDU的时间间隔,缺省为2s。 -
转发延迟计时器(Forward Delay Timer):接口从Listening转换到Learning状态,或者从Learning转换到Forwarding状态过程中所需等待的时间,缺省为15s。 -
最大生存时间(Max Age Timer):在丢弃配置BPDU之前,交换机用来存储配置BPDU的时间,缺省
为20s。如果一个被阻塞的接口(非指定端口)在收到一个配置BPDU后,20s内没有再次收到配置BPDU,则切换到Listening状态。
网络中的生成树拓扑依附于根桥的计时器,根桥将配置BPDU中的计时器时间间隔传递给所有交换机。对于802.1D标准的STP而言,端口从Blocking到Forwarding通常要30-50s(30s是15+15,也就是两个转发延迟时间,50s即20+15+15)。
STP端口状态
![](https://imgkr2.cn-bj.ufileos.com/86c3a28b-d168-44f1-a69c-0a92ca09da02.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=GeOXg4KUdkNnn1Y%252BUsoLPaDW5dc%253D&Expires=1604488007)
关于为什么要定义这么多的端口状态,其实很好理解,拿Learning来说,为什么不让端口一旦被选举为指定端口后立即进入转发状态呢?设想一下,端口激活后,交换机在该端口是没有学习到任何的MAC地址表项的,如果没有设计Learning状态的话,端口将直接进入转发状态,那么就有可能引发短暂的数据泛洪(交换机收到目的MAC地址未知的数据帧时会进行泛洪)。
下图是每个状态的切换关系图:
![](https://imgkr2.cn-bj.ufileos.com/8e18160d-123f-41e7-918d-1a49b5697d06.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=D%252FkKBTTyFlyhvpbduYM73Bvi79k%253D&Expires=1604488012)
STP的基础配置
1. 基础配置
指定生成树协议类型(STP/RSTP/MSTP):
[SW] stp mode { stp | rstp | mstp } 默认是MSTP
配置交换机优先级:
[SW] stp priority pri 默认是32768
配置该交换机成为主根桥:
[SW] stp root primary 事实上是将交换机的优先级的值设置为最小
配置该交换机成为次根桥:
[SW] stp root secondary 次根桥就是二大王
启用生成树:
[SW] stp enable
配置端口STP优先级:
[SW] interface GigabitEthernet0/0/24
[SW-GigabitEthernet0/0/24] stp priority priority
配置端口路径开销:
[SW] interface GigabitEthernet0/0/24
[SW-GigabitEthernet0/0/24] stp cost cost
2. 基础实验
![](https://imgkr2.cn-bj.ufileos.com/00f07fc1-3086-4f19-b485-bc6b720e6c2e.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=sJL9Mf0kvK9wdY2D9oHhwKFnCyM%253D&Expires=1604488020)
在上图所示的网络中,在SW1、SW2及SW3上运行STP,并将SW1指定为主根桥,SW2指定为次根桥,最终需使得SW3的GE0/0/22接口被阻塞。
从拓扑我们能非常直观的看出,在物理上这是一个冗余的环境,并且存在二层环路。一旦在这个网络中出现流量,那么流量就很有可能在环路中被不断泛洪从而导致广播风暴。当出现广播风暴时,我们能从设备的指示灯上观察到非常直观的现象:设备的指示灯会出现非常规律的“齐闪”。另外,交换机的接口带宽利用率可能会攀升到一个比较高的值,而且如果广播风暴比较严重,交换机的CPU利用率也可能会飙高,从而影响到其工作。
SW1的配置如下:
[SW1] stp mode stp #指定生成树协议类型为STP(802.1D)
[SW1] stp enable #激活STP
SW2的配置如下:
[SW2] stp mode stp
[SW2] stp enable
SW3的配置如下:
[SW3] stp mode stp
[SW3] stp enable
在完成上述配置后,STP开始工作,并开始选举根桥,三台交换机中,STP桥ID(桥优先级和桥MAC)最小的交换机将成为本交换网络的根桥。当然,所有的交换机默认的桥优先级为32768,这样一来拥有最小背板MAC的交换机将成为网络的根桥,这显然带有一定的随机性,在实际的网络部署中,我们往往会手工指定一台设备成为根桥,从而保证生成树计算的稳定性。例如在这个例子中,手工指定SW1成为网络的主根桥,SW2成为网络的次根桥:
SW1上增加的配置如下:
[SW1] stp root primary
SW2上增加的配置如下:
[SW2] stp root secondary
现在,我们再看看实验效果,在SW1上查看STP的全局信息:
[SW1] display stp
-------[CIST Global Info][Mode STP]-------
CIST Bridge :0 .4c1f-cc06-71d8
Config Times :Hello 2s MaxAge 20s FwDly 15s MaxHop 20
Active Times :Hello 2s MaxAge 20s FwDly 15s MaxHop 20
CIST Root/ERPC :0 .4c1f-cc06-71d8 / 0
CIST RegRoot/IRPC :0 .4c1f-cc06-71d8 / 0
CIST RootPortId :0.0
BPDU-Protection :Disabled
CIST Root Type :Primary root
TC or TCN received :9
TC count per hello :0
STP Converge Mode :Normal
Time since last TC :0 days 0h:4m:11s
Number of TC :11
Last TC occurred :GigabitEthernet0/0/21
从输出的信息我们得知,本交换机的桥ID为 0:4c1f-cc06-71d8,其中0为交换机的桥优先级,这显然是我们的命令stp root primary的作用,交换机的优先级被配置为0——最小值也是最优的值。4c1f-cc06-71d8是本机的MAC地址。而上述输出的信息中,根桥的MAC也是4c1f-cc06-71d8,这就表明,本交换机就是网络的根桥。再来查看下SW1的生成树接口状态:
[SW1] display stp brief
MSTID Port Role STP State Protection
0 GigabitEthernet0/0/21 DESI FORWARDING NONE
0 GigabitEthernet0/0/24 DESI FORWARDING NONE
使用上述命令,可以查看STP的相关简化信息,从上面的输出可以看出,SW1的两个接口都是指定接口(DESI),并且都是Forwarding转发状态。
再去SW2上看看:
[SW2] display stp
-------[CIST Global Info][Mode STP]-------
CIST Bridge :4096 .4c1f-cc34-71cd #本机的桥ID
Config Times :Hello 2s MaxAge 20s FwDly 15s MaxHop 20
Active Times :Hello 2s MaxAge 20s FwDly 15s MaxHop 20
CIST Root/ERPC :0 .4c1f-cc06-71d8 / 1 #根桥的桥ID,也就是SW1
CIST RegRoot/IRPC :4096 .4c1f-cc34-71cd / 0
CIST RootPortId :128.24
BPDU-Protection :Disabled
CIST Root Type :Secondary root
TC or TCN received :60
TC count per hello :0
STP Converge Mode :Normal
Time since last TC :0 days 0h:8m:8s
Number of TC :9
Last TC occurred :GigabitEthernet0/0/24
SW2为次根桥,它将在检测到SW1出现故障后,替代它成为网络的根桥。我想,你已经能想到SW3上哪一个端口将被Blocked了:
[SW3] display stp brief
MSTID Port Role STP State Protection
0 GigabitEthernet0/0/21 ROOT FORWARDING NONE
0 GigabitEthernet0/0/22 ALTE DISCARDING NONE
SW3的GE0/0/22口现在是Discarding状态,被阻塞了。这是因为这个接口到达根桥SW1的开销最大。如果此时希望SW3被阻塞的不是GE0/0/22口,而是GE0/0/21口呢?一种可选的办法是,将GE0/0/21 的接口开销调大,使得从这个接口上收到配置BPDU后,累加的根路径开销比GE0/0/22口的累加值要大,也就是使得这个接口距离根桥SW1的“开销”更大、“更远”。
SW3增加配置如下:
[SW3] interface GigabitEthernet 0/0/21
[SW3-GigabitEthernet0/0/21] stp cost 10000
完成上述配置后,检查一下SW3的接口角色和状态:
[SW3] display stp brief
MSTID Port Role STP State Protection
0 GigabitEthernet0/0/21 ALTE DISCARDING NONE
0 GigabitEthernet0/0/22 ROOT DISCARDING NONE
STP 的特性及优化
STP及BPDU取消使能
[Switch-GigabitEthernet0/0/1] stp disable
上述命令用于在接口上关闭STP。如果交换机在全局使能了STP,则所有接口也将激活STP。使用上述命令,将会关闭某个特定接口的STP,这样一来这个接口将不再参与STP计算,此后,使用display stp interface
命令会看到该接口的STP被禁用,使用display stp brief
命令则不会看到这个接口出现在STP接口列表中。
当交换机的一个接口连接着一台路由器(的路由接口)或者其他不可能产生二层环路的设备时,在交换机的这个接口上运行STP实际上是没有意义的,因此可以考虑将该接口的STP关闭。
[Switch-GigabitEthernet0/0/2] bpdu disable
接口级命令bpdu enable用来配置接口上送BPDU报文,接口对目的MAC地址属于BPDU MAC的报文上送CPU处理,BPDU MAC可以通过display bpdu mac-address
命令查看,而bpdu disable
命令将使接口把收到的BPDU报文丢弃。
值得注意的是,如果错误的配置bpdu disable
将会导致STP计算的错误从而导致环路,因此该命令要格外留意。S5300 V100R005C01SPC100版本的交换机默认在STP全局激活的情况下接口的bpdu是disable的(S5300的其他软件版本则要看版本的描述),需要注意这一点。
边缘端口(Edged-port)
1. 基本概念
![](https://imgkr2.cn-bj.ufileos.com/d4b96d69-9230-4c1f-8960-7679fcb0e87c.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=2207ldZPoxu5fbOK1hRNWCjRrlo%253D&Expires=1604488034)
我们知道在运行了STP的交换机上,一个端口在UP之后,需要经过Listening、Learning两个状态才能够最终进入Forwarding状态开始转发数据帧(当然前提是该端口不能是非指定端口),这里就耗费了两个15s的延迟时间。这实际上是非常低效的。
交换机连接终端设备(例如PC、服务器等)的端口一般是不会产生二层环路的,其实并不需要上述状态的切换过程,可直接进入转发状态,提高工作效率。将交换机连接终端设备的端口配置为边缘端口(Edge-port)即可解决上述问题。边缘端口不参与生成树的计算,它可以在UP后立即进入转发状态。另外,边缘端口的UP/DOWN不会触发STP拓扑变更而发生TC报文。
在没有配置BPDU保护(将在后续的内容中介绍)的情况下,边缘端口一旦收到BPDU,就丧失了边缘
端口属性,成为了普通的STP端口。
2. 配置实现
![](https://imgkr2.cn-bj.ufileos.com/561c6423-b839-42ec-94a3-9ace6a17cd51.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=Lad4HikiaH8%252BCbFXl3NYLLMY82E%253D&Expires=1604488042)
运行了STP的交换机,在其连接终端设备的接口上都可以开启该特性。
注:建议将交换设备用于连接服务器、终端主机、PC等的接口配置为边缘端口。边缘端口不参与STP运算,可以在Up后直接转到Forwarding状态,不经历时延。但是一旦边缘端口收到配置BPDU,就丧失了边缘端口属性,成为普通STP端口,并重新进行生成树计算,从而引起网络震荡。因此建议搭配BPDU保护功能一起使用。
在实际的项目中,如果网络中采用ATAE/E9000设备,如下图所示,那么我们会将ATAE/E9000的交换板连接业务板的内部接口配置为边缘端口,因为这些端口用于连接刀片服务器的网卡(网卡工作在三层模式),如图中所示。
![](https://imgkr2.cn-bj.ufileos.com/d204b475-3567-4a59-9e47-8d60e119a7c4.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=bYklJHAij7h2POm5Vm%252Bv1%252Bpzqaw%253D&Expires=1604488057)
BPDU保护(Protection)
1. 技术背景
![](https://imgkr2.cn-bj.ufileos.com/8281eefc-a208-4b3f-9547-7da38211b41e.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=x8NG9%252FTi2CYVpTHuCUuRcFo8C0E%253D&Expires=1604488063)
边缘端口一般用于直接和用户终端相连,正常情况下,边缘端口不会收到BPDU报文(因为连接的是终端,而不是交换设备)。但是如果攻击者伪造BPDU恶意攻击交换机那就会存在安全隐患(或者接口误接了交换机,那么就有可能产生环路),当边缘端口接收到BPDU时,设备会自动将边缘端口设置为非边缘端口,并重新进行生成树计算,这个过程就有可能引起网络的震荡。
通过使能BPDU保护可以防止伪造BPDU恶意攻击。
2. 基本概念
交换机上启动BPDU保护功能后,如果边缘端口收到BPDU报文,设备将关闭(shutdown)这些端口,同时通知网管系统。缺省情况下,交换机的BPDU保护功能并未开启。
3. 配置实现
![](https://imgkr2.cn-bj.ufileos.com/bfa3d4a4-7353-47de-bb60-c5dffe75f702.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=JFpV3VEe%252Fh2jzUCF8KiEVfSdims%253D&Expires=1604488070)
在上图所示的场景中,我们在SW3上将GE0/0/1配置为边缘端口,随后在SW3上开启了BPDU-Protection特性。当SW3的GE0/0/1口收到BPDU报文时,交换机将产生如下提示信息,并将GE0/0/1口shutdown:
Apr 3 2014 11:09:41 SW3 %%01MSTP/4/BPDU_PROTECTION(l)[6]:This edged-port GigabitEthernet0/0/1 that
enabled BPDU-Protection will be shutdown, because it received BPDU packet!
Apr 3 2014 11:09:41 S9300-1 %%01IFPDT/4/IF_STATE(l)[7]:Interface GigabitEthernet0/0/1 has turned into DOWN
state.
此时在SW3上查看接口的STP信息如下:
[SW3] display stp interface GigabitEthernet 0/0/1
----[Port26(GigabitEthernet0/0/1)] [DOWN]----
Port Protocol :Enabled
Port Role :Disabled Port
Port Priority :128
Port Cost(Dot1T ) :Config=auto / Active=200000000
Designated Bridge/Port :0.0025-9ef8-9e7d / 128.3
Port Edged :Config=enabled / Active=enabled
BPDU-Protection :Enabled
Point-to-point :Config=auto / Active=false
Transit Limit :147 packets/s
Protection Type :None
Port STP Mode :MSTP
Port Protocol Type :Config=auto / Active=dot1s
BPDU Encapsulation :Config=stp / Active=stp
PortTimes :Hello 2s MaxAge 20s FwDly 15s RemHop 20
… …
要恢复被shutdown的BPDU受保护边缘端口,可使用手工在接口下执行undo shutdown
命令的方式,或者采用自动恢复的方式,即在系统视图下执行命令error-down auto-recovery cause cause-iteminterval interval-value
,激活接口管理状态自动恢复为Up的功能,并设置接口自动恢复为Up的延时时间,使被关闭的端口经过延时时间后能够自动恢复。对于参数interval,取值范围是30~86400,单位是秒,配置时需要注意两点:
-
取值越小表示接口的管理状态自动恢复为Up的延迟时间越短,接口Up/Down状态震荡频率越高。 -
取值越大表示接口的管理状态自动恢复为Up的延迟时间越长,接口流量中断时间越长。
根保护(Root Protection)
1. 技术背景
![](https://imgkr2.cn-bj.ufileos.com/2fcf2b15-1968-4ecc-a71d-d1ee56c8f5d0.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=uws5%252FLDaD3zQ7OyH2oNdDNYonp4%253D&Expires=1604488077)
2. 基本概念
在SW1的GE0/0/24口上部署了根保护后,当该接口再收到更优的BPDU报文后,SW1将这个接口切换到Discarding状态,如此一来SW1的根桥宝座就能够坐的很稳当。
3. 配置实现
![](https://imgkr2.cn-bj.ufileos.com/f63463aa-50ca-43a3-8828-48c14dbf3c6b.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=gWevHfiHiBeE3h2Y%252FLYjr5X63vY%253D&Expires=1604488083)
[SW1] display stp brief
MSTID Port Role STP State Protection
0 GigabitEthernet6/0/22 DESI FORWARDING NONE
0 GigabitEthernet6/0/24 DESI DISCARDING ROOT
在交换设备上配置根保护功能,通过维持指定端口的角色来保护根交换设备的地位。根保护是指定端口上的特性。当端口的角色是指定端口时,配置的根保护功能才生效。若在其他类型的端口上配置根保护功能,则不会生效。
环路保护(Loop Protection)
1. 技术背景
![](https://imgkr2.cn-bj.ufileos.com/7d301f69-a927-41fc-8c54-0d0670662c7f.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=dzS7pdtgTgnHrqmp2SNdA5FBwIQ%253D&Expires=1604488090)
在上图所示的网络环境中,SW1为STP根桥,SW3的GE0/0/23由于被选举为非指定端口因此处于Discarding状态,该接口虽然处于Discarding状态,但是仍然会持续侦听SW2发来的BPDU报文。
![](https://imgkr2.cn-bj.ufileos.com/377acffc-0e42-49b4-89b7-e43bc29e9be4.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=Nv4Pi%252FlmLsvG2YZGafECPR0FfHw%253D&Expires=1604488100)
现在,SW2、SW3之间的链路突然发生了单向链路故障,SW2发送的报文无法到达SW3,这将导致SW3的GE0/0/23口无法再收到BPDU,因此它认为SW2发生了故障,于是重新进行STP计算,最终GE0/0/23口的角色将切换成指定端口,而状态也将切换到转发状态,至此就出现了环路,因为从SW3到SW2的单向链路仍然在工作。
2. 基本概念
交换机的根端口及处于Disacarding状态的接口会源源不断的收到BPDU报文,当这些端口由于链路的
单向故障导致收不到BPDU报文的时候,就会进行STP的重新计算。原来的根端口就会变成指定端口,原来处于Discarding状态的端口会切换到Forwarding状态,从而导致环路的出现。在根端口上启用了Loop Protection
后,如果其端口角色发生变化,例如切换为指定端口,那么该端口将会被阻塞,也就是进入Discarding状态,直到再次收到BPDU。在阻塞端口上启用了Loop Protection
后,端口将一直处于Discarding状态,即使该端口被选举为指定端口。在STP中,此功能只能配置在根端口、替代端口及备份端口上。
3. 配置实现1(该特性在根端口上部署)
-
LOOP Protection 部署前:
![](https://imgkr2.cn-bj.ufileos.com/5597c9a0-4d19-4431-acbf-f4792fee9aaa.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=UEk2R8xNhwT%252BCW%252BeCoakNocfavk%253D&Expires=1604488107)
在STP完成收敛后,SW3的GE0/0/22口是根端口,GE0/0/23是替代端口处于Discarding状态。
![](https://imgkr2.cn-bj.ufileos.com/c6f6871f-9f54-4a67-bec5-aa3654ef598b.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=jTTRjcSuf%252FMVhP5HV4Ju6XTdLlw%253D&Expires=1604488113)
在SW1的GE0/0/22口上执行disable stp,来模拟链路出现单向故障的情况,如此一来SW3将无法再从GE0/0/22口收到ROOT SW1发送过来的BPDU了。
![](https://imgkr2.cn-bj.ufileos.com/89e84ed4-eb2a-4b7c-8d52-cbff43c275ed.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=z4vC7VeeDIJw31mxRKOMc%252BcIzvI%253D&Expires=1604488118)
STP再次完成收敛后,SW3的GE0/0/23口被选举成为根端口,而GE0/0/22口成为指定端口,如此一来,环路就产生了。
-
LOOP Protection 部署后
![](https://imgkr2.cn-bj.ufileos.com/8fe50408-5be1-47a2-9cb3-eab7fc65a067.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=7DoYB2wI362wNT%252BxSUbtamTOXcE%253D&Expires=1604488123)
现在我们在SW3的GE0/0/22口上部署loop protection特性。
![](https://imgkr2.cn-bj.ufileos.com/b727ba9f-bbdd-4de0-9305-07df01845e03.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=LwarZnTwzrkZJTVPtN%252FYPuoc5II%253D&Expires=1604488128)
SW3重新进行STP的计算,GE0/0/23口成为根端口,GE0/0/22口成为指定端口,但是由于GE0/0/22口上部署了Loop Protection,因此该接口虽然角色为指定端口,状态却会保持在Discarding状态,从而避免了环路的出现。
4. 配置实现2(该特性在替代端口上部署)
![](https://imgkr2.cn-bj.ufileos.com/ca9c1eba-c450-44e1-8981-bf5b7f3e27c5.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=shE9wTVFKOI%252Fc1u856L0xYAdxFY%253D&Expires=1604488135)
另外一个示例是,LoopProtection部署在替代端口上,如上图所示。那么当SW2及SW3之间出现单向链路故障时,SW3将无法从GE0/0/23口再收到BPDU,于是SW3重新进行STP计算,此时GE0/0/23口成为了指定端口,但是由于配置了Loop Protection特性,因此该接口会保持在Discarding状态,从而避免了环路的产生。
![](https://imgkr2.cn-bj.ufileos.com/41c6d550-75fa-41b2-8c01-17e9ec128c8e.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=eWNVkrmDMYcKvZRwFTeNi6m1on8%253D&Expires=1604488140)
TC Protection
![](https://imgkr2.cn-bj.ufileos.com/6a982c34-d3a9-410d-bfd1-479d0ab71d32.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=KifzvqN8FWN6kbwgJAGfuHl3brE%253D&Expires=1604488147)
设备在收到TC-BPDU后会执行MAC地址表项及ARP表项的删除操作,如果有攻击者伪造大量的TC-BPDU报文对交换机进行攻击,交换机将频繁的进行上述表项的删除及刷新操作从而造成极大的负担,给网络的稳定带来很大的隐患。
在交换机上开启TC-Protection后,交换机会在收到TC-BPDU后删除上述表项的同时启动周期为10s的定时器,在此周期内,如果交换机再次收到TC-BPDU报文,则最多可以进行1次删除上述表项的操作,从而实现对交换机的保护。