四、桥协议数据单元(BPDU)
1、BPDU基本概念
桥协议数据单元(Bridege Protocol Data Unit,BPDU)BPDU是STP的协议报文,直接封装在二层协议,是传输载体。是STP能够正常工作的根本。
BPDU主要由 4 部分组成:
(1)根桥ID
(2)发送者到根桥的开销RPC (root-path-cost)
(3) 发送者桥 ID
(4) 发送者桥端口(端口优先级128 + 端口id 如1,2,3)
四部分只有根桥id不变,其余3部分会变化,第2部分计算入端口开销,采用累加,BPDU hello报文间隔2秒,最大age时间20秒,即若20秒没有收到根桥发来的BPDU,则认为根桥挂了,将重新进行根桥选举。
特点:
1)根桥每隔2s发送一次BPDU报文,用于交换机(或网桥)之间,交换网桥ID,根路径成本等最新的拓扑信息。
2)BPDU利用了一个STP组播传输方式,组播地址(01-80-c2-00-00-00)作为它的一个目的地址,使之能到达相邻的并处于STP侦听状态的交换机。
对于STP而言,最重要的工作就是在交换网络中计算出一个无环拓扑。在拓扑计算的过程中,一个非常重要的内容就是配置BPDU的比较。
在配置BPDU中,有四个字段非常关键,它们是“根桥ID”、“根路径开销”、“网桥ID” 、“接口ID”,这四个字段便是交换机进行配置BPDU比较的关键内容。
STP按照如下顺序选择最优的配置BPDU:
1.最小的根桥ID。 主要用于在网络中选举根桥。
2.最小的RPC。 主要用于选举根接口及指定接口。
3.最小的网桥ID。 主要用于选举根接口及指定接口。
4.最小的接口ID。 主要用于选举根接口及指定接口。
2、BPDU报文格式
在一个交换网络中,STP能够正常工作的基本前提是BPDU的正常交互。网桥之间通过交互配置BPDU来进行根桥的选举以及端口角色的确定。(配置BPDU的格式如下右图)
STP的BPDU有两种类型:
1)配置BPDU(Configuration BPDU) BPDU报文格式就是指的配置BPDU。
2)TCN BPDU(Topology Change Notification BPDU)。
(1) 配置BPDU报文格式
字段 | 描述 |
Protocol Identifier (协议ID) | 生成树协议ID,对STP而言,该字段的值总是为0。 |
Protocol version Identifier (协议版本号,PVID) | 用于描述当前使用的协议版本号: STP(802.1D)传统生成树,值为0; RSTP(802.1W)快速生成树,值为2; MSTP(802.1S)多生成树,值为3; |
BPDU Type (BPDU类型) | 描述当前BPDU消息类型: 配置BPDU类型(0x00),用于建立、维护STP拓扑; TCN BPDU类型(0x80),传达拓扑变更消息; RSTP/MSTP BPDU类型(0x02); |
BPDU Flags (BPDU标记域) | 由8位组成,只使用最高位(第一个bit)和最低位(最后一个bit),其余6位保留。 最低位=TC(Topology Change,拓扑变化)标志, 最高位=TCA(Topology Change Acknowledgement,拓扑变化确认)标志 |
Root Identifier(根桥ID) | 根网桥的桥ID,由2字节的桥优先级+6字节的MAC地址组成。 |
Root Path Cost(根路径开销) | 根路径开销,描述发送该BPDU报文的端口累计到根桥的开销。 |
Bridge Identifier | 指定桥ID,本交换机的BID。描述该BPDU的桥ID,由2字节的桥优先级+6字节的MAC地址组成。 |
Port Identifier | 指定端口ID,即“发送端口ID”。描述由优先级+端口号组成。 |
Message Age(消息生存时间) | 该BPDU报文的生存时间。即端口保存BPDU的最长时间,过期后将删除,要在这个时间内转发才有效, 如果配置BPDU是直接来自根桥的,则Message Age为0, 如果是其他桥转发的,则配置BPDU报文经过一个桥,Message Age增加1。 |
MAX age(最大生存时间) | BPDU消息的最大生存时间(即老化时间)。默认20s |
Hello Time(Hello消息定时器) | 发送两个相邻BPDU的时间间隔。默认2s 根桥通过不断发送STP维持自己的地位,Hello time 是发送的间隔时间 |
Forward Delay(转发延时) | 最大延迟时间,默认15s。(端口状态迁移的延迟时间) 端口从listening -> learning 或 learning -> forwarding 的转态需要时间。 |
其中通过根桥ID、路径开销、指定桥ID、指定端口ID、Message Age、Max Age、Hello Time和Forward Delay信息来保证设备完成生成树的计算过程。
(2) TCN BPDU报文格式
TCN BPDU和配置BPDU在结构上基本相同,也是由源/目的MAC地址、L/T位、逻辑链路头和BPDU数据组成。
TCN BPDU的BPDU数据组成非常简单,只包含三部分信息:
协议类型:字段和配置BPDU相同
协议版本号:字段和配置BPDU相同
BPDU类型:字段的值为0x80,表示该BPDU为TCN BPDU。
TCN BPDU有两个产生条件:
1)网桥上有端口转变为Forwarding状态,且该网桥至少包含一个指定端口。
2)网桥上有端口从Forwarding状态或Learning状态转变为Blocking状态。
当上述两个条件之一满足时,说明网络拓扑发生了变化,网桥需要使用TCN BPDU通知根桥。根桥可以通过将配置BPDU中对应标志位置位来通知所有网桥网络拓扑发生了变化,需要使用较短的MAC地址老化时间,保证拓扑的快速收敛。
(3)BPDU的用途
两种BPDU各有各的用途。BPDU载荷被直接封装在以太网数据帧中,数据帧的目的MAC地址是组播MAC地址:0180-C200-0000。
1)配置BPDU是根桥发送给各个桥的报文;
2)TCN BPDU是当网络拓扑中的桥发现网络拓扑发生变化时,向根桥发送的报文。
3、BPDU两种报文类型详情
STP的BPDU有两种类型:
1)配置BPDU(Configuration BPDU)。用于构建、维护STP树。在STP的初始化过程中,每台交换机都会产生并发送配置 BPDU。在STP树形成后的稳定期,只有根桥才会周期性地发送配置BPDU;相应的,非根桥会从自己的根端口收到配置BPDU,并更新自己的配置BPDU,再从指定端口发送出去。这个过程看起来像根桥发出的配置BPDU逐跳的经过了其它交换机。
2)拓扑变化通知BPDU(Topology Change Notification BPDU)。简称TCN BPDU,告知根桥拓扑变化了。是非根桥通过根端口向根桥发送的。当非根桥检测到拓扑变化后,就会生成一个描述拓扑变化的TCN BPDU ,并从自己的根端口发送出去。
(1)配置BPDU
配置BPDU用于生成树计算,通常由根网桥以周期性间隔发出,包括STP参数,用于进行各种选举。
配置BPDU包含了桥ID、路径开销、端口ID、计时器等参数。STP协议通过在交换机之间传递配置BPDU来选举根交换机,以及确定每个交换机端口的角色和状态。
在初始化过程中,每个桥都主动发送配置BPDU。在网络拓扑稳定以后,只有根桥主动发送配置BPDU,其他交换机在收到上游传来的配置BPDU后,才会发送自己的配置BPDU。
配置BPDU是STP进行拓扑计算的关键。在交换网络的初始化过程中,每台交换机都从自己激活了STP的接口向外发送配置BPDU。
当STP收敛完成后,只有根桥才会周期性的发送配置BPDU(缺省时,以2s为周期发送配置BPDU,可以在设备的系统视图下使用stp timer hello命令修改发送周期),而非根桥则会在自己的根接口上收到上游发送过来的配置BPDU,并立即被触发而产生自己的配置BPDU,然后从自己的指定接口发送出去。
这一过程看起来就像是根桥发出的配置BPDU逐跳地“经过”了其他的交换机。
(2)拓扑变更通告(TCN BPDU)
拓扑变更通告(Topology Change Notification BPDU,TCN BPDU)用于通告网络拓扑的变化,这种BPDU是当交换机检测到拓扑发生变更时所产生TCN BPDU。
是指下游交换机感知到拓扑发生变化时向上游发送的拓扑变化通知。
TCN BPDU只在网络拓扑发生变更时才会被触发。
TCN BPDU的格式非常简单,只有“协议ID”、"协议版本ID"以及"BPDU类型"三个字段,并且“BPDU”字段的值为0x80。TCN BPDU用于在网络拓扑发成变化时向根桥通知变化的发生。
对于STP而言,当拓扑发生变更时,远离变更点的交换机无法直接感知到变化的发生,此时它们的MAC地址表项还是老旧的,如果依然通过这些MAC地址表项来指导数据转发,便有可能出现问题。
因此STP需要一种机制,用于在网络中发生拓扑变更时促使全网的交换机尽快老化自己的MAC地址表项,以适应新的网络拓扑。当拓扑稳定时,网路中只会出现配置BPDU,而当拓扑发生变更时,STP会使用TCN BPDU,以及两种特殊的配置BPDU。
TCN示例:
1.当拓扑发生变化时,交换机首先会发送一个TCN BPDU来通告根桥。
2.根桥会首先回复一个TCA,表明我已经收到了你发送的TCN通告。
3.ROOT根桥向全网泛洪TC=1的配置BPDU,持续35秒(20+15 maxage+forwarddelay)
4.交换机在收到TC=1的这35S内,所有的交换机的老化时间保持为15秒,直到收到tc=0的配置BPDU后,重新将mac老化时间修改为300。
- T点接口发生变更后,下游设备会不间断地向上游设备发送TCN BPDU报文直到根桥设备。
- 上游设备收到下游设备发来的TCN BPDU报文后,只有指定端口处理TCN BPDU报文。其它端口也有可能收到TCN BPDU报文,但不会处理。
- 上游设备会把配置BPDU报文中的Flags的TCA位置1,然后发送给下游设备,告知下游设备停止发送TCN BPDU报文。
- 上游设备复制一份TCN BPDU报文,向根桥方向发送。
- 重复步骤1、2、3、4,直到根桥收到TCN BPDU报文。
- 根桥把配置BPDU报文中Flags的TC位和TCA位同时置1后发送,TC位置1是为了通知下游设备直接删除MAC地址表项,TCA位置1是为了通知下游设备停止发送TCN BPDU报文。
说明:
- TCN BPDU报文主要用来向上游设备乃至根桥通知拓扑变化。
- 置位的TCA标记的配置BPDU报文主要是上游设备用来告知下游设备已经知道拓扑变化,通知下游设备停止发送TCN BPDU报文。
- 置位的TC标记的配置BPDU报文主要是上游设备用来告知下游设备拓扑发生变化,请下游设备直接删除MAC地址表项,从而达到快速收敛的目的。
在STP的计算过程中,BPDU的时间有三种:Hello Time、Max Age、Forward Delay。
(1)Hello Time( Hello 时间)
STP交换机发送配置BPDU的时间间隔,默认是2秒。如果要修改时间参数,那么必须在根桥上修改才有效。
用于设备检测链路是否存在故障。Hello时间控制了发送配置BPDU的时间间隔,默认2秒。这是根交换机生成BPDU并向非根交换机发送的间隔。
生成树协议每隔Hello Time时间会发送BPDU,以确认链路是否存在故障。如果设备在超时时间(超时时间=超时时间因子×3×Hello Time)内没有收到BPDU,则会由于消息超时而重新计算生成树。
非根交换机接收到根交换机发送来的BPDU,再从除接收端口以外的其他端口转发出去,如果在2-20秒里面由于网络故障没有新的BPDU从根交换机发送过来,非根交换机将停止向外发送从根交换机接收到的BPDU。
如果这种情况持续20秒,也就是最大存活期,非根交换机就使原储存的BPDU无效,并开始寻找新的根端口。
所谓最大存活期就是非根交换机丢弃BPDU前用来备份储存它的时间。
(2)Max Age(最大生存时间)
BPDU 的最大生存时间,也称为BPDU的老化时间,Max Age的值由根桥指定,默认值是20秒。如果端口在20秒内收到BPDU,最大生存时间会重新计时;如果端口一直没收到 BPDU ,那么BPDU将会老化,设备会重新在端口上选择最优BPDU,也就是重新进行根接口的选举。
用于判断BPDU在设备内的保存时间是否“过时”,设备会将过时的BPDU丢弃。缺省情况下Max Age时间为20秒。
在MSTP的CIST上,设备根据Max Age时间来确定端口收到的BPDU是否超时。如果端口收到的BPDU超时,则需要对该MSTI重新计算。Max Age时间对MSTP的MSTI无效。
STP每隔一个Hello Time发送一个BPDU,并且引入Keepalive机制。Hello包的发送可以避免最大失效定时器溢出。如果最大失效定时器溢出,通常表明有连接错误发生。此时,STP会进入Listening状态。STP要从连接错误中恢复过来,一般需要50秒的时间。其中BPDU最长的失效时间20秒;Listening状态持续15秒;Learning状态持续15秒。
3、转发延时是交换机在侦听状态到学习状态所花的时间,默认是15秒。
(3)Forward Delay(转发延迟)
接口从侦听状态进入学习状态,或从学习状态进入转发状态的延迟时间,默认值是15秒。避免在STP树的生成过程中可能出现的临时环路,或短暂的数据帧泛洪现象,分别在侦听和学习的端口状态各停留一个转发延迟时间。对于STP而言,一个阻塞端口选举为根接口或指定接口后,进入转发状态至少需要经历30秒的时间。
用于确定状态迁移的延迟时间。缺省情况下,Forward Delay时间为15秒。
链路故障会引发网络重新进行生成树的计算,生成树的结构将发生相应的变化。不过重新计算得到的新BPDU无法立刻传遍整个网络,如果新选出的根端口和指定端口立刻就开始数据转发的话,可能会造成暂时性的环路。
为此,生成树协议在端口由Blocking状态向Forwarding状态迁移的过程中设置了Listening和Learning状态作为过渡(Listening和Learning状态都会持续Forward Delay时间),并规定状态迁移需要等待Forward Delay时间,以保持与远端的设备状态切换同步。新选出的根端口和指定端口要经过2倍的Forward Delay延时后才能进入转发状态,这个延时保证了新的BPDU已经传遍整个网络。
为保证网络拓扑的快速收敛,需要配置合适的时间参数。上述三个时间参数之间应满足以下关系,否则会引起网络的频繁震荡:
2×(Forward Delay-1秒)≥Max Age
Max Age≥2×(Hello Time+1秒)
举例
交换机A 、B 、C 一起启动,各交换机的每个互联端口立即从禁用状态进入到阻塞状态。在阻塞状态的端口只能接收而不能发送BPDU,所以任何端口都收不到BPDU。在等待Max Age后,每台交换机都会认为自己是根桥,所有端口的角色都成为指定端口,并且端口的状态迁移为侦听状态。
交换机的端口进入到侦听状态后,开始发送自己产生的配置BPDU,同时也收到其它交换机发送的配置BPDU。
因为各个交换机发送BPDU的时间有一定的随机性,所以有可能交换机B和交换机C先选举根桥为交换机B,再收到交换机A的配置BPDU,最后选举出根桥为交换机A。因此,无论交换机开始的状态如何,也不管中间过程有多大差异,最终的结果总是确定且唯一的:桥ID最小的交换机会成为根桥。
端口在侦听状态持续Forward Delay的时间后,开始进入学习状态。由于交换机C的 G0/2 端口已经成为备用端口,所以状态也会变成阻塞状态。
各个端口(交换机 C 的 G0/2 端口除外)陆续进入学习状态后,会持续Forward Delay的时间。在这段时间里,交换机开始学习MAC地址和端口的映射关系,同时希望STP树在这个时间内能够完全收敛。
之后各个端口(交换机 C 的 G0/2 端口除外)相继进入转发状态,开始进行数据帧的转发。
由于时间参数的设计,一个STP接口从阻塞状态进入到转发状态,可能需要30~50秒的时间,这段时间内,网络无法正常使用。
整个华为数通学习笔记系列中,本人是以网络视频与网络文章的方式自学的,并按自己理解的方式总结了学习笔记,某些笔记段落中可能有部分文字或图片与网络中有雷同,并非抄袭。完处于学习态度,觉得这段文字更通俗易懂,融入了自己的学习笔记中。如有相关文字涉及到某个人的版权利益,可以直接联系我,我会把相关文字删除。【VX:czlingyun 暗号:CSDN】