STP生成树协议笔记之(三) : 协议报文的抓包解析
为了计算生成树,交换机之间需要交换相关的信息和参数,这些信息和参数被封装在BPDU(Bridge Protocol Data Unit)中。
BPDU的类型
BPDU有两种类型:配置BPDU和TCN BPDU。
配置BPDU描述本设备的配置信息,包含了桥ID、路径开销和端口ID等参数。STP协议通过在交换机之间传递配置BPDU来选举根交换机,以及确定每个交换机端口的角色和状态。在初始化过程中,每个桥都主动发送配置BPDU。在网络拓扑稳定以后,只有根桥主动发送配置BPDU,其他交换机在收到上游传来的配置BPDU后,才会发送自己的配置BPDU。
TCN BPDU是指下游交换机感知到拓扑发生变化时向上游发送的拓扑变化通知。
STP帧格式
字段内容 |
说明 |
Protocol Identifier |
协议ID=“0” |
Protocol Version Identifier |
协议版本标识符,STP为0,RSTP为2,MSTP为3。 |
BPDU Type |
BPDU类型,MSTP为0x02。 0x00:STP的Configuration BPDU 0x80:STP的TCN BPDU(Topology Change Notification BPDU) 0x02:RST BPDU(Rapid Spanning-Tree BPDU)或者MST BPDU(Multiple Spanning-Tree BPDU) |
Flags |
对于“标记域”(Flags),第一个bit(左边、高位bit)表示“TCA(拓扑改变响应)”,最后一个bit(右边、低位bit)表示“TC(拓扑改变)”。 |
Root Identifier |
根桥的桥ID。网桥ID都是8个字节——前两个字节是网桥优先级,后6个字节是网桥MAC地址。 |
Root Path Cost |
根路径开销,本端口累计到根桥的开销。 |
Bridge Identifier |
发送者的桥ID,本交换机的桥ID。 |
Port Identifier |
发送端口的PID,发送该BPDU的端口ID。 |
Message Age |
配置BPDU在网络中传播的生存期。 |
Max Age |
配置BPDU在设备中能够保存的最大生存期。 |
Hello Time |
配置BPDU发送的周期(发送两个相邻BPDU间的时间间隔)。 |
Forward Delay |
端口状态迁移的延时(控制Listening和Learning状态的持续时间)。 |
抓包分析BPDU数据包内容
实验的拓扑图如上。一开始,所有的交换机都会认为自己是根桥,自己的所有端口都是指定端口,参与转发配置BPDU报文。
图中红框内的是一些STP协议比较重要的时间参数:
Hello Time是指运行STP协议的设备发送配置BPDU的时间间隔,用于检测链路是否存在故障。交换机每隔Hello Time时间会向周围的交换机发送配置BPDU报文,以确认链路是否存在故障。当网络拓扑稳定后,该值只有在根桥上修改才有效。默认的Hello Time的值是2秒。
Message Age : 如果配置BPDU是根桥发出的,则Message Age为0。否则,Message Age是从根桥发送到当前桥接收到BPDU的总时间,包括传输延时等。实际实现中,配置BPDU报文每经过一个交换机,Message Age增加1。
Max Age:是指BPDU报文的老化时间,可在根桥上通过命令人为改动这个值。Max Age通过配置BPDU报文的传递,可以保证Max Age在整网中一致。非根桥设备收到配置BPDU报文后,会将报文中的Message Age和Max Age进行比较:如果Message Age小于等于Max Age,则该非根桥设备会继续转发配置BPDU报文。如果Message Age大于Max Age,则该配置BPDU报文将被老化掉。该非根桥设备将直接丢弃该配置BPDU,并认为是网络直径过大,导致了根桥连接失败。默认的Max Age值是20秒。
Forward Delay:当拓扑发生变化,新的配置消息要经过一定的时延才能传播到整个网络,这个时延称为Forward Delay,一般指从listening状态到learning状态,或是从leaning状态到Forwarding状态所需要的时间,协议默认的Forward Delay值是15秒。
(1)通过抓包点A(LSW4的G0/0/2端口)可知,此时LSW4默认认为自己是根桥,所以发送的BPDU中Root Identifier填写的是自己的桥ID,Root Path Cost(根路径开销)填的是0,Message Age中填的也是0。接着将这个BPDU发送给LSW2。其余的交换机也会重复这个操作。
(2)LSW2接收到LSW4的BPDU报文,查看报文中的Root Identifier字段,发现该报文优先级被他本身要高,所以将自己的BPDU报文中的Root Identifier字段从自身改为LSW4的桥ID,Message Time加一,同时计算根路径开销(端口开销默认为20000),再发给其他交换机。如图为抓包点B(LSW2的G0/0/12)的报文截图。
(3)等到所有的交换机都完成了选举,进入稳定的状态,则只会身为根桥的LSW4会每隔Hello Time时间发送配置一次配置BPDU,告知整个STP网络根桥正常运行。
如果拓扑发生了变化(如根桥故障,链路故障等),STP又是如何感知到且作出改变的呢?
STP拓扑发生变化时的处理方式
情况一:根桥故障
在稳定的STP拓扑里,非根桥会定期收到来自根桥的BPDU报文。如果根桥发生了故障,停止发送BPDU报文,下游交换机就无法收到来自根桥的BPDU报文。如果下游交换机一直收不到BPDU报文,Max Age定时器就会超时(Max Age的默认值为20秒,约为10次Hello Time默认值的时间),从而导致已经收到的BPDU报文失效,此时,非根交换机会互相发送配置BPDU报文,重新选举新的根桥。根桥故障会导致50秒左右的恢复时间,恢复时间约等于Max Age加上两倍的Forward Delay收敛时间。
需要:Max Age + 2*Forward Delay = 50 秒
验证:根桥已经重新选举为LSW1
情况二:直连链路故障
此例中,LSW1和LSW3使用了两条链路互连,其中一条是主用链路,另外一条是备份链路。生成树正常收敛之后,如果检测到LSW1的根端口(G0/0/15)链路发生物理故障,则其会按照STP协议规则重新选举根端口,则其Alternate端口(G0/0/8)会迁移到Listening、 Learning、Forwarding状态,经过2倍的Forward Delay后恢复到转发状态。
需要: 2*Forward Delay = 30 秒
验证:LSW1的根端口已重新选举为G0/0/8
情况三:非直连链路故障
如上图,根桥交换机LSW4与LSW3之间的链路发生了某种故障(非物理层故障),LSW3因此在Max Age时间内收不到来自LSW4的BPDU,则自己作为新的根桥开始发送BPDU。LSW2也会继续从原根桥LSW4接收BPDU报文,因此会忽略LSW3发送的BPDU报文。
由于LSW2的预备端口(Alternate)端口再也不能收到包含原根桥ID的BPDU报文。其Max Age定时器超时后,LSW2会切换Alternate端口为指定端口并且转发来自其根端口的BPDU报文给LSW3。LSW3在收到优先级比自己高的BPDU报文后,放弃宣称自己是根桥并开始收敛端口为根端口。非直连链路故障后,由于需要等待Max Age加上两倍的Forward Delay时间,端口需要大约50秒才能恢复到转发状态。
需要:Max Age + 2*Forward Delay = 50 秒
验证:我们对LSW3的G0/0/10端口进行抓包分析
时间节点一:根桥宣告为LSW4,BPDU是从LSW4发送过来的。根路径为LSW4-LSW3,则根路径开销为20000。
时间节点二:LSW3超时没有收到根桥的配置BPDU,所以宣告自己为根桥。
时间节点三:LSW3收到来自LSW2发来的配置BPDU,发现自己的桥ID优先级较低,重新选举自己的根端口和指定端口。
情况四:拓扑改变导致MAC地址表错误
在交换网络中,交换机依赖MAC地址表转发数据帧。缺省情况下,MAC地址表项的老化时间是300秒。如果生成树拓扑发生变化,交换机转发数据的路径也会随着发生改变,此时MAC地址表中未及时老化掉的表项会导致数据转发错误,因此在拓扑发生变化后需要及时更新MAC地址表项。
本例中,LSW6中的MAC地址表项定义了通过端口G0/0/3可以到达主机A,通过端口G0/0/2可以到达主机B。由于LSW7的根端口G0/0/2产生故障,导致生成树拓扑重新收敛,在生成树拓扑完成收敛之后,从主机A到主机B的帧仍然不能到达目的地。这是因为MAC地址表项老化时间是300秒,主机A发往主机B的帧到达LSW6后,LSW6会继续通过根端口G 0/0/1转发该数据帧。
拓扑变化过程中,根桥通过下游交换机的TCN BPDU报文获知生成树拓扑里发生了故障。根桥生成TC用来通知其他交换机加速老化现有的MAC地址表项。
拓扑变更以及MAC地址表项更新的具体过程如下:
1、LSW7感知到网络拓扑发生变化后,会不间断地向LSW6发送TCN BPDU报文。
2、LSW6收到LSW7发来的TCN BPDU报文后,会把配置BPDU报文中的Flags的TCA位设置1,然后发送给LSW7,告知LSW7停止发送TCN BPDU报文。
3、LSW6向根桥LSW5转发TCN BPDU报文。
4、LSW5把配置BPDU报文中的Flags的TC位设置为1后发送,通知下游设备把MAC地址表项的老化时间由默认的300秒修改为Forwarding Delay的时间(默认为15秒)。
5、最多等待15秒之后,LSW6中的错误映射关系会被自动清除。此后,LSW6就能通过G0/0/2端口把从主机A到主机B的帧正确地进行转发。
补充Tips:
关于BPDU的flags字段
Flags字段占8bits(位)的空间,其中有效位只有高位(最左边)和低位(最右边)的1bit。
TCN报文:Topology Change Notification报文,即拓扑改变通知报文,当设备A感知到STP拓扑发生了变化时,会向其他设备B发送TCN BPDU报文,代表:“我发现拓扑变化了,通知你一下”。
低位的叫TC(Topology Change),即“拓扑改变”位,常用于根桥通知下游交换机拓扑发生了改变。代表:“我们STP的拓扑改变了,请下游交换机刷新一下MAC地址表”
高位的叫TCA(Topology Change Acknowledge),即“拓扑改变响应”位,当设备B收到设备A发送过来的TCN BPDU报文,B知道拓扑发生了变化。然后B会:将此报文转发给根桥,然后生成一个TCA置为1的BPDU报文,回复给设备A,代表“我已确认收到你发的通知报文,你可以停止发了”。
利用实验来验证:如图所示抓包点为LSW7的指定端口G0/0/1口
Step 1:拓扑趋于稳定,此时LSW7会通过指定端口G0/0/1转发根桥的配置BPDU
BPDU flags: 0x00 =》 配置 BPDU
Step 2:此时,人工将LSW5和LSW7之间的链路删除,形成拓扑改变的现象。
LSW7感知到拓扑的变化,则发送TCN BPDU报文通知对端交换机LSW6。
BPDU flags:0x80 =》 TCN BPDU报文
Step 3 : LSW6收到TCN BPDU报文后,会回复一个响应报文(TCA=1)给LSW7,提示其已经收到了。
Step 4:LSW6继续向根桥转发TCN BPDU报文,根桥收到后,向下游交换机发送将TC=1的报文,提示他们将MAC地址表的老化时间改为15秒,起到加速收敛的作用。
Step 5:拓扑收敛后,网络重新稳定。
最后的STP简单配置会在下一节给出。
STP协议笔记汇总:
STP生成树协议笔记之(一) : 背景和原理
https://www.cnblogs.com/zylSec/p/14615481.html
STP生成树协议笔记之(二) : 端口角色选举STP
https://www.cnblogs.com/zylSec/p/14618328.html
STP生成树协议笔记之(三) : 协议报文的抓包解析
https://www.cnblogs.com/zylSec/p/14627690.html
STP生成树协议笔记之(四) : 协议基础配置
https://www.cnblogs.com/zylSec/p/14628274.html