STP协议简介与实例分析
(简介内容为引用自网络博客,个人有所改动)STP(Spanning Tree Protocol)是生成树协议的英文缩写,是OSI网络互联模型中的第二层(Date Link Layer)中的协议。
STP是基于什么需要所开发的协议:
一个优秀的网络工程师,冗余的思想是尤为重要的,因此在做某些网络互联的项目时,会使用多个交换机Switch进行保障通信,避免单点故障。可是如果几个交换机同时作用时,难免会发生一些问题:1,广播风暴。一个PC或者Host Server 发送一个广播broadcast,从而使形成环路的交换机不停的泛洪(由于交换机是二层设备,没有网络层封装帧的TTL数,所以这种广播风暴更为严重), 直到网络堵塞。2,帧的多重复制。由于多台Switch转发数据,可以使目标路由器接收到几个相同的帧,这在三层路由的一些协议中,会出现故障。 3,MAC地址表不稳定。由于交换机中MAC表中,一个端口可对应多个MAC地址,而一个MAC无法对应多个端口。然而在多个Switch同时作用环路 时,难免会造成MAC表学习重复,使MAC地址对应的端口不断被覆盖,造成MAC地址表不稳定。
基于以上问题,开发出来了STP生成树协议,该协议可应用于环路网络,通过一定的算法实现路径冗余,同时将环路网络修剪成无环路的树型网络,从而避免报文在环路网络中的增生和无限循环。
生成树协议STP/RSTP
一. 技术原理:
STP的基本思想就是生成“一棵树”,树的根是一个称为根桥的交换机,根据设置不同,不同的交换机会被选为根桥,但任意时刻只能有一个根桥。由根桥开始,逐级形成一棵树,根桥定时发送配置报文,非根桥接收配置报文并转发,如果某台交换机能够从两个以上的端口接收到配置报文,则说明从该交换机到根有不止 一条路径,便构成了循环回路,此时交换机根据端口的配置选出一个端口并把其他的端口阻塞,消除循环。当某个端口长时间不能接收到配置报文的时候,交换机认为端口的配置超时,网络拓扑可能已经改变,此时重新计算网络拓扑,重新生成一棵树。
总之,其目的就是在不影响冗余的情况下,避免交换机环路的出现。
具体的选举步骤为:
1、One root bridge per network(在网络中选一个根桥)
2、One root port per nonroot bridge(在每一个非根桥中选举一个根端口称为RP)
3、One designated port per segment(在每条链路中选举一个指定端口称为DP)
4、Nondesignated ports are unused(剩下的一个端口为BLOCK状态)
选举原则:
1,在所有交换机中Bridge ID越低,越优先。
【先介绍一下Bridge ID,Bridge ID又两部分组成,{Bridge Priority,MAC Adress}。Bridge Priority为桥优先级,默认为32768;MAC Adress就是交换机的MAC地址。桥ID先比较优先级,优先级低的则桥ID低,优先级默认一直时,比较MAC地址。(注:如果想把指定交换机设为根桥,可把改交换机的Bridge Priority设为更低,一般设为0】
2,选举根端口时,按照以下原则。COST--Port ID,先比较COST值,即该端口到根桥的花费。COST值越低越优先。
【COST值】
带宽 COST
10Gps 2
1Gps 4
100M 19
10M 100
如果COST值相同的话,再比较所连接的网桥ID,最后比较Port ID,优先级默认相同时再比较端口编号,Port 0优先与Port 1。3,选举DP,规则为COST--Bridge ID。先比较COST,当COST相同时,再比较所在桥ID,桥ID越小越优先。桥ID一致时,比较端口ID。
4,最后剩下的那个唯一的端口即为BLOCK状态,即不运作,但会接收BPDU报文,监听其他正常使用的交换机是否工作正常,如不正常立即启用。
(一般情况下,桥优先级的数值Bridge Priority是决定桥ID即桥在STP根选举以及根端口和指定端口在开销一致下选举过程中的优先等级,只在一种情况下例外,即默认出厂时,桥优先级数值默认一致时,交换机自动比较MAC地址决定桥ID即选举优先等级,但这种默认情况在我们需要自行设计配置STP的时候意义是不大的,因此我们一般都用改动Bridge Priority值的方式来作为设计STP的关键)
Spanning-tree transits each port through several different states:
1,收BPDU报文,如20s没有收到回包,即转入下一步骤。------只可收BPDU报文
2,Listening 届时15s 此期间,会进行STP选举------------可以收、发BPDU报文,不转发用户数据
3,Learning 届时15s 此期间会学习MAC地址,为以后减少泛洪流量做准备
4,Forwarding
以上可以看出,STP协议会持续50s,这就是有的PC开机后50s后才可以上网,进行数据传输。为此,由开发了RSTP协议(快速生成树协议),收敛速度可达到1s。
二. 功能介绍:
生成树协议最主要的应用是为了避免局域网中的网络环回,解决成环以太网网络的“广播风暴”问题,从某种意义上说是一种网络保护技术,可以消除由于失误 或者意外带来的循环连接。STP也提供了为网络提供备份连接的可能,可与SDH保护配合构成以太环网的双重保护。新型以太单板支持符合ITU-T 802.1d标准的生成树协议STP及802.1w规定的快速生成树协议RSTP,收敛速度可达到1s。
但是,由于协议机制本身的局限,STP保护速度慢(即使是1s的收敛速度也无法满足电信级的要求),如果在城域网内部运用STP技术,用户网络的动荡 会引起运营商网络的动荡。目前在MSTP 组成环网中,由于SDH保护倒换时间比STP协议收敛时间快的多,系统采用依然是SDH MS-SPRING或SNCP,一般倒换时间在50ms以内。但测试时部分以太网业务的倒换时间为0或小于几个毫秒,原因是内部具有较大缓存。SDH保护 倒换动作对MAC层是不可见的。这两个层次的保护可以协调工作,设置一定的"拖延时间"(hold-off),一般不会出现多次倒换问题。
一、STP算法
IEEE802.1D标准定义了STP的生成树算法。该算法依赖于BID、路径开销和端口ID参数来做出决定。
1、BID(网桥ID):
BID是生成树算法的第一个参数,BID决定了桥接网络的中心,称为根网桥或根交换机。
BID参数是一个8字节域。前2个字节(10进制)称为“网桥优先级”,后6个字节(16进制)是交换机的一个MAC地址。
网桥优先级用来衡量一个网桥的优先度,范围是0-65535,默认是32768。
思科交换机中的PVST+(每VLAN生成树)生成树协议使每个VLAN都有一个STP实例。
比较两个BID的大小的原则:一是网桥优先级小的BID优先,二是如果网桥优先级相同,BID中的后六个字节的MAC小的则BID优先。
2、路径开销:
路径开销是生成树算法的第二个参数,决定到根网桥(根交换机)的路径。
通俗说,路径开销是用来衡量网桥之间的距离的远近的,其值是两个网桥之间某条路径上所有链路开销的总和。
路径开销与跳数无关。
路径开销决定到根网桥或根交换机的最佳路径,最小的路径开销是到根交换机的最佳路径。
路径开销的值的规律:带宽越大,STP开销越小。
3、端口ID:端口ID是生成树算法的第三个参数,也决定到根交换机的路径。它由2个字节组成,包括“端口优先级”和“端口号”,各占8位。
端口优先级值从0-255,默认128;端口号包括256个。
端口ID大小的判定与BID大小的判定相同。
二、STP的过程
1、STP判决和BPDU交换:
当创建一个逻辑无环的拓扑时,STP总是通过发送BPDU的第二层帧来传递生成树协议,并执行相同的4步判决顺序:
步骤1,确定根交换机;
步骤2,计算到根交换机的最小路径开销;
步骤3,确定最小的发送者BID;
步骤4,确定最小的端口ID。
网桥为每个端口存储一个其收到的最佳BPDU,当有其他的BPDU到达交换机的端口时,交换机会使用四步判决过程来判断此BPDU是否比该端口原来存储的BPDU更好,如果新收到的BPDU(或者本地生成的BPDU)更好,则替换原有值。
当一个网桥第一次被激活时,其上所有端口每隔一个HELLO时间(默认2秒)发送一次BPDU;如果一个端口发现从其他网桥收到的BPDU比自己发送的好,则本地端口就停止发送BPDU;如果在MAX AGE(最大生存时间,默认20秒)内没有从邻居网桥收到更好的BPDU,本地端口则重新开始发送BPDU,即最大生存时间是最佳BPDU的超时时间。
2、STP收敛的三个步骤:
生成树算法收敛于一个无环拓扑的初始过程包含三个选举步骤:
步骤1 选举一个根交换机。
步骤2 选举根端口。
步骤3 选举指定端口。
在网络第一次“初始”时,所有网桥都洪泛混合的BPDU信息,网桥通过执行STP四步判决过程,形成整个网络或VLAN惟一的生成树。在网络稳定后,BPDU从根网桥流出,沿着无环支路到达网络中的每一个网段。网络发生变化时,生成树协议按照收敛三个步骤做出处理
(1)选举根交换机:
根交换机是一个具有最小BID的网桥,它是惟一的,是通过交换BPDU选举得出来的。
BPDU的格式:BPDU是网桥之间用来交换生成树信息的特殊帧,它在网桥之间传播,包括交换机和所有配置来进行桥接的路由器,BPDU不携带终端用户流量。
BPDU包括根BID、根路径开销、发送者BID和端口ID信息。
也就是说,交换机通过传递BPDU来发现谁是最小的BID,从而将具有最小BID的网桥做为根交换机。最初时,交换机总将自己认为是根网桥,当它发现有比自己小的BID时,就将收到的具有最小BID的交换机作为根网桥。
(2)选举根端口:
在根交换机选举完后,就开始选举根端口了。所谓根端口,就是按照路径开销最靠近根交换机的端口,也就是说具有最小根路径开销的端口。每一个非根交换机都必须选举一个根端口。
(3)选举指定端口:
通过以上两个步骤后,生成树算法还没有消除任何环路,因为还没有选举指定端口。所谓指定端口,就是连接在某个网段上的一个桥接端口,它通过该网段既向根交换机发送流量也从根交换机接收流量。桥接网络中的每个网段都必须有一个指定端口。
指定端口也是根据最小根路径开销来决定,因此根交换机上的每个活动端口都是指定端口,因为它的每个端口都具有最小根路径开销(实际是它的根路径开销是0)。
注意:指定端口只在中继端口(TRUNK口)起作用。接入端口在指定端口选举中不起任何作用。接入端口是用来连接到主机或者三层端口的。
3、STP状态
在网桥已经确定了根端口、指定端口和非指定端口后,STP就准备开始创建一个无环拓扑了。
为创建一个无环的拓扑,STP配置根端口和指定端口转发流量,非指定端口阻塞流量。
实际上,STP决定端口转发和阻塞看似只有这两个状态,实际上是有五种状态的。
(1)、Disabled(为了管理目的或者因为发生故障将端口关闭);
(2)、Blocking(在初始启用端口之后的状态。端口不能接收或者传输数据,不能把MAC地址加入地址表,只能接收BPDU(bridge protocol data unit)。如果检测到有一个桥接环,或者端口失去了它的根端口或者指定端口的状态,那么就会返回到Blocking状态);
(3)、Listening(如果一个端口可以成为一个根端口或者指定端口,那么它就转入监听状态。此时端口不能接收或者传输数据,也不能把MAC地址加入地址表,但可以接收和发送BPDU);
(4)、Learning(在Forward Delay计时时间到(默认15秒)后,端口进入学习状态,此时端口不能传输数据,但可以发送和接收BPDU,也可以学习MAC地址,并加入地址表);
(5)、Forwarding(在下一次转发延时计时时间到后,端口进入转发状态,此时端口能够发送和接收数据、学习MAC地址、发送和接收BPDU)。
在这些状态过程中,会引发网络拓扑结构发生改变。此时,发生变化的交换机会在它的根端口上每隔hello time时间就发送TCN BPDU,直到上级的指定网桥邻居确认了该TCN(拓扑结构变化通知)为止。当根网桥收到后,会发送设置了TC(topology change,拓扑改变)位的BPDU,通知整个生成树拓扑结构发生了变化。这会让所有的下级交换机把它们的Address Table Aging(地址表老化)计时器从默认值(300秒)降为Fordwarding Delay(默认为15秒),从而让不活动的MAC地址比正常情况下更快地从地址表更新掉
例子:如图
由图上所示,s1为根桥,打开s1的配置查看入下:
可以看出 根桥的优先级和此交换机的优先级是一致的,而且都是为1(实际为0,系统自动加1)。比较一下S0的配置,如下图:
交换机默认的ID好是32768,而根桥的是0,桥ID号是由交换机的优先级和MAC地址组成的(这个MAC地址就是交换机自带的默认管理VLAN1的MAC地址)。
这里,S1的优先级被人为改成了0,因此这个根桥是人为定义的。
定义方法如下:
上一行提示优先级的选择范围,以及优先级必须为4096的倍数,人为定义,一般根桥定义为0. 其余的根据上任根桥断出网络后改由哪个继任相应配置优先级。
其他两台二层交换机的配置情况和s0类似,均为直接连接到根桥S1,而连接到S0的线路被置于断开模式。
还有另外一台交换机 2960-24TT switch2 。在选择最优路径的时候为什么选择是左边,而不是右边。及时是去掉左边二层交换机到根桥的直接连接也是如此(这样从表面上看是左面跨越的交换机多,而右面的少,常规思维应该是右面为最优路径)。
解释如下:
交换机在选择到根桥的最优路径的时候,不是根据中间隔着的交换机的数量(这和路由器的跳数不同)而是依靠到根桥的时间开销(即响应时间)。交换机由于其直接大容量的硬件电路交换数据包文,中间增加交换机的数量对报文的传递效率几乎没有影响。
看一下2960-24TT switch2的配置:
到根桥的相应时间依旧为默认的19,是从右边的0/10口连接的,而左面的0/6口的开销为100. (端口状态为BLK即关闭)。查资料得知,该口的速率应该为10M。查看配置证实如此:
而将0/6的速率恢复为100M。即开销恢复为19后,将右边二层交换机的桥优先级调小些(高优先级)Switch(config)# spanning-tree vlan 1 priority 4096
则,根端口变为0/6.
下面例举一下,在选择根端口的时候,选择的三个条件:
1, 到根的路径开销最小
2, 与之连接的别的交换机的网桥ID最小(优先级较高)
3, 所在端口的ID最小
在这三个条件中的前两个条件都完全相同的情况下,比较第三种条件的情况。
在两个交换机之间再连接一个链路在双方的0/4口上,由于其他条件完全一致,即比较端口编号,0/4的编号小为根端口,此时0/6被阻塞。
下面例举一下,在指定端口的选举中,三个条件的选择情况:
如图:在2960-24TT switch2上用直连线直接连接到根桥,定于0/5端口,此时,必然0/5变成了根端口。
此时,0/10和0/6两个端口在各自网段(冲突域中)指定端口的选举中失败
如果要该交换机的0/6端口战胜右边二层交换机的0/6端口成为指定端口,则只需降低右边二层交换机的桥优先级,其数值改为61440后。
如图:不仅2960-24TT switch2的0/6端口成为了指定端口,连左边三层机的原来阻塞的0/3端口也被选举成了指定端口:
而个人人为,在选举指定端口的时候,因为同个网段的两个端口之间选择一个,而第二个条件是比较各自所在交换机的网桥ID,这两个网桥ID由于MAC地址的不同,及时优先级数值一致也不会出现网桥ID一致的情况,因此我人为不会出现比较Port优先级来选择指定端口的情况。