STP高级特性(实验)

来源:互联网 发布:window多线程编程 编辑:程序博客网 时间:2024/05/22 13:35

实验目标:理解STP工作原理,掌握STP选举过程

实验TOP

131558879.png

看起来有点小复杂哦,不过别担心,后面我会分解给大家看

基本配置:

SW1

!hostname SW1!no ip domain lookup!spanning-tree vlan 1 priority 4096!interface FastEthernet1/0 bandwidth 10000!line con 0 exec-timeout 0 0logging synchronous!

SW2

!hostname SW2!no ip domain lookup!interface FastEthernet1/0 bandwidth 10000!line con 0 exec-timeout 0 0logging synchronous!

SW3

!hostname SW3!no ip domain lookup!spanning-tree vlan 1 priority 24576!interface FastEthernet1/3 bandwidth 10000!interface FastEthernet1/4 bandwidth 10000!line con 0 exec-timeout 0 0logging synchronous!

SW4

!hostname SW4!no ip domain lookup!spanning-tree vlan 1 priority 28672!interface FastEthernet1/0 bandwidth 10000!interface FastEthernet1/3 bandwidth 10000!interface FastEthernet1/4 bandwidth 10000!interface FastEthernet1/5 bandwidth 10000!line con 0 exec-timeout 0 0logging synchronous!

SW5

!hostname SW5!no ip domain lookup!interface FastEthernet1/0 bandwidth 10000!interface FastEthernet1/2 bandwidth 10000!line con 0 exec-timeout 0 0logging synchronous!

SW6

!hostname SW6!no ip domain lookup!interface FastEthernet1/3 bandwidth 10000!interface FastEthernet1/4 bandwidth 10000!line con 0 exec-timeout 0 0logging synchronous!

SW7

!hostname SW7!no ip domain lookup!interface FastEthernet1/0 bandwidth 10000!interface FastEthernet1/1 bandwidth 10000!line con 0 exec-timeout 0 0logging synchronous!

(注:未设置接口的默认带宽为100000kbit/sec,即100Mb/s)


第一部分:前奏

在解决所有问题之前,我们很有必要先了解一下交换机是怎样工作的。

交换机的工作过程分为学习转发两个步骤:

  • 学习过程:交换机每收到一个数据帧,会将帧的源MAC地址和接收该帧的端口写入自己的 mac-address-table (又称CAM表);

  • 转发过程:交换机根据帧的目的MAC地址查找自身的CAM表,如果有匹配的条目,则从相应的接口将该帧转发出去;如果CAM表中没有匹配条目,则交换机会除接收端口外整网泛洪该帧。

了解了交换机的工作原理,我们来看一个简单的案例:

131857529.png

如上图所示,一个公司网络中,三台交换机,一台网关路由器,和两台PC互相连接。PC1可以通过sw1,sw2访问网关,PC2也可以通过sw3,sw2访问外网。现如果sw1的 f1/1接口突然因故障down掉,那么PC1便不能再访问网关,网络的可用性就不能得到保障。

为了解决这种单点失效的问题,常用的方法是在网络中做冗余备份。这里我们在sw1和sw3之间接一条冗余链路,如图:

131933281.png

现在如果sw1的 f1/1端口再down掉,PC1还可以通过sw1-sw3-sw2来访问网关,网络的可用性就大大地提高了。

解决了单点失效的问题,我们似乎可以松一口气了,可是新的问题又来了:

132025865.png

由于只涉及到二层网络,这里我们不再考虑网关路由器;且假设最初

所有交换机的CAM表均为空,PC1的ARP表中已经有PC2的MAC地址


如图,当PC1和PC2通信时:

第1步:PC1向sw1发送一个二层数据帧,源MAC为自身MAC,目的MAC为PC2的MAC。

第2步:根据交换机的工作原理,sw1首先学习帧的源MAC地址,然后查找目的MAC。由于初始时CAM表为空,sw1没有发现PC2的MAC,则除 f1/0外将该数据包泛洪到 f1/1和 f1/2接口。

132058619.png

第3步:sw2收到帧后会转发给 f1/0接口,sw3则将帧泛洪到它的 f1/0和 f1/1接口,此时问题出现了:

当sw2从 f1/1接口收到sw1传过来的帧时,会将PC1的MAC地址和 f1/1接口的映射记录到CAM表中,而后来sw2又从 f1/0接口收到了来自sw3的同样的帧,这时sw2不得不把刚才学到的记录更新为PC1的MAC和 f1/0接口的映射,这就是CAM表不稳定的问题。

132132571.png

第4步:在步骤3中,PC2已经接收到了sw3泛洪过来的帧,当sw3收到sw2传过来的帧时,又会把相同的帧从 f1/1和 f1/2接口泛洪出去,这时PC2又会收到一个不必要的相同的帧,这就是重复帧的问题。

132207651.png

第5步:sw1收到分别来自 f1/1和 f1/2接口的帧,则会分别从接口 f1/0,f1/2和 f1/0,f1/1将同样的帧泛洪出去。我们突然间发现,网络中正在发洪水一样泛滥着同一个帧:这就是臭名昭著的广播风暴!我们的网络会在极短的时间内瘫痪掉!

到这里,我们迷茫了:为了解决网络中的单点失效问题,我们引入了冗余,可冗余又会造成CAM表不稳定、重复帧、广播风暴这些令人头疼的问题,那我们究竟该怎么办呢?

别担心,STP来解救我们了!!!

STP (Spanning Tree Protocol) 是Cisco交换机内置的一种协议,STP利用 BPDU(Bridge Protocol Data Unit) 和其他交换机进行通信,遵循一定的规则确定出哪个交换机应该阻断哪个接口,最终构建出一棵无环路的生成树,从而解决了网络冗余带来的一系列问题。

等等,上面提到了一个名词:BPDU。BPDU是什么?

BPDU 即桥协议数据单元,是交换机进行STP选举的法宝,如上所述,STP就是通过交换各自的BPDU信息来确定生成树的。在实际传输过程中,BPDU消息是封在以太网帧中的,BPDU字段的格式如下:

132237900.png

这里我们只关心“根ID,路径开销,网桥ID”和“端口ID”字段,因为STP选举生成树就是依据这四个字段进行的。

ID/网桥ID:每个交换机都具有一个唯一的桥ID,由网桥优先级(Bridge Priority)和MAC地址两部分组成,如图:

132311171.png

Bridge Priority 默认值为32768,取值范围是0~65535,以4096递增;

Extend System ID (扩展系统ID)是VLAN号,它会和 Bridge Priority 叠加组成BID的第一部分,例如:Bridge Priority 是32768,VLAN号是1,那么BID第一部分的值就是 32769(早期的STP是不支持Extend System ID的,随着网络的发展,Cisco增强了STP的实现,其中包括支持Extend System ID字段)。

MAC Address 即设备的MAC地址。

路径开销:又称为cost,不同带宽的链路,路径开销值也不同:

132344685.png

注:STP使用的端口开销值由IEEE定义。随着网络速度的提升,旧的规范不能

区别出10Gbit/s和1Gbit/s链路的cost值,已经被修订后的新规范替代。

端口ID (PID)由端口优先级(Port Priority)和端口ID两部分组成。端口优先级默认值为128,端口ID随端口号的增大而增大。例如:sw1的 f0/1端口ID可能为128.1,f0/5的端口ID可能为128.5。

现在我们明白了,原来交换机之间就是通过交换这些信息来选举STP生成树的。那么,交换机收到BPDU后,又会拿这些信息来做些什么呢?

STP生成树的选举过程及基本原则:

1、在所有交换机中选举出一个BID最小的作为根桥交换机(则其余的为非根桥交换机)

2、在每个非根桥交换机上选举出一个到根桥cost值最小的端口作为根端口(根端口用来接收根桥交换机发送过来的数据,处于FWD状态)

3、在每个冲突域上选举出一个端口作为指定端口(指定端口用来转发根的数据,也处于FWD状态)

4、把目前为止没有分配角色的端口置为Block状态

简单地说,就是:选举根桥—>选举根端口—>选举指定端口—>阻塞其它端口

口说无凭,现在我们就来实际分析一下本文开头给出的拓扑中STP是怎样收敛的


第二部分:STP选举

132420290.png

打开所有交换机的电源,交换机的使用接口指示灯立即由红色变为橘红色,此时,每个交换机会将自身信息写入BPDU字段,封装成帧并全网泛洪。交换机收到外来帧后,会取其中的BPDU部分和自己的BPDU进行逐字段的比较,伟大的STP选举便由此拉开了序幕。

第一步:选举根桥(Root

选举Root时,交换机首先比较BPDU的“根ID”字段。Bridge Priority最小的交换机会被推举为根桥,如果Bridge Priority相同,则取MAC地址最小的为根桥。 我们 telnet 到sw2,查看它的生成树信息:


SW2#show spanning-tree brief


VLAN1

Spanning tree enabled protocol ieee

Root ID Priority 4096

Address cc00.11c0.0000

Cost 38

Port 43 (FastEthernet1/2)

Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec


Bridge ID Priority 32768

Address cc02.11c0.0000

Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Aging Time 300


Interface Designated

Name Port ID Prio Cost Sts Cost Bridge ID Port ID

-------------------- ------- ---- ----- --- ----- -------------------- -------

FastEthernet1/0 128.41 128 100 BLK 0 4096 cc00.11c0.0000 128.41

FastEthernet1/1 128.42 128 19 FWD 38 32768 cc02.11c0.0000 128.42

FastEthernet1/2 128.43 128 19 FWD 19 28672 cc03.11c0.0000 128.43


输出信息分为三部分:根桥的桥ID信息,自身的桥ID信息和交换机的接口信息。我们可以很容易地看出,根桥的 Bridge Priority 为4096,小于sw2的 Bridge Priority 32768。这正好符合STP的选举最小桥ID交换机作为根桥的原则。

我们注意到,sw2的 f1/0接口对端的交换机MAC地址正好为根桥的MAC地址 cc00.11c0.0000。拓扑图中,sw2的 f1/0接口连接的是sw1,我们猜测sw1就是根桥。看sw1的生成树:


SW1#show spanning-tree brief


VLAN1

Spanning tree enabled protocol ieee

Root ID Priority 4096

Address cc00.11c0.0000

This bridge is the root

Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec


Bridge ID Priority 4096

Address cc00.11c0.0000

Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Aging Time 300


“This bridge is the root” 指明,sw1正是这个二层网络的Root。

第二步:选举根端口(RP

确定了根桥,交换机接下来会在每个非根网桥上选举根端口。对于给出的拓扑图,sw2~sw7都是非根网桥,一次看整个拓扑有点复杂,我们分解来看:

132451933.png

在上图所示分解拓扑中,由于sw1已经是Root,我们在sw2,sw4和sw5上根据cost值选举根端口。

先看sw2:

sw2到根sw1有两条路,第一条通过 f1/0直接到sw1,另一条经过sw5、sw4到达根桥。sw2的 f1/0接口和sw1之间通过10M链路连接,根据修订后的IEEE规范,其cost值为100;同理,另一条路的开销值为整条路的开销之和,即19 + 100 + 19 = 138。很显然,100 < 138,第一条路胜出,sw2的f1/0接口被当选为根端口,状态为FWD(Forward):


SW2#show spanning-tree brief


Interface Designated

Name Port ID Prio Cost Sts Cost Bridge ID Port ID

-------------------- ------- ---- ----- --- ----- -------------------- -------

FastEthernet1/0 128.41 128 100 FWD 0 4096 cc00.11c0.0000 128.41

FastEthernet1/1 128.42 128 19 FWD 100 32768 cc02.11c0.0000 128.42

FastEthernet1/2 128.43 128 19 FWD 100 32768 cc02.11c0.0000 128.43


sw4的根端口选举过程同sw2,这里不再赘述。相比之下,我们更关心的是sw5。

sw5到根sw1也有两条路,第一条经sw2到sw1,第二条经sw4到根。我们惊奇的发现:两条路的cost值竟然都是100 + 19 = 119 !!!现在该怎么比?

根据BPDU字段的顺序,如果到根的两条路径的cost值相同,则比较cost的下一个字段:网桥ID由于根端口是用来从上游交换机接收根发来的数据的,所以选举根端口时,比较发送者(路径上游)的桥ID,选择较小的一个,与之相连的交换机端口即为根端口。

对于sw5,上游交换机分别是sw2和sw4,查看它们的桥ID:


SW2#show spanning-tree brief


Bridge ID Priority 32768

Address cc02.11c0.0000

Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Aging Time 300


SW4#show spanning-tree brief


Bridge ID Priority 28672

Address cc03.11c0.0000

Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Aging Time 300


sw2的 Priority 为 32768,大于sw4的 Priority 28672,所以sw5上与sw4相连的接口 f1/0 被选举为根端口。我们查看 f1/0 的端口信息进行验证:


SW5#show spanning-tree brief


Interface Designated

Name Port ID Prio Cost Sts Cost Bridge ID Port ID

-------------------- ------- ---- ----- --- ----- -------------------- -------

FastEthernet1/0 128.41 128 100 FWD 19 28672 cc03.11c0.0000 128.41

FastEthernet1/1 128.42 128 19 BLK 100 32768 cc02.11c0.0000 128.42

FastEthernet1/2 128.43 128 100 FWD 119 32768 cc04.14d8.0000 128.43


到这里,sw1,sw2,sw4和sw5组成的小型拓扑的指定端口选举结果如图:

132523981.png

现在在总拓扑中剩下的,还有sw3,sw6和sw7的根端口选举。

sw3的根端口选举过程和sw2,sw4的相同,根据cost值就可判断出sw3 的 f1/2接口是根端口,到根的cost值为19,其生成树信息也证明了这点:


SW3#show spanning-tree brief


Interface Designated

Name Port ID Prio Cost Sts Cost Bridge ID Port ID

-------------------- ------- ---- ----- --- ----- -------------------- -------

FastEthernet1/2 128.43 128 19 FWD 0 4096 cc00.11c0.0000 128.43

FastEthernet1/3 128.44 128 100 BLK 19 28672 cc03.11c0.0000 128.46

FastEthernet1/4 128.45 128 100 BLK 19 28672 cc03.11c0.0000 128.46


为了分析sw6的根端口选举过程,我们把sw1,sw4和sw6单独摘出来:

132558414.png

sw6到根sw1有两条路经:经 f1/3接口过sw4至sw1;经 f1/4接口过sw4至sw1。

首先比较cost值:两条链路的cost值都是100 + 19 =119。根据之前的经验,到根的cost值相同,则比较发送者桥ID。

可是sw6的发送者只有一个:sw4 —— 发送者桥ID也相同!!!我们又该怎么比较呢?相信很多人已经想到了——根据BPDU字段的顺序,ID一致的情况下,比较下一个字段:端口ID(这里仍然比较发送者的端口ID)。

sw6的发送者端口为sw4的 f1/3和 f1/4端口,根据PID的比较原则,端口 f1/3的PID一定小于 f1/4的PID。我们到交换机sw4上进行验证:


SW4#show spanning-tree brief


Interface Designated

Name Port ID Prio Cost Sts Cost Bridge ID Port ID

-------------------- ------- ---- ----- --- ----- -------------------- -------

FastEthernet1/0 128.41 128 100 FWD 19 28672 cc03.11c0.0000 128.41

FastEthernet1/1 128.42 128 19 FWD 0 4096 cc00.11c0.0000 128.42

FastEthernet1/2 128.43 128 19 FWD 19 28672 cc03.11c0.0000 128.43

FastEthernet1/3 128.44 128 100 FWD 19 28672 cc03.11c0.0000 128.44

FastEthernet1/4 128.45 128 100 FWD 19 28672 cc03.11c0.0000 128.45

FastEthernet1/5 128.46 128 100 FWD 19 28672 cc03.11c0.0000 128.46


f1/3的PID为128.44,f1/4的则是128.45,f1/3端口理所当然地被选举为根端口。

现在,又有人要发问了:选举根端口时先比较cost值,cost值相同了我们比发送者桥ID,发送者桥ID相同了我们可以比较发送者PID,那么有没有发送者PID也相同的情况呢?

回答是肯定的,sw7就是这种情况。为了简便起见,我们把sw5和sw7也单独摘出来:

132633304.png

sw7到根也是两条路径:经 f1/0接口过Hub2由sw5到根;经f1/1接口过Hub2由sw5到根。

两条链路的cost值都是100(这里只算从交换机到根桥路径上的出口开销,跨Hub时cost值不增加);发送者只有一个:sw5,;发送者端口也只有一个:f1/2。上述情况出现了!

这次该怎么解决呢?BPDU的四个可比字段都已经比较完了,难道要再加一个字段不成?

STP设计的巧妙之处在这里就体现出来了:STP规定,当发送者PID也相同时,比较自身的PID,取较小的端口作为根端口。

我们查看sw7的端口信息:


SW7#show spanning-tree brief


Interface Designated

Name Port ID Prio Cost Sts Cost Bridge ID Port ID

-------------------- ------- ---- ----- --- ----- -------------------- -------

FastEthernet1/0 128.41 128 100 FWD 119 32768 cc04.14d8.0000 128.43

FastEthernet1/1 128.42 128 100 BLK 119 32768 cc04.14d8.0000 128.43


显然,f1/0端口的PID小于 f1/1的PID,从而被选举为RP。

到这里,根端口就选举完了,纵观整个拓扑,根端口的选举结果如下:

132703195.png

第三步:选举指定端口(DP

选举指定端口时,和根端口的选举原理基本相同,都是依据BPDU字段的先后顺序依次比较,选取值较小的一方。不同的是,由于指定端口是用来转发根发来的数据,影响传输效率的是自身的端口开销,所以选举DP时不是比较的发送者的桥ID或者PID,而是比较自身的桥IDPID,这一点一定要注意!

我们先看sw1,sw2,sw4和sw5组成的小型拓扑:

132729807.png

sw1和sw2之间的冲突域:

sw1的 f1/0接口到根sw1的cost为0,而sw2的 f1/0接口到sw1的cost为100(sw2到根路径上的出口开销)。0 < 100,因此sw1的 f1/0接口为DP。我们查看sw1的 f1/0接口的工作状态:


SW1#show spanning-tree brief


Interface Designated

Name Port ID Prio Cost Sts Cost Bridge ID Port ID

-------------------- ------- ---- ----- --- ----- -------------------- -------

FastEthernet1/0 128.41 128 100 FWD 0 4096 cc00.11c0.0000 128.41

FastEthernet1/1 128.42 128 19 FWD 0 4096 cc00.11c0.0000 128.42

FastEthernet1/2 128.43 128 19 FWD 0 4096 cc00.11c0.0000 128.43

132758774.png

sw2和sw5之间的冲突域:

如图,sw2的 f1/1端口到根sw1的cost 为100,sw5的 f1/1接口到根的cost为100 + 19 = 119。100 < 119,故sw2的 f1/1端口为指定端口。我们看sw2的生成树:


SW2#show spanning-tree brief


Interface Designated

Name Port ID Prio Cost Sts Cost Bridge ID Port ID

-------------------- ------- ---- ----- --- ----- -------------------- -------

FastEthernet1/0 128.41 128 100 FWD 0 4096 cc00.11c0.0000 128.41

FastEthernet1/1 128.42 128 19FWD 100 32768 cc02.11c0.0000 128.42

FastEthernet1/2 128.43 128 19 FWD 100 32768 cc02.11c0.0000 128.43


这时有人会产生疑问:sw5到根的路径为什么不从上面走经过sw2呢?

这个问题问得好!我们看这种情况:

132832728.png

假设sw5的 f1/1端口到根的路径为图中的红色路径,我们会很明显地看出,该路径覆盖了sw2的 f1/1端口到根的路径(即紫色路径),那么红色路径的cost值可表示为:19 + sw2的cost(100)

我们本来是要比较紫色路径和红色路径的cost值大小,可现在红色路径已经包含了前者,那么我们还有比较的必要吗?这样的路径选择是没有意义的!因此,当选择端口到根的路径时,其中的一条绝对不能覆盖另一条

sw1和sw4,sw4和sw5之间的冲突域选择指定端口的情况和上述两个冲突域的选择方法相同,这里不再赘述。

sw6与sw4之间的冲突域和sw7与sw5之间的冲突域,根据到根桥的cost值可以很容易选定DP(注意:sw6和sw4之间有两个冲突域)。

到目前为止,网络中的DP选定情况如下:

132859934.png

现在只剩下sw3连接的两个冲突域了。

sw3和sw1之间的冲突域简单明了,相信大家一眼就能看出sw1的f1/2端口为DP。但是sw3和sw4之间的冲突域就不那么简单了。难道这里面有什么噱头?我们一起来分析分析。

之前的冲突域中,单单根据cost值就能选出DP,而这个冲突域就不同了。仔细观察,我们会发现:f1/3,f1/4,和 f1/5到根的cost值都是19。有了选举根端口的经验,我们会立刻想到:既然cost值相同,那就比较自身的桥ID呗。分别查看sw3和sw4的桥ID:


SW3#show spanning-tree brief


Bridge ID Priority 24576

Address cc01.11c0.0000

Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Aging Time 300


SW4#show spanning-tree brief


Bridge ID Priority 28672

Address cc03.11c0.0000

Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec

Aging Time 300


发现sw3的 Priority 24576 比sw4的 28672 小,所以端口f1/5被淘汰。

接下来比较f1/3和f1/4端口。仔细一看:嘿!两个端口到根的cost相同,自身的桥ID相同!这时候该怎么比呢?

对!比较它们自身的PID!根据PID的计算方法,f1/3的PID必定比 f1/4的PID小,从而被选举为指定端口,并处于转发状态。眼见为实,我们看一下sw3的端口情况:


SW3#show spanning-tree brief


Interface Designated

Name Port ID Prio Cost Sts Cost Bridge ID Port ID

-------------------- ------- ---- ----- --- ----- -------------------- -------

FastEthernet1/2 128.43 128 19 FWD 0 4096 cc00.0a5c.0000 128.43

FastEthernet1/3 128.44 128 100 FWD 19 24576 cc01.0a5c.0000 128.44

FastEthernet1/4 128.45 128 100 BLK 19 24576 cc01.0a5c.0000 128.44


到这里,所有的DP都选举完了。交换机接下来会把到目前为止没有被分配角色的端口阻塞掉,即置为BLK状态。最终拓扑中的所有选举情况如下:

132930906.png

(吁~~,终于把这块硬骨头啃完了~~)

现在,去掉BLK端口及其相连的链路,我们惊奇地发现,一棵完美的生成树呈现在我们面前!

132955993.png

根sw1到其它任何交换机都只有一条(最优)路径

终于等到了水落石出,我们来总结一下前面遇到的问题及其解决方法:

选举根桥时:先比较 Bridge Priority,如果 Priority 相同,则比较交换机的 MAC 地址。

选举根端口(RP):先比较到根的路径开销(cost) ;如果 cost 相同,则比较发送者交换机的桥ID;如果发送者桥ID也相同,则进而比较发送者端口ID;如果发送者PID还是相同,则比较自身的端口ID(交换机自身端口的PID可是绝对不会相同的哦!)。

选举指定端口(DP):首先仍然是比较到根的 cost;cost 相同的情况下比自身的桥ID;如果桥ID相同,则比较端口自身的PID。

具体过程可用下图表示:

133026909.png

第三部分:尾声

最后,我们回顾一下整个STP实验的历程:

首先,通过一个简单的案例,我们了解到网络中极易出现单点失效的现象;

为了解决这个问题,我们引入了冗余技术。而冗余造成的环路又会引起CAM表不稳定,重复帧,广播风暴等一系列问题;

为了消除环路,STP应运而生。STP根据BPDU中的信息,通过一系列的选举过程,最终生成一棵无环路的最优生成树。

至此,在STP的支持下,二层交换网络可以高效,可靠地为我们提供服务了!

本文出自 “分享技术   分享进步” 博客,谢绝转载!