Spanning Tree Protocol 生成树协议
网络链路冗余就可能形成环路,而网络有环路就可能有广播风暴和switch的mac-addree-table动荡不稳定重复帧等问题,降低网络性能,解决的办法就是启用Spannning Tree Protocol。实现的方法就是在逻辑上block掉冗余链路的一个端口,使之不能forwarding数据包,而一旦正常的那条链路有问题,被block的端口会自动释放,转为forwarding状态,转发数据包。这样既有了冗余,在逻辑上也不会形成环路。
首先来看看广播风暴是怎么形成的吧:
(广播域:广播帧在未经处理的情况下能到达的网络范围)
蓝色表示pc发出的boardcast,红色表示由swA转发的广播帧,绿色表示由swB转发的广播帧。这样就在swA和swB之间形成了一个双向的广播风暴。
来模拟一个广播风暴的情况
由于默认cisco的交换机都是启用了stp的,所以我们在2台交换机上手工关闭stp。
sw(config)#no spanning-tree vlan 1
这样就形成了环路,我在XPC上开启抓包工具,然后ping 192.168.132.2,一堆arp就来了。
而且还ping不通
C:\Documents and Settings\Administrator>ping 192.168.132.2
Pinging 192.168.132.2 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 192.168.132.2:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss)
说明广播风暴已经形成,而且已经将我们的链路阻塞。而且我真机的电脑在ping的时候反应也有一定影响。所以说危害是很大滴,我们启用stp以后就好了,arp广播只发送了一次,可以看到正常的ping包,而且也ping通了。
Ping statistics for 192.168.132.2:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss)
C:\Documents and Settings\Administrator>ping 192.168.132.
Pinging 192.168.132.2 with 32 bytes of data:
Reply from 192.168.132.2: bytes=32 time=30ms TTL=64
Reply from 192.168.132.2: bytes=32 time=16ms TTL=64
Reply from 192.168.132.2: bytes=32 time=15ms TTL=64
Reply from 192.168.132.2: bytes=32 time=16ms TTL=64
以太网交换机传送的第二层数据帧不像路由器传送的第三层数据包有TTL(Time To Live,生命周期),如果有环路存在,第二层的以太网帧不能被适当终止,它们将在交换机和交换机之间永无止境地传递下去,除非环路被破坏,否则将造成网络拥塞,甚至是网络瘫痪。
其他的mac表不稳定和收到重复帧就不想说了,画图难画,mac地址表就是在环路广播中,端口收到帧的先后而导致设备的mac和交换机端口的对应关系不停的变化;重复帧比较好理解了,因为有冗余链路,第一条收到单播帧发送给设备,第二条链路也会收到同样的单播帧,又转发给该设备,这样就收到了重复的数据帧。
解决的方法就是stp了,我们来看stp具体是怎么工作的。
首先所有的交换机通过比较Bridge ID来选举出一个RootBridge;
然后选出根端口和指定端口,最后决定出block状态的非指定端口。
遵循下面的原理:
1、一个网络中只有一个root bridge;
2、每个非根交换机只能有一个根端口;
3、每个网段只有一个指定端口;
4、使用非指定端口(Block)
root bridge的条件:Bridge ID最小为Root Bridge
Bridge ID = priority+mac #这里是先比较优先级,再比较mac,并不是2个加起来
priority:2byte,(0-65535):默认32768,可设置,但都要是4096的倍数;
1byte=8bit,2^16=65536
修改优先级的方法:
sw(config)#sapnning-tree vlan 1 priority 4096
sw(config)#sapnning-tree vlan 1 root primary #修改优先级为8192 (4096*2)主根
sw(config)#sapnning-tree vlan 1 root sencondary #修改优先级位16384 (4096*4)备份根
在PVST里面的汇聚层交换机作为一个vlan的主根primary,又同时是另一个vlan的备份根secondary
实际上show running-config是看不到这个命令的,看到的只有
spanning-tree vlan 1 priority 8192
或者
spanning-tree vlan 1 priority 16384
而且这个值是随着对方的优先级而变化的,反正比对方的优先级小一个或者几个档次,这个档次就是配置优先级的时候0-65536里面4096的一个倍数。
选择根端口(root port)的条件: #根端口都是在非根桥交换机上
I、到达根桥的cost最小
常用的cost:10Mb Ethernet=100,100Mb=19,1Gb=4,10Gb=2
II、发送(BPDU)者的Bridge ID最小 (经过的switch的BID)
III、port ID最小(port priority + port number)
IV、Root port永远为Forwarding状态
选择指定端口(designated port)
root bridge上的端口都是指定端口;
指定端口的选择条件和根端口争夺类似
NOTICE:cisco的交换机一个vlan一个stp,就有Bridge ID = priority+Extended System ID+mac的情况了。在不使用Extended System ID的情况下,BID由优先级域和交换机的MAC地址组成,针对每个VLAN,交换机的MAC地址都不一样,交换机的优先级可以是0~65535。CCNA模拟机架中的交换机仅支持不使用Extended System ID,比如在CCNA机架中,交换机SW1中存在两个VLAN:VLAN 1和VLAN 100,执行"show spanning-tree brief"命令时,可以发现两个VLAN的BID优先级都是32768,但MAC地址相差1,一个是cc00.0af4.0000,另一个是cc00.0af4.0001,如果还存在VLAN 200,则MAC地址是cc00.0af4.0002。
在使用Extended System ID的情况下,每个VLAN的MAC地址可以相同,BID被要求包含VLAN ID信息,解决的办法是从优先级域的16个bit中拿出低位的12个bit,称为扩展的System ID,用来唯一标识每个VLAN号,剩下的4个bit用来表示交换机的优先级,这种情况下优先级的取值只有24=16个,是4096的倍数。想一想,为何从优先级中拿出的是12个bit来表示Extended System ID呢?原因是ISL封装中只有10个bit用于VLAN标识,802.1Q封装中有12个bit用于VLAN标识,不管是哪种封装,取12个bit都可以满足。比如交换机优先级是4096,交换机的MAC地址是cc00.0af4.0000,交换机在VLAN 100中的BID是4196(4096+100=4196)+cc00.0af4.0000
上面的Extend System ID是在原有的基础上拿出低位的12个bit位来表示vlan id,就是4096个vlan,这也是一般交换机创建vlan的最大值。把2个部分看成这样比较好理解:
(我以前就想不明白为啥优先级取4个bit应该最大也就16,怎么会和4096的倍数有关系,这里看成高4位就好理解了)
Bridge Priority | Extend System ID
0000 000000000000
在pvst(一个vlan一个STP)的情况下,默认32768,表示birdge priority的第15位取1=32768,如果在vlan 1里面则extend system id =1,(vlan 100= 100),这样最后的桥优先级就等于32768+1=32769。
1000 000000000001=32769
启用pvst的spanning-tree的网络中,交换机相连的链路都是Trunk链路;
选好Root Bridge和Root port、Designated Port、Non-Designated后,Non-Designated port处于Block状态,不转发数据帧,但是仍然可以接收BPDU,以便知道拓扑变化。下面是BPDU的格式:
默认协议和版本号目前都置0,
BPDU type:分为configuration和TCN2种,正常的情况是发configuration BPDU,在拓扑发生改变的时候发送TCN的BPDU,
下面是root ID和bridge ID和一些计时器。这里没有使用extend system id,一个vlan的情况。
Flag位表示拓扑发生变化时,1个拓扑变化确认位1个拓扑变化位,中间6位没有使用
交换机端口的5种状态:
Disable(Down)
Lisenting
Learning
Forwarding
Blocking
在STP环境中,端口状态转变计时器:
可以修改收敛计时器:
sw(config)#spanning-tree vlan 1 {max-age|forwarding-time|hello-time}
Max-age time的意思是在blocking端口在20's之内没有收到BPDU的时候,会自动进入端口状态转换;
可以用mac access-list来实现
sw(config)#mac access-list extend stp
sw(config-ext-macl)#deny any any
sw(config-ext-macl)#exit
sw(config)#int f0/23
sw(config-if)#mac access-group stp in
Hello-time就是发送BPDU的时间,默认2's/次,不建议修改Hellotime;
改变根桥后新跟桥不继承原来的计时器设置。
|
接收BPDU |
发送BPDU |
学习MAC |
转发DATA |
Down |
╳ |
╳ |
╳ |
╳ |
Blocking |
√ |
╳ |
╳ |
╳ |
Listening |
√ |
√ |
╳ |
╳ |
Learning |
√ |
√ |
√ |
╳ |
Forwarding |
√ |
√ |
√ |
√ |
各个状态下的BPDU状态
当然可以修改端口为上行速链路,端口转换的时候由Blocking状态就直接变成forwarding状态了,跳过listen和learn两个阶段。这个上行速链路在非根桥上启用。
Sw(config)#spanning-tree uplinkfast
这个上行速链路和速端口有点混,这里说明一下
上行速链路是指交换机与交换机之间,交换机与路由器的有多条线缆连接,在运行STP协议时,会阻塞其它的端口,只会有一个根端口或指定端口正常运行,当这个端口出现问题时,其它的阻塞端口将马上进入转发状态。
uplink在非根桥的交换机上配置
sw(config)#spanning-tree uplink
速端口是指PC机与交换机连接的接口,当这个接口出现问题时,换一个交换机端口时,该端口马上进入转发状态。速端口只能用在与PC机相连的端口上,而不能用在与交换机或路由器连接的端口上,否则会出现环路。上行速链路在全局配置模式下配置,速端口是进到端口配置模式下配置,如:
Sw(config)#int range f0/1 - 5
Sw(config-if-range)#spanning-tree portfast #将f0/1-f0/5都配置为速端口
查看STP的信息
Router#sh spanning-tree brief
VLAN1
Spanning tree enabled protocol ieee
Root ID Priority 32768
Address cc00.0f18.0000
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32768
Address cc00.0f18.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
-------------------- ------- ---- ----- --- ----- -------------------- -------
FastEthernet0/1 128.2 128 19 FWD 0 32768 cc00.0f18.0000 128.2
FastEthernet0/14 128.15 128 19 FWD 0 32768 cc00.0f18.0000 128.15
这里只开了一台交换机试命令,上面是root id就是交换机自己的Root ID,下面就是Bridge ID,这里只有一个交换机,所以和上面的是一样的,下面是参与STP的端口的状态。如果采用PVST+的话,要用Trunk。
Vlan和STP的关系
- IEEE通用生成树(CST) 802.1D#不考虑vlan,以交换机为单位运行STP,如果划分了VLAN,正好BLOCK的端口属于一个VLAN的话,这个VLAN的数据就不能通讯
- cisco的每个vlan生成树(PVST) #为每个VLAN运行单独的STP,能优化跟桥的位置,为所有的VLAN提供最优路径
cisco能兼容CST的PVST(PVST+)802.1W #和IEEE兼容
PVST的配置:
要指定网络中比较稳定的、性能好的交换机为根桥,还可以实现多台核心交换机作为不同vlan的根桥而实现负载均衡。cisco的交换机默认是pvst的spanning-tree
配置备份的上行链路为uplinkfast,已实现快速恢复。(一般接入层到汇聚层的交换机)
EtherChannel(以太网通道)
将接入层到汇聚层的多条链路绑定成一条逻辑链路,以达到加宽带宽的作用。
如果直接在接入层多加一条线到汇聚层交换机,因为switch2层链路上运行STP的缘故,有一条线肯定是被block掉的,(如图)就算多连10条线也只有一条能工作,所以要采用链路聚合来将2条物理链路做成一个逻辑链路。
EtherChannel实现有三种方法:
PAgp:Cisco proprietary
LACP:IEEE 802.3ad standard
ON:静态指定
sw(config)#int range f0/23 - 24
sw(config-if-range)#channel-group 1 mode {}
active:使用LACP
passive:使用LACP
auto:使用PAgp 是否主动发送信息
desirable:使用PAgp
on:强制指定为etherchannel,不管协议
启用etherchannel:
sw1(config)#int range f0/14 - 15
sw1(config-if-range)#channel-gr
sw1(config-if-range)#channel-group 1 mode active #3640模拟器做只有个on,囧。
^
% Invalid input detected at '^' marker.
sw1(config-if-range)#channel-group 1 mode ?
on Enable Etherchannel only
sw1(config-if-range)#channel-group 1 mode on
最多可以一次将8个口绑定成一个,接口要相同
在po1上做的操作会影响到对应的物理口。如enscapsulation,shutdown都会使绑定的物理口也shutdown。
3层etherchannel:
绑定配置是一样,3层和2层的区别就是在逻辑口上做的配置不能在物理口上生效。
所以先物理口:
sw(config)#int range f0/23 - 24
sw(config-if-rang)#no switchport
sw(config-if-rang)#int po1
sw(config-if)#no switchport
不过这样做会出问题,因为一旦在物理口做了no switchport以后,以前的etherchannel配置也就没有了,所以还得在物理口做一遍channel-group 1 mode on,我这个模拟器不支持3层接口做channel,NND,没得实验做了。