在没有一些协议的发明前,交换机是不敢连成圈的。因为连成圈就会导致交换机出环,导致交换机的累死,重启。如果将它们连成环,必然会导致以下3个问题。
在介绍有关协议前,先讲一下广播风暴: 我们知道交换机不向路由器可以自己算路由,它的工作机制是:流量到达交换机后,交换机会先看流量来的MAC,再看流量进的接口。交换机查看自己的MAC、接口表,如果认识就转发;但如果目标MAC不认识,该交换机就会洪泛。
在一些协议没有发明前,如果有3台交换机连成下面这样,当一台交换机将数据包进行洪泛后,收到该包的交换机由于也不认识MAC,它也会洪泛,3台交换机连接在一起。就导致自己洪泛出去的包,自己又收到了,又因为不认识该包,就又会洪泛。
由于二层交换机没有TTL,因此不停地洪泛下去,直到交换机的CPU达到最大值超负荷之后,设备就会瘫痪重启。
还是拿上图说吧。 当产生广播风暴时:一个逆时针的广播,还有一个顺时针的广播,这两个广播的原MAC都是相同的,这样就会导致交换机再上一时间点认为流量是从1号口进来,然后又马上接到另一个方向的2号口的流量,使MAC地址表不停的进行删除前一MAC所对应的接口,不断的翻滚。
我们知道,正常交换机在所有接口上只洪泛一次,当出现广播风暴之后,就会将一个数据帧不停的洪泛,导致同一数据帧的重复拷贝。
为了解决上述问题出现了一个非常伟大的协议:STP(IEEE802.1D)生成树协议。
一般的协议都是由私有转为公有,而生成树最早的协议是公有的 802.1D,接着Cisco提出了PVST、PVST+,在后来有了 802.1W 、 802.1S
如果3台交换机连在了一起,导致了出环,若要人为的破环。我们有什么办法? 其实就是拔根线,这样就破环了。生成树STP(spanning tree protocol)就是这个逻辑,它用于实现二层的线路冗余,在网络中逻辑的阻塞部分接口,来实现从根(交换机)到目标仅拥有唯一路径;当最佳路径故障时,阻塞端口自动工作来实现备份的作用。
上面的那张我用Packet Tracer画的图,我们可以看到其中有两台交换机之间有一个接口是黄颜色的,那就是逻辑堵塞。
所谓生成树,其实就是在二层的网络中构建一个树形结构,它的特点就是:唯一、最短、星型拓扑
PDU我们都知道,它是协议数据单元。而 BPDU桥协议数据单元,跨层封装至二层,我们可以理解为交换机之间用来通讯的帧。
跨层封装至二层,就不能用以太网第二代帧作为二层,就需要用以太网第一代帧了,以太网第一代帧分为 LLC逻辑链路控制层(提供对数据进行分片,进程区分的功能),MAC介质访问控制层(对物理层控制,包括提供MAC地址)
BPDU所含的字段如下:
BPDU类型注解配置BPDU只有根网桥可以发出,在最初无根网桥时,所有交换机均发出;次优BPDUTCN:拓扑变更消息注意:BPDU的保活时间:Hello time 2s hold time 20s,超过20s后,生成树将重新收敛。
我们拿四个交换机连成环说事吧:
但是当它们的连接出现问题之后,生成树将重新收敛,比如说下面这样:
角色选举是生成树的核心,通过该算法将成网状等结构的交换机拓扑转化为具有星型结构的树状结构。要想生成这棵树,就要从树根开始,选举的步骤是这样的: Ⅰ、根网桥的选举: 关于生成树协议的干涉,至少必须关注根网桥的位置,最合适的位置为汇聚层设备 通过上面我们知道,根网桥的选举靠的的是BPDU的优劣,那什么才是最好的BPDU呢?
选取最好的BPDU就是选出根网桥。根网桥:在一颗生成树实例中有且仅有一台,对整个树进行计算、指挥、管理和部署,通过发送BPDU来进行指挥和维护,周期发送BPDU。 Ⅱ、根端口的选举: 有了根网桥,那么每台交换机上就得有一个端口专门连接上一级,用于组建树形结构。
根端口(一个接口):在每台非根网桥上有且仅有有一个必须是根端口,它是非根网桥上离根网桥最近的接口(星型拓扑最佳路径),该接口可以用于 接收 来自根网桥的BPDU,转发用户的流量。
选举规则如下: i、比较根网桥到该设备各入接口的最小cost(开销)值,最小的成为根端口。 从上面我们就可以看出来交换机是如何通过开销值选取根端口了,它会比较两边开销值,开销值小的将成为根端口。 但是我们从上图中还可以看到,根网桥到Switch3的两个端口的cost值相同。这就有了第二条选举规则:
ii、若入口的cost值相同,便比较该接口对端的交换机BID,最小的成为根端口。 也就是比较上一个图中的Switch1、Switch2它们之间的BID。
iii、若对端的BID相同,便比较该接口对端接口的PID,先比较PID中的优先级,最小的成为根端口。若优先级相同比较编号
对端BID相同,说明它们是同一台交换机,那么这个图长得就是这样: Switch5的两个接口连着根网桥,它们的BID相同,接口优先级是默认的,由于 F0/2 的接口编号小,那么Switch5的F0/1口便成为了根端口,F0/3作为阻塞端口。
ⅳ、若接口对端的PID相同,比较本地的PID,最小的成为根端口。 这种情况是什么呢?连唯一的接口编号都一样了,我们想到的只有这种设备了:集线器,一个接口下通过集线器又通过两根线连接了1台交换机。 我们也确实可以看到本地Switch5编号较小的接口 F0/1 成为了根端口,F0/2口逻辑阻塞。 Ⅲ、指定端口的选举: 指定端口(一个接口):在每段物理链路有且仅有一个;指定端口 转发 来自网桥的BPDU。以及 转发 用户的流量。
首先:默认根网桥所有端口均为指定端口。 然后进行接下来的比较: i、比较接口的出向cost值,最小的成为指定端口 ii、若出向cost值相同,比较本地的BID,最小的成为指定端口 iii、若本地的BID相同,再比较本地的PID,最小的成为指定端口 当这种情况出现的情况的时候,就出环了: ⅳ、若本地PID相同,该接口直接阻塞,最小的成为指定端口 Ⅳ、非指定端口(阻塞状态)的选举: 阻塞状态:逻辑阻塞,能接收流量,但不向任何接口进行转发。 选举规则:当一个网络中将以上三种角色均选举完成后,剩余所有未分配任何角色的接口成为非指定端口。
已知交换机A、B、C、D、E、F,其MAC分别是全A、全B、全C、全D、全E、全F,所有接口的优先级都是默认的。有下面三种图,其端口数值模拟其端口编号的大小。 标出所有端口的状态。 答案如下: 通过上面实验我们发现,根网桥就是整个网络的中心,所有的通讯必须经过它。
注意:若最底层的交换机中连接着电脑,该电脑也会参与生成树的选举,因为生成树只有发出BPDU,才知道其底层连接的是交换机还是电脑。
注意:任何接口在选举未完成前,均不能转发用户的流量
Ⅰ、初始收敛:30s Ⅱ、结构突变: i、30s直连检测前提下,本地阻塞端口启用需要15s侦听+15s学习 接着Switch5打开阻塞接口,进行15s的侦听、15s的学习,总计30s。 ii、50s非直连检测的前提下,阻塞端口需要20s hold time + 30s 的选举时间
IEEE802.1D算法的缺点1、收敛速度慢:原因是因为当年网桥开始的时候,处理速度慢。2、链路利用率低:指阻塞端口那根线是处于闲置状态的,Cisco公司发现公有协议走到了它的前面,因此Cisco就针对生成树发明了一种新协议,专门针对STP存在的缺点,提出了PVST技术。
PVST(Per Vlan Spanning Tree 生成树):Cisco私有,基于VLAN的生成树协议,每个VLAN一颗树。 优点:彻底解决了链路利用率低的问题,将不同VLAN的根网桥放置于不同的汇聚层设备上, 然后实现流量的分担,提高了了链路的利用率。
缺点:收敛速度慢、树形结构多、仅支持trunk干道的ISL的封装技术(Cisco私有)。
特点:同IEEE802.1D完全一致的算法,但每个VLAN独立使用一颗生成树,仅能基于ISL的trunk干道封装技术进行工作。
基于每个VLAN发出不同的BPDU,各自进行各自的选举,选举规则为IEEE802.1D规则。默认所有VLAN发出的BPDU中网桥优先级为32768+VLAN的ID。
管理员手工修改网桥优先级,只能修改32768的部分,且该部分的修改必须以4096的倍数来进行。
(1)干涉根网桥的位置,修改网桥优先级: SW1(config)#spanning-tree vlan 3 priority 28672 (2)直接干涉根网桥的位置: sw1(config)#spanning-tree vlan 2 root primary 本地成为vlan2的根网桥 sw1(config)#spanning-tree vlan 3 root secondary 本地成为vlan3的备份根 原理:修改为根,本地自动将网桥优先级下调2倍的4096 修改为备份根的优先级下调1倍的4096 (3)修改接口的优先级默认128(范围0-240): SW1(config)#interface fastEthernet 0/24 SW1(config-if)#spanning-tree vlan 2 port-priority 16 修改时必须为 16 的倍数。 (4)修改接口的cost值: CORE(config)#interface f0/1 CORE(config-if)#spanning-tree vlan 2 cost ? <1-200000000> Change an interface's per VLAN spanning tree path cost我这里用的是Packet Tracer 模拟器,它默认使用的生成树就是PVST协议。我们连接一个拓扑,然后使用上述命令查看一下这张表: 怎样证明你有VLAN的用户呢?可以使用下面两种办法。 (1)得有一个接口,该接口必须划分到VLAN2、状态是双UP (2)拥有trunk干道:我本地虽然没有VLAN2的人,但是我的邻居有,可以通过trunk干道访问该VLAN的用户
因此:一台设备希望存在某个VLAN的生成树,必须存在该VLAN,同时存在该VLAN的用户或者存在trunk干道。
从上面我们知道,Cisco公司只解决了部分的问题,但是收敛速度慢的问题是始终没解决。为了解决整个问题,它们提出了PVST+。 现在Cisco的设备默认支持的就是PVST+、802.1Q的封装。
PVST+:其工作原理同PVST完全一致,但可以基于ISL、802.1Q工作,可以实现部分的加速,干涉PVST+的生成树选举指令。
端口加速用于在连接PC的access端口(配置位置)上实现端口加速,端口加速之后,电脑不需要进行生成树的选举(不用再等待30s的生成树)直接进入转发状态。
定义接口为host接口时:接口默认为access,同时portfast功能激活。 SW1(config)#interface f0/1 SW1(config-if)#switchport host 激活portfast功能: SW1(config)#in f0/1 SW1(config-if)#spanning-tree portfast上行链路加速:接入层交换机(配置位置)在存在直连检测的前提下,本地阻塞端口需要15s侦听,15s学习才能进入转发状态,开启上行链路加速后,该接口将直接成为根端口进入转发状态。
SW1(config)#spanning-tree uplinkfast 该指令只用于接入层设备由于上行链路加速让阻塞端口直接成为根端口进入转发状态,因此该加速万不可用于汇聚层交换机,它更适合于存在阻塞端口的接入层设备,当uplinkfast开启后,该设备的网桥优先级和cost值将成倍增加,被强制固定为非根设备。
骨干加速:交换机在没有直连检测的前提下,需要20s的hold+30s的收敛才能转发流量。开启骨干加速后,可以省略20s的hold但剩余30s,必须正常进行。接收到次优BPDU后,骨干加速的设备可以省略20s的 hold time。
它的思路就是:我都收到对端的次优BPDU,那说明拓扑发生了变化,那就直接重新收敛吧。
所有的交换机(配置位置)
SW1(config)#spanning-tree backbonefast 优点①可以将不同VLAN的根网桥放置于不同的汇聚层设备上,然后实现流量的分担,提高了链路的利用率②可以部分的加速③兼容802.1Q缺点①收敛速度慢:加速不够彻底②树形结构多对于PVST+总结一下它实现了哪些加速:
状态是否加速首先初次收敛30s否连接PC的接口是(减少30s的选举时间)直连检测是(减少30s的选举时间)非直连检测是(减少20s的维持时间)通过分析上面的PVST+协议,我们发现,它的加速并不完全,依然存在很多问题。因此两类协议都进行了改进:
公有私有802.1D ==> 802.1WPVST+ ==> RSTP/RPVST虽然进行了改进,但是其主体特点保持不变: ①RSTP又叫做RPVST为私有协议基于每个VLAN一颗生成树,选举算法同PVST+一致; ②802.1W为公有协议,整个交换网络为一棵树
修改生成树的模式(建议所有交换模式一致): sw1(config)#spanning-tree mode ? mst Multiple spanning tree mode pvst Per-Vlan spanning tree mode rapid-pvst Per-Vlan rapid spanning tree mode注意:不是所有的物理接口均支持RSTP 当接口为 100M的时候链路类型为全双工,为P2P(点到点) 当接口为 10M的时候链路类型为半双工,为Shr(共享型链路)
对于10M带宽的链路类型,默认是不支持快速生成树的,我们可以修改它的链路类型:
SW2(config)#int range e0/0-1 SW2(config-if-range)#spanning-tree link-type point-to-point上面的收敛速度慢的问题解决了,但是对于公有协议只有一颗树,对于私有协议树多。为了解决这个问题出现了新的生成树:MSTP
这个协议是最早由Cisco研发出来,最后捐出来,成为公有的协议了。
MSTP/802.1S:首先它也是快速生成树,特点如下: ①基于一个组一颗生成树,一个组中可以放置多个VLAN ②快速收敛:同802.1W机理一致,故半双工接口需要修改链路类型
修改模式为MST SW1(config)#spanning-tree mode mst 所有交换机上修改 SW1#show spanning-tree mst 0 查看mst组0MSTP分组的方式默认存在0号组,所有VLAN均在该组中
配置
(1)进行组配置: SW1(config)#spanning-tree mst configuration SW1(config-mst)#instance 1 vlan 6-10,115 创建组号1,同时定义该组的VLAN SW1(config-mst)#instance 2 vlan 16-20 (2)修改根网桥的位置 SW1(config)#spanning-tree mst 1 root ? primary Configure this switch as primary root for this spanning tree secondary Configure switch as secondary root (3)修改网桥优先级 SW1(config)#spanning-tree mst 1 priority ? <0-61440> bridge priority in increments of 4096 (4)修改接口优先级,或cost值 SW1(config-if)#spanning-tree mst 1 ? cost Change the interface spanning tree path cost for an instance port-priority Change the spanning tree port priority for an instance