交换网络环路的产生

     在实际网络环境中,物理环路可以提高网络的可靠性,当一条线路断掉时,另一条线路仍然可以传输数据。但是,当交换机收到广播请求时,交换机就根据转发原理(交换机从除收到该广播帧之外的所有端口转发广播帧),形成了一个环路,这种广播帧会越来越多,最终形成广播风暴,导致网络瘫痪。这种广播风暴只有在物理环路消失时才可能停止。

      生成树协议(STP)原理与配置PVST+实现负载均衡_第1张图片

    但是环状的物理线路能够为网络提供备份线路,增强网络的可靠性,这在网络设计中是必要的,因此,这就需要一种解决方法,一方面能够保证网络的可靠性,另一方面还要防止广播风暴的产生。

STP协议就是用来解决这个问题的。STP协议并不是断掉物理环路,而是在逻辑上断开环路,防止广播风暴的产生。


STP简介

   STP(Spanning Tree Protocol,生成树协议)就是把一个环形的结构改变成一个树形的结构。STP协议就是用来将物理上存在环路的网络,通过一种算法,在逻辑上阻塞一些端口,来生成一个逻辑上的树形结构。当线路发生故障时,被阻塞的线路就重新激活,使数据从这条线路正常传输。


生成树算法

   生成树协议运行生成树算法(Spanning Tree Algorithm,STA)。生成树算法很复杂,但是其过程可以归纳为以下三个步骤:

第一步:选择根网桥(Root Bridge)

第二步:选择根端口(Root Ports)

第三步:选择指定端口(Designated Ports)

网桥:交换机的前身,由于STP是在网桥基础上开发的,因此现在交换机的网络中仍然沿用网桥这一术语。在Cisco教程里习惯称为“网桥”,在这指的就是“交换机”。

1.选择根网桥(在一个环形网络中,可以出现多个根网桥(有多个VLAN的时候,或者做负载均衡的时候),默认只有一个)

   选择根网桥的依据是网桥ID,网桥ID是一个八字节的字段,前两个字节的十进制数称为网桥优先级,后两个字节是网桥的MAC地址。

  网桥优先级是用于衡量网桥在生成树算法中优先级的十进制数,取值范围为0-65535,默认值是32768.

  网桥ID中的MAC地址是交换机自身的MAC地址,可以使用命令show version在交换机版本信息中查看交换机自身的MAC地址。

  * 按照生术数算法的定义,当比较某个STP参数的两个取值时,值小的优先级高。因此,在选择根网桥的时候,比较的方法是看哪台交换机的网桥ID的值最小,优先级小的被选择为根网桥,在优先级相同的情况下,MAC地址小的为根网桥。


2.选择根端口(在每个非根网桥上选择一个)

   选出了根网桥之后,网络中的每台交换机必须和根网桥建立某种关联,因此STP将开始选择根端口的过程。根端口存在于非根网桥上,需要在每个非网桥上选择一个根端口。

选择根端口的依据按照顺序依次如下:

(1) 到根网桥最低的根路径成本

(2) 直连的网桥ID最小

(3) 端口ID最小(直连对端的网桥端口ID最小的端口所对应的端口)

  根路径成本是两个网桥间的路径上所有线路的成本之和,也就是某个网桥到达根网桥的中间所有线路的路径成本之和。

  路径成本用来代表一条线路带宽的大小,一条线路的带宽越大,它传输数据的成本也就越低。

 生成树协议(STP)原理与配置PVST+实现负载均衡_第2张图片

            生成树协议(STP)原理与配置PVST+实现负载均衡_第3张图片

  端口ID是一个二字节的STP参数,由一个字节(8位)的端口优先级和一个字节(8位)的端口编号组成。

  端口优先级是一个可配置的STP参数,在基于IOS的交换机上,端口优先级的十进制取值范围是0-255,默认值是128。

  端口编号是Catalyst用于列举各个端口的数字标示符。在基于IOS的交换机上,可以支持256个端口。端口编号不是端口号,但是端口号低的端口,端口编号值也较小。

  * 在STP选择根端口的时候,首先比较交换机端口的根路径成本,根路径成本低的为根端口。当根路径成本相同的时候,比较连接的交换机的网桥ID值,选择网桥ID值小的作为根端口;当网桥ID相同的时候,比较端口ID值,选择较小的作为根端口。

注意:在比较端口ID值时,比较的是接收到的对端的端口ID值。


3.选择指定端口(在每条链路上选择一个)

   选择完根网桥和每台交换机的根端口后,一个树形结构已初步形成,但是,所有的线路仍连接在一起,并可能都处于活动状态,最后导致形成环路。

    为了消除环路形成的可能,STP进行最后的计算,在每一个网段上选择一个指定端口。选择指定端口的依据与根端口相同,按顺序有以下三个:

(1)根路径成本较低

(2)所在的交换机的网桥ID的值较小

(3)端口ID的值较小

  * 在STP选择指定端口的时候,首先比较同一网段上端口中根路径成本最低时,也就是将到达根网桥最近的端口作为指定端口;当根路径成本相同的时候,比较这个端口所在的交换机的网桥ID值,选择一个网桥ID值小的交换机上的端口作为指定端口;当网桥ID相同的时候,也就是说,有几个位于同一交换机上端口时,比较端口ID值,选择较小的作为指定端口。

注意:和选择根端口不同,在比较端口ID值时,比较的是自身的端口ID值。


生成树算法验证 

  在交换机上使用命令查看生成树

   Switch# show  spanning-tree            


桥协议数据单元(BPDU)

   交换机之间通过BPDU(桥协议数据单元,Bridge Protocol Data Unit)来交换网桥ID、根路径成本等信息。交换机从端口发送出一个BPDU帧,使用该端口本身的MAC地址作为源地址。交换机本身并不知道它周围是否还有其他的交换机存在。因此,BPDU帧利用了一个STP组播地址(01-80-c2-00-00-00)作为它的一个目的地址,使之能到达相邻的,并处于STP侦听状态的交换机。

  每隔两秒,便向所有的交换机端口发送一次BPDU报文,以便交换机(或网桥)能交换当前最新的拓扑信息,并迅速识别和检测其中的环路。

1.BPDU的两种类型

(1) 配置BPDU,用于生成树计算。

(2) 拓扑变更通告(Topology Change Notification,TCN)BPDU,用于通告网络拓扑的变化。

2.BPDU报文字段

  BPDU中包含根网桥ID、根路径成本、发送网桥、端口ID和计时器等,下面是对BPDU几个关键字段作用的解释。

(1) 根网桥ID:由一个二字节优先级和一个六字节网桥MAC地址组成。这个信息组合表明已经被选定为根网桥的设备标识。

(2) 根路径成本:说明这个BPDU从根网桥传输了多远,成本是多少。这个字段的值决定哪些端口将进行转发,哪些端口将被阻断。

(3) 发送网桥ID:这是发送BPDU的网桥信息,由网桥的优先级和网桥MAC地址组成。

(4) 端口ID:由一个字节的端口优先级和一个字节的端口编号组成。

(5) 计时器:计时器用于说明生成树用多长时间能完成它的每项功能。这些功能包括报文老化时间、最大老化时间、访问时间和转发延迟。

3.STP利用BPDU选择根网桥的过程

   根网桥的选择是一个持续、反复进行的过程,它没两秒触发一次,检查BPDU的根网桥ID是否发生了变化、网桥是否有网桥ID值更低的交换机加入进来。


STP的收敛

1.生成树端口的状态

   生成树协议在交换机中自动运行,在交换机开机的时候可以看到,交换机的指示灯显示为***,并且大约有30S的时间不能转发数据,这时交换机是在做STP计算。直到交换机的STP计算完毕,有些端口可以转发数据,有些端口被阻塞,也就是网络收敛后,交换机才开始转发数据。并且,当网络的拓扑发生变化的时候,交换机还要重新运行STP计算,形成新的逻辑的拓扑结构。

   在STP运算过程中,交换机的每一个端口都必须依次经历好几种状态,如图所示:

  生成树协议(STP)原理与配置PVST+实现负载均衡_第4张图片

2. 生成树计时器

   STP在交换机相互发送BPDU报文时,尽力形成一个无环路的拓扑。BPDU从一台交换机传到另一台交换机时,总要花费一定的时间。另外,当拓扑改变(如线路或根网桥故障)的消息从网络的一侧传送到另一侧时,也要经历一定的传播延迟。由于存在这些延迟,所以需要为交换机设置足够的时间来完成BPDU的转发和生成树的运算,因袭,在交换机内部设置了一些计时器来控制每个阶段的时间长度。

   STP利用三种计时方法来确定一个网络正确的收敛。现将STP计时器及它们的默认值描述如下:

* Hello时间:网桥发送配置BPDU报文之间的时间间隔。IEEE802.1q标准规定的默认访问时间为两秒。

转发延迟:一个交换机端口在Listening(侦听)和Learning(学习)状态所花费的时间间隔,它的默认值各为15S。

* 最大老化时间:交换机在丢失BPDU报文之前存储它的最大时间。

侦听和学习都是生成树所实施的过渡状态,用来强迫端口等待来自其他交换机上的所有BPDU。典型的端口过渡如下:

A.从阻塞到侦听(20s)

B.从侦听到学习(15s)

C.从学习到侦听(15s)

  当启用STP时,VLAN上面的每台交换机在加电以后都经过从给阻塞到侦听、学习的过渡状态。

  STP计时器可以用命令予以配置和调整。不过,如不是经过认真考虑和规划,建议不要轻易改变计时器的默认值。


STP与VLAN的关系

VLAN与生成树之间的关系主要有以下几种:

1.IEEE的CST(Common Spanning Tree,通用生成树)

2. Cisco的PVST(Per VLAN Spanning Tree,每VLAN生成树)

3.Cisco的PVST+(Per VLAN Spanning Tree Plus,增强的每VLAN生成树)

4. IEEE的MST(Multiple Spanning Tree,多生成树)

  其中,CST不考虑VLAN,以交换机为单位运行STP(整个交换网络生成一个STP实例),交换机中划分VLAN不会产生广播环路。但是由于CST不考虑VLAN,所以经过STP计算后会阻塞其中的一个端口。

PVST是Cisco私有的协议,PVST为每个虚拟局域网运行单独的生成树实例(每个VLAN生成一个STP实例)。

PVST为每个VLAN运行独立的一个生成树实例,能优化根网桥的位置,能为所有的VLAN提供最优路径(因为VLAN的拓扑结构各不相同)。

  但是,PVST也不是完美的,主要缺点如下:

1.为了维护针对每个VLAN而生成的生成树,交换机的利用率(如CPU负载)会更高。

2. 为了支持各个VLAN的BPDU,需要占用更多的Trunk线路带宽。

3. PVST与IEEE的CST不兼容,使得运行PVST的Cisco交换机不能与其他厂家的交换机进行互操。

  为了解决和其他厂商的交换机进行互操作的问题,Cisco开发了PVST+。PVST+允许CST的信息传给PVST,以便与其他厂商在VLAN上运行生成树的实现方法进行互操作。

  PVST+为每一个VLAN生成一个生成树实例,而每个实例都要占用交换机的CPU和内存资源。随着VLAN的增加,实例也会增加,这导致维护生成树实例将占用较多的交换机资源。


1. 配置PVST+的意义

   因为在交换网络中,如果一个根网桥不稳定,那么这个网络就需要经常惊醒STP运算,经常变化逻辑拓扑。因此,可以说,如果网络中有一个不稳定的根网桥,就会有一个不稳定的网络。

   而在交换机选择根网桥的时候,如果不修改网桥ID中的优先级,那么选择的依据就是交换机的MAC地址,而MAC地址是随机的,很可能就会碰到这种情况:网络中最边缘的交换机被选择成了根网桥。因此,虽然生成树在交换机中自动运行,但是,合理的配置能够对网络进行优化。

  生成树协议(STP)原理与配置PVST+实现负载均衡_第5张图片

  除了配置网络中比较稳定的交换机为根网桥外,PVST+的配置主要还有以下几个方面:

1) 利用PVST+实现网络的负载均衡

   配置两台或多台核心交换机分别为不同VLAN的根网桥,使不同的VLAN中各接入交换机上选择的根端口不同,因此,不同的VLAN的数据传输使用的线路也不同,以达到两条或多条线路之间负载均衡的目的。

2) 配置速端口(PostFast)

   使连接终端的端口快速进入到转发状态。主机连接到交换机的端口,如果主机关闭后再开机,交换机的端口状态会先变为down再变为up。这时,此端口直到STP进入转发状态后才可用,如果使用默认的STP计时器,端口从down到STP的转发状态需要至少30秒。这就导致主机必须等待端口进入转发状态后,才能接收或转发数据。

当单台主机连接到交换机的一个端口时,不可能形成环路,所以Cisco交换机提供了速端口功能。在端口启用速端口功能后,当端口从down到up状态时,该端口不经过侦听和学习状态,直接进入转发状态,节省30秒的转发延迟。然而,该端口仍然运行生成树协议,如果检测到了环路,也能够从转发状态转换到阻塞状态。速端口只能配置在连接终端的接口上,否则就有可能导致短时间的生成树的环路。


2. PVST+配置命令

(1) 启用生成树命令

   交换机在默认情况下启用生成树。通过在此命令前加no,可以关掉某个VLAN的生成树,但是,一般情况下,即使网络中不存在物理环路,也不建议关闭生成树。启用生成树的命令如下:

   Switch(config)# spanning-tree vlan vlan-list          


(2) 指定根网桥

由于MAC地址不可更改,所以要指定VLAN的优先级。可以使用下面命令更改优先级。

   Switch(config)# spanning-tree vlan vlan-list priority Bridge-priority  

  其中,Bridge-priority默认为32768,范围是0-65535,可以通过此命令同时更改多个VLAN的网桥优先级,例如VLAN5和VLAN10-20的网桥优先级配置为4096,如下所示:

   Switch(config)# spanning-tree vlan 5,10-20 priority 4096          

除了更改网桥的优先级外,还可以使用命令指定交换机为根网桥,如果配置为primary,则交换机的优先级变为24576,配置secondary,优先级变为28672。配置根网桥的命令如下:

   Switch(config)# spanning-tree vlan vlan-list root {primary | secondary}   

注意:配置VLAN负载均衡的两种方法的目的都是改变STP的优先级,且配置的STP优先级必须是4096的倍数


(3) 修改端口成本

在端口模式下配置如下命令,来更改该端口的端口成本。如下所示:

   Switch(config-if)# spanning-tree vlan vlan-list cost cost   


(4) 修改端口优先级

在端口模式下配置如下命令,更改该端口的端口优先级,如下所示:

   Switch(config-if)#spanning-tree vlan vlan-list port-priority priority   

例如,使用下面命令更改F0/1端口的成本和优先级,如下所示:

   Switch(config)# spanning-tree vlan 1 cost 10              

   Switch(config)# spanning-tree vlan 1 port-priority 96     


(5) 配置速端口

   Switch(config)# spanning-tree portfast             


3. PVST+配置的查看

(1) 查看生成树的配置

   Switch# show spanning-tree                        

(2) 查看某个VLAN的生成树详细信息

   Switch# show spanning-tree vlan vlan-id detail    


配置STP实现VLAN负载均衡

   生成树协议(STP)原理与配置PVST+实现负载均衡_第6张图片  

(1)为交换机配置VLAN并配置连接端口为trunk模式 (略)

(2)配置VLAN负载均衡

   SW1(config)# spanning-tree vlan 1  root primary          

   SW1(config)# spanning-tree vlan 2  root secondary        

   SW2(config)# spanning-tree vlan 2  root primary          

   SW2(config)# spanning-tree vlan 1  root secondary        

(3)在SW3上为端口1-20配置速端口

   SW3(config)# int r f0/1 -20                              

   SW3(config)# spanning-tree portfast