转载自 QingSword.COM
这篇文章介绍SPT(Spanning-Tree Protocol,生成树协议)的工作原理,在分层网络中存在冗余链路的情况下容易引起流量环路,使用STP能够动态的管理这些冗余链路;当某台交换机的一条连接丢失时,另一条链路能迅速取代失败链路,并且不会产生流量环路。文章主要包括下面几点内容:冗余拓扑中存在的问题、生成树协议、生成树收敛、利用生成树实施负载均衡等。
___________________________________________
文章目录
- [*1*].冗余链路中存在的问题
- [*2*].STP介绍
- STP算法
- 根交换机选举
- 端口花费和路径花费
- BPDU结构浅析
- STP端口角色
- 端口状态和BPDU时间
- [*3*].STP收敛
- [*4*].STP负载均衡实验
___________________________________________
[*1*].冗余链路中存在的问题
这一部分使用下面这个拓扑来讲解一下链路冗余容易造成的三个问题:
如图所示SW1和SW2之间有两条线路相连,它们之间任何一条链路出现故障另外一条线路可以马上顶替出现故障的那条链路,这样可以很好的解决单链路故障引起的网络中断,但在此之前有下面三个问题需要考虑。
* 广播风暴
以太网交换机传送的第二层数据帧不像路由器传送的第三层数据包有TTL(Time To Live),如果有环路存在第二层帧不能被适当的终止,他们将在交换机之间永无止境的传递下去。结合交换机的工作原理,来看一下上面这张拓扑中广播风暴是如何形成的:
1,PC1发出一个广播帧(可能是一个ARP查询),SW1收到这个广播帧,SW1将这个广播帧从除接收端口的其他端口转发出去(即发往fa0/2、fa0/23、fa0/24)。
2,SW2从自己的fa0/23和fa0/24都会收到SW1发过来的相同的广播帧,SW2再将这个广播帧从除接收端口外的所有其他接口发送出去(SW2将从fa0/23接收的广播帧发往其他三个端口fa0/24、fa0/1、fa0/2,从fa0/24接收到的也会发往其他三个端口fa0/23、fa0/1、fa0/2)。
3,这样这个广播帧又从fa0/23以及fa0/24传回了SW1,SW1再用相同的方法传回SW2,除非物理线路被破坏,否则PC1-4将不停的接收到广播帧,最终造成网络的拥塞甚至瘫痪。
* MAC地址表不稳定
广播风暴除了会产生大量的流量外,还会造成MAC地址表的不稳定,在广播风暴形成过程中:
1,PC1发出的广播帧到达SW1,SW1将根据源MAC进行学习,SW1将PC1的MAC和对应端口fa0/1写入MAC缓存表中。
2,SW1将这个广播帧从除接收端口之外的其他端口转发出去,SW2接收到两个来自SW1的广播(从fa0/23和fa0/24),假设fa0/23首先收到这个广播帧,SW2根据源MAC进行学习,将PC1的MAC和接收端口fa0/23存入自己的MAC缓存表,但是这时候又从fa0/24收到了这个广播帧,SW1将PC1的MAC和对应的fa0/24接口存入自己的MAC缓存表。
3,SW2分别从自己的这两个接口再将这个广播帧发回给SW1,这样PC1的MAC地址会不停的在两台交换机的fa0/23和fa0/24之间波动,MAC地址缓存表也不断的被刷新,影响交换机的性能。
* 重复帧拷贝
冗余拓扑除了会带来广播风暴以及MAC地址的不稳定,还会造成重复的帧拷贝:
1,假设PC1发送一个单播帧给PC3,这个单播帧到达SW1,假设SW1上海没有PC3的MAC地址,根据交换机的原理,对未知单播帧进行泛洪转发,即发往除接收端口外的所有其他端口(fa0/2、fa0/23、fa0/24)。
2,SW2分从自己的fa0/23和fa0/24接收到这个单播帧,SW3知道PC3连接在自己的fa0/1接口上,所以SW1将这两个单播帧都转发给PC3。
3,PC1只发送了一个单播帧,PC3却收到了两个单播帧,这会给某些网络环境比如流量统计带来不精确计算等问题。
[*2*].STP介绍
基于冗余链路中存在的这些问题STP被设计出来用来解决这些问题,下面介绍STP的工作原理。
* STP算法
STP通过拥塞冗余路径上的一些端口,确保到达任何目标地址只有一条逻辑路径,STP借用交换BPDU(Bridge Protocol Data Unit,桥接数据单元)来阻止环路,BPDU中包含BID(Bridge ID,桥ID)用来识别是哪台计算机发出的BPDU。在STP运行的情况下,虽然逻辑上没有了环路,但是物理线上还是存在环路的,只是物理线路的一些端口被禁用以阻止环路的发生,如果正在使用的链路出现故障,STP重新计算,部分被禁用的端口重新启用来提供冗余。
STP使用STA(Spanning Tree Algorithm,生成树算法)来决定交换机上的哪些端口被堵塞用来阻止环路的发生,STA选择一台交换机作为根交换机,称作根桥(Root Bridge),以该交换机作为参考点计算所有路径。
* 根交换机选举
首先要知道什么是BID(Bridge ID,桥ID),因为根交换机的选举是基于BID的,BID由三部分组成:优先级、发送交换机的MAC地址、Extended System ID(扩展系统ID,可选项)如下图所示:
BID一共8个字节,其中优先级2个字节,MAC地址6个字节。在不使用Extended System ID的情况下,BID由优先级域和交换机的MAC地址组成,针对每个VLAN,交换机的MAC地址都不一样,交换机的优先级可以是0-65535。在使用Extended System ID的情况下每个VLAN的MAC地址可以相同(在GNS3模拟器中不支持Extended System ID,Cisco Packet Tracer 5.3支持Extended System ID)。值得一提的是,现在的交换机普遍使用Extended System ID。拥有最小BID的交换机被选举成为根交换机。
在同一个广播域中的所有交换机都参与选举根交换机,当一台交换机启动时,它假设自己是根交换机,并默认每隔2秒发送一次“次优BPDU”帧,BPDU帧中的Root ID(根交换机的BID)和本机的BID相同。在一个广播域中的交换机互相转发BPDU帧,并且从接收到的BPDU中读取Root ID,如果读取到的Root ID比本交换机的BID小,交换机更新Root ID为这个较小的Root ID,然后继续转发修改后的BPDU;如果接收的BPDU中的Root ID比本交换机的BID大,那么继续将自己的BID作为Root ID向外发送BPDU,直到最后在同一个生成树实例中拥有一致的Root ID,这个Root ID对应了这个广播域中某台交换机的BID(并且这个BID一定是这个广播域最小的),这台交换机就被选作根交换机。
下面用一个实例来演示一下根交换机的选举,在Cisco Packet Tracer 5.3中搭建下面这样的拓扑:
线连接好后等待几十秒钟,它们会自动选举出根交换机,使用下面的命令验证:
2 |
* 在SW1上查看生成树信息,因为SW1、SW2、SW3上面都没有划分其他的VLAN, |
3 |
* 所以默认只有VLAN0001的生成树信息。 |
5 |
* "Spanning tree enabled protocol ieee", |
6 |
* 表示交换机使用的生成树协议是"PVST+",这也是思科默认的生成树协议。 |
8 |
* "Root ID"后面是VLAN1中根交换机的BID参数, |
9 |
* Priority 32769,表示根交换机的优先级是32769, |
11 |
* "This bridge is the root",表示当前这台交换机就是根交换机。 |
13 |
* "Hello Time 2sec Max Age 20sec Forward Delay 15sec" |
14 |
* BPDU发送间隔默认2秒,最大存在时间是20秒,转发延时是15秒。 |
16 |
* "Bridge ID"后面的参数是本交换机的BID参数, |
17 |
* 因为SW1就是根交换机,所以这个下面的参数和"Root ID"是一样的, |
18 |
* 其中"priority 32768 sys-id-ext 1",表示SW1的优先级是32768, |
19 |
* Extended System ID是1,所以优先级就是32768+1。 |
21 |
* 所以SW1的BID=SW1的优先级+SW1的MAC地址=32769+0001.9681.2683 |
22 |
* 接下来查看SW2和SW3的生成树信息,就会知道为什么SW1可以被选举成根交换机了。 |
24 |
SW1#show spanning-tree |
26 |
Spanning tree enabled protocol ieee |
27 |
Root ID Priority 32769 |
28 |
Address 0001.9681.2683 |
29 |
This bridge is the root |
30 |
Hello Time 2 ec Max Age 20sec Forward Delay 15sec |
32 |
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) |
33 |
Address 0001.9681.2683 |
34 |
Hello Time 2sec Max Age 20sec Forward Delay 15sec |
37 |
Interface Role Sts Cost Prio.Nbr Type |
38 |
----------- ---- --- --------- -------- ---------- |
39 |
Fa0/1 Desg FWD 19 128.1 P2p |
40 |
Fa0/2 Desg FWD 19 128.2 P2p |
41 |
Fa0/3 Desg FWD 19 128.3 P2p |
46 |
* 可以看到SW2的BID中,优先级是32769,和根交换机(SW1)的相同, |
47 |
* 但是SW2的MAC地址是0030.A310.3975,大于SW1的MAC地址, |
49 |
* 从这里可以看出SW1的BID要小于SW2的BID, |
52 |
SW2#show spanning-tree |
54 |
Spanning tree enabled protocol ieee |
56 |
/*这里是根交换机,也就是SW1的BID信息*/ |
57 |
Root ID Priority 32769 |
58 |
Address 0001.9681.2683 |
60 |
Port 2(FastEthernet0/2) |
61 |
Hello Time 2sec Max Age 20sec Forward Delay 15sec |
64 |
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) |
65 |
Address 0030.A310.3975 |
66 |
Hello Time 2sec Max Age 20sec Forward Delay 15sec |
70 |
/*查看SW3的生成树信息,优先级相同,同样是因为MAC地址比SW1大*/ |
71 |
SW3#show spanning-tree |
73 |
Spanning tree enabled protocol ieee |
74 |
Root ID Priority 32769 |
75 |
Address 0001.9681.2683 |
77 |
Port 1(FastEthernet0/1) |
78 |
Hello Time 2sec Max Age 20sec Forward Delay 15sec |
80 |
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) |
81 |
Address 00E0.8F76.269C |
82 |
Hello Time 2sec Max Age 20sec Forward Delay 15sec |
通过这个实例,结合前面说的根交换机选举原理,就能很容易的理解根交换机是如何在一个广播域中被选举出来的了。
上面这种情况是默认连线后不做任何修改根交换机的选举情况,可以通过下面的命令将某台交换机的优先级改小,或者设置成动态优先级(即永远比其它交换机的优先级小),这样,这台拥有较小优先级的交换机将成为根交换机。
结合上面这个拓扑图(图三),将SW3的优先级改小,从而达到手动指定一台根交换机的目的:
2 |
SW3(config)#spanning-tree vlan 1 priority 1000 |
4 |
/*它提示我,只能是4096的倍数,可以是下面的这些值*/ |
5 |
% Bridge Priority must be in increments of 4096. |
7 |
0 4096 8192 12288 16384 20480 24576 28672 |
8 |
32768 36864 40960 45056 49152 53248 57344 61440 |
11 |
* 这里就设置成4096,注意这里针对的是VLAN1, |
13 |
* 不同VLAN的STP选举出来的根交换机也可以不同, |
15 |
* 假设还存在一个VLAN2,并且在SW1上使用这条命令: |
16 |
* spanning-tree vlan 2 priority 4096 |
17 |
* 那么SW1就将成为VLAN2的根交换机。前提是VLAN2下有端口。 |
19 |
SW3(config)#spanning-tree vlan 1 priority 4096 |
23 |
/*过个一两秒,查看SW3的生成树信息,发现他已经成为了根交换机。*/ |
24 |
SW3#show spanning-tree |
26 |
Spanning tree enabled protocol ieee |
28 |
Address 00E0.8F76.269C |
29 |
This bridge is the root |
30 |
Hello Time 2sec Max Age 20sec Forward Delay 15sec |
32 |
Bridge ID Priority 4097 (priority 4096 sys-id-ext 1) |
33 |
Address 00E0.8F76.269C |
34 |
Hello Time 2sec Max Age 20sec Forward Delay 15sec |
使用下面的命令可以让交换机自动动态的调整自己的优先级为整个广播域最小,使用这条命令让SW2成为根交换机:
2 |
SW3(config)#no spanning-tree vlan 1 priority |
4 |
/*然后配置自动调整优先级,让SW2自己动态调整*/ |
5 |
SW2(config)#spanning-tree vlan 1 root primary |
7 |
/*等待几秒钟,查看SW2的生成树信息,发现根交换机变成了自己*/ |
10 |
Spanning tree enabled protocol ieee |
11 |
Root ID Priority 16385 |
12 |
Address 0030.A310.3975 |
13 |
This bridge is the root |
* 端口花费和路径花费
根交换机被选举出来后,计算其他交换机到根交换机的花费,STA考虑两种花费,端口花费和路径花费,路径花费是从根交换机出发到最终交换机前进方向进入的端口花费总和,也就是说在上面的拓扑图图三中,假设SW1是根交换机,想要改变SW3到根交换机SW1的花费,应该在SW3的fa0/1来改变,而不是在SW1的fa0/3端口上改变。
如果一台交换机有多条路径到达根交换机,这台交换机会选择路径花费最小的那条,下面是默认的端口花费参照表:
这个参照表只是端口默认的花费,端口花费是可以手动修改的,因为”Cisco Packet Tracer 5.3″不支持修改端口花费,修改端口花费的实验使用GNS3来进行,拓扑如下:
图五中SW1被选举成为根交换机,先在SW3上面查看一下默认的生成树信息:
1 |
SW3#show spanning-tree brief |
4 |
Spanning tree enabled protocol ieee |
10 |
* 这说明SW3的fa0/0接口速率是100Mb/s。 |
13 |
Port 1 (FastEthernet0/0) |
14 |
Hello Time 2sec Max Age 20sec Forward Delay 15sec |
通过下面的命令来修改SW3到根交换机的花费:
1 |
/*将SW3的fa0/0接口的花费改成40*/ |
3 |
SW3(config-if)#spanning-tree cost 40 |
7 |
* 再次查看SW3的生成树信息,发现花费居然变成了38, |
9 |
* 另外我们还发现下面的Port端口也发生了变化, |
10 |
* 没有修改前是Fa0/0,现在是Fa0/1, |
11 |
* 这说明去往根交换机的数据是通过SW3的Fa0/1发给SW2再转发给SW1的, |
12 |
* 这是因为我们将SW3的Fa0/0的花费修改成了40, |
13 |
* 然而,通过SW3的Fa0/1发给SW2再转发给SW1的花费只有38, |
14 |
* 即SW3的Fa0/1的默认花费19,加上SW2的Fa0/2的默认花费19, |
15 |
* 前面也提到了,交换机选取花费最小的那条路径去往根交换机。 |
17 |
SW3#show spanning-tree brief |
19 |
Spanning tree enabled protocol ieee |
20 |
Root ID Priority 32768 |
21 |
Address cc00.0c94.0000 |
23 |
Port 2 (FastEthernet0/1) |
* BPDU结构浅析
前面提到的交换机之间通过转发BPDU来选择根交换机,这里讲BPDU帧的结构简单的介绍一下:
BPDU包含12个字段,如上图所示,部分字段解释如下:
- Flags:标记域,包含TC(Topology Change,拓扑改变)比特位,TCA(Topology Change Acknowledgment,拓扑改变确认)比特位。
- Root ID:包含了根交换机的BID。
- Cost of path:到根交换机的路径花费。
- Bridge ID:转发BPDU的交换机的BID。
- Port ID:转发BPDU的交换机的PID,PID等于端口优先级(默认128)加端口号,后面会介绍到。
- Message age:BPDU已经存在的时间。
- Max age:BPDU最大存在时间。
- Hello time:根交换机发送配置信息的间隔时间,默认2秒。
- Forward Delay:转发延时,默认15秒。
* STP端口角色
1,根端口(Root Port,RP),每个非根交换机上有且仅有一个根端口,稍后的生成树选举中会详细介绍根端口的选举过程。
2,指派端口(Designated Port,DP),网络上除根端口外,所有允许转发流量的端口,每个网段都有一个指派端口,根交换机上的端口都是指派端口。
3,非指派端口,既不是根端口也不是指派端口,这种端口虽然是激活的但是会被堵塞(Blocking)用来阻止环路。根端口和指派端口都处于转发(Forwarding)状态。
4,禁用端口,被管理员使用”shutdown”命令关闭的端口称作禁用端口,禁用端口不参与生成树算法。
* 端口状态和BPDU时间
互连交换机通过在一个广播域交换BPDU帧构建一个逻辑上无环的路径,当一台交换机启动后,如果一个交换机端口直接转换到转发状态可能会造成暂时性的环路。为了使用这个逻辑生成树,交换机需要在五种状态间转换,转换会历经三种BPDU时间。
下面是STP中的五种端口状态:
1,Down(禁用)状态。可以使用”no shutdown”命令和插入网线来激活。
2,Blocking(阻塞)状态。链路激活后转入阻塞状态,这个状态大约停留20秒,主要用来确定该端口的角色。如果判断出该端口是非指派端口,则将保持在这一状态,即阻塞,如果处在阻塞状态的端口接收不到BPDU了,也会转入下一状态。如果判断出是其他端口角色,则转入下一状态。
3,Listening(侦听)状态。这个状态大约停留15秒,除了接收BPDU外,还向邻居发送BPDU,通知邻居它将参与激活拓扑。
4,Learning(学习)状态。大约停留15秒,开始学习MAC地址。
5,Forwarding(转发)状态。端口可以转发数据帧。
BPDU的时间有三种,Hello Time、Max Age、Forward Delay:
1,Hello时间控制了发送配置BPDU的时间间隔,默认2秒。这是根交换机生成BPDU并向非根交换机发送的间隔。
2,非根交换机接收到根交换机发送来的BPDU,再从除接收端口以外的其他端口转发出去,如果在2-20秒里面由于网络故障没有新的BPDU从根交换机发送过来,非根交换机将停止向外发送从根交换机接收到的BPDU。如果这种情况持续20秒,也就是最大存活期,非根交换机就使原储存的BPDU无效,并开始寻找新的根端口。所谓最大存活期就是非根交换机丢弃BPDU前用来备份储存它的时间。
3,转发延时是交换机在侦听状态到学习状态所花的时间,默认是15秒。
从上面的叙述中我们可能会发现,一台启动STP的交换机,每个端口从UP到Forwarding所需的时间大约是50秒左右,而普通的二层交换机端口UP到Forwarding瞬间就能完成。这会带来一个问题,那就是如果这台启动STP的交换机的接口连接的是一个终端设备,比如计算机,那么端口加电启动后计算机就要等上50秒才能发送数据,这很不合理,可以使用下面的命令将支持STP的交换机与终端相连的端口设置成快速端口,这样端口从UP到Forwarding也能一瞬间完成了。但需要注意的是,仅在连接计算机的端口上使用快速端口的功能,不要在和其他交换机,集线器网桥相连的端口上使用这个功能,否则容易造成环路。
1 |
/*假设这台交换机的fa0/1到10口都连接的是计算机*/ |
2 |
Switch(config)#int range fa 0/1 - 10 |
3 |
Switch(config-if-range)#spanning-tree portfast |
[*3*].STP收敛
STP的收敛就是整个网络达到稳定的状态,选举出了根交换机,并决定出所有端口的角色,排除所有的潜在环路。
* 生成树的选举
这一小节是这篇文章最重要的部分,上面的所有理论都会在这一小节得到解释和应用,STP最终收敛成为一个没有环路的网络需要通过下面四个步骤:
- 每个广播域只能有一个根交换机。
- 每个非根交换机有且只有一个根端口。
- 每个网段有且只能有一个指派端口。
- 既不是根端口也不是指派端口的端口会被阻塞。
下面来看看生成树的选举过程,一共分为四步:
1,选举根交换机
交换机之间通过发送BPDU来选举根交换机,拥有最小BID的交换机将成为根交换机,每个广播域只能有一个根交换机。
2,选举根端口
每个非根交换机有且只有一个根端口,选举根端口依照下面的顺序。
*** 首先,最低花费的端口将成为根端口;在花费相同的情况下比较发送者的BID,BID小的将成为根端口,请看下面这张拓扑图:
图中SW1被选举成根交换机,交换机之间的链路都是100Mb/s,所以SW2的根端口是SW2的fa0/2接口,SW3的根端口是SW3的fa0/1接口,因为他们从这个接口去根交换机的花费都是19,小于通过SW4去根交换机的花费。那么SW4的根端口是哪个呢?不论从自己的哪个接口去往根交换机(经过SW2或SW3),花费都是一样(38),所以在花费相同的情况下比较发送者的BID,也就是比较SW2和SW3的BID,显然SW2的BID(32768+2222.2222.2222)小于SW3的BID(32768+3333.3333.3333),所以SW4将自己和SW2相连的接口fa0/4选举成为根端口。
*** 在发送者BID相同的情况下,比较发送者的PID,请看下面这张图:
图中,SW1和SW2通过两条100Mb/s线路相连,SW1拥有较小的BID被选举成为根交换机,这时SW2要选举根端口,首先SW2会寻找最低花费的端口,但是去往SW1的两个端口的花费都是19,然后SW2比较发送者的BID,SW2发现,两个端口都连接的是SW1,发送者(SW1)的BID相同,这个时候,就会比较发送者的PID,也就是端口ID(端口ID等于优先级(默认端口优先级是128)加上端口号),发送者(SW1)端口ID较小的那个端口对应的本地(SW2)上的那个端口,将成为根端口。
我们在SW1上查看生成树信息:
3 |
Spanning tree enabled protocol ieee |
6 |
This bridge is the root |
7 |
Hello Time 2sec Max Age 20sec Forward Delay 15sec |
9 |
Bridge ID Priority 24577 (priority 24576 sys-id-ext 1) |
10 |
Address 0030.A3B8.5728 |
11 |
Hello Time 2sec Max Age 20sec Forward Delay 15sec |
15 |
* 这一部分信息就是SW1上面的端口信息,其中Prio下面的就是端口ID, |
16 |
* 可以看到SW1的fa0/1默认端口ID是128.1,小于fa0/2的端口ID。 |
18 |
Interface Role Sts Cost Prio.Nbr Type |
19 |
---------------- ---- --- --------- -------- ----------- |
20 |
Fa0/1 Desg FWD 19 128.1 P2p |
21 |
Fa0/2 Desg FWD 19 128.2 P2p |
从输出可以看到,SW1上面的fa0/1拥有较小的端口ID,它对应了SW2的fa0/2端口,所以SW2的fa0/2端口被选举成为根端口。
*** 如果发送者的PID也相同,那么比较接收者的PID,看下面这种情况:
图中,SW1的fa0/1连接在一台集线器上,SW2的fa0/1和fa0/2也连接在这台集线器上,线路均为100Mb/s,假设SW1拥有较小的BID被选举成根交换机,SW2现在要选举根端口,首先根据前面说的,比较花费,SW2从两个端口到根交换机SW1的花费都相同;然后SW2比较发送者BID,发送者(SW1)的BID也相同;SW2再比较发送者PID,发现PID也相同;这个时候,SW2比较接收者,也就是自己的PID,将自己PID最小的那个端口选举成根端口。
可以根据SW2的生成树信息输出判断,fa0/1拥有更小的PID,所以它被选举成为根端口: