组网如上图,下面探究PVST模式下BPDU报文交互的注意事项。
问题描述
我们知道,当生成树为STP、RSTP、MSTP时,发出的BPDU报文都是不带vlan tag的,且接收后无视端口类型(access、trunk、hybrid)和放通的vlan,直接上CPU处理,最终的STP状态如下:
但是在PVST模式下,BPDU报文的收发就完全不同了。
过程分析
现在修改生成树类型为PVST,在两台设备上有vlan1、2,且SW1为vlan1和2的根桥。
1. 互联端口全为access口时,并全属于vlan1,最终的STP状态和抓包情况如下。和情况1相比,stp状态第一列从可以实例ID变为VLAN ID,且仅能看到VLAN1的stp状态。从抓包结果看,在SW2的g1/0/1口未成为根端口之前,双方都收发了标准的RSTP BPDU报文,不带vlan tag,目的mac为0180-c200-0000。
2. 如果将SW1和SW2互联口的所属vlan均改为vlan2,STP状态仅能看到vlan2。抓包结果如下,这时仍然发送RSTP的BPDU,不带vlan tag。
3. 将SW1侧端口所属vlan改为1,SW2侧端口所属vlan改为2。在SW1侧STP状态显示vlan1,SW2侧显示vlan2。抓包结果和情况3类似。
4. 如果在情况3的基础上,在SW2再创建vlan3,且端口所属改为vlan3,但是SW1上不创建vlan3,最终的状态如下。
从情况1-4的结果可以看到,当互联口为access口时,PVST发出的BPDU报文都是标准的RSTP格式,即使两端放通的vlan不一致,仍能正常收发BPDU报文。这时如果对端设备不是PVST模式,一样可以互通,完成BPDU交互(和MSTP对接时,仅实例0之间有BPDU交互)。但是如果两端所属vlan不同,业务根本不通,其实没有意义。
5. 现在将SW1和SW2的互联端口改为trunk口,放通vlan1、2,pvid都是1。STP状态如下,能够同时显示vlan1和2的STP状态。抓包结果如下,SW1作为根桥每次向外发送3个BPDU报文,第一个为标准的RSTP BPDU,第二个为PVST格式的BPDU,目的MAC为0100-0ccc-cccd,不带vlan tag(即vlan 1的PVST BPDU,因为端口pvid为1去标签发出,但生成树协议中会携带origin vlan属性使对端可以识别),第三个为PVST格式的BPDU,目的MAC为0100-0ccc-cccd,带vlan tag 2。当SW2接收到SW1发的不带tag的PVST BPDU后,打上本端的pvid 1,并计算。SW2接收到SW1发的带tag 2的BPDU后,不改变vlan tag 2,并计算。
6. 接下来看一下为何会发送RSTP BPDU。SW1侧端口不放通所有vlan,最终的状态如下,抓包发现SW1未往外发送任何BPDU。
SW1放通vlan1,抓包结果如下,SW1会向SW2发送RSTP BPDU和不带tag的PVST BPDU。
SW1不放通vlan1,放通vlan2,结果如下,这时SW1仅向SW2发送了带vlan tag 2的PVST BPDU。
修改SW1和SW2的pvid为2,SW1仅允许vlan 1。SW1向SW2发送了RSTP BPDU和带vlan tag 1的PVST BPDU。
SW1不允许vlan1允许vlan2,SW1仅向SW2发送了不带tag的PVST BPDU,SW2则向SW1发送RSTP BPDU。SW2侧也不允许vlan1后,双方都不发送RSTP BPDU。
从情况6可以看到,当trunk链路放通了vlan1后就会向外发送RSTP BPDU,与PVID的设置无关,在PVST中这是作为vlan1的BPDU报文进行处理的。此外,所有trunk放通的vlan都会发送PVST BPDU,仅和PVID值相同的VLAN发出的PVST BPDU不带tag,其余均带tag,这个时候的BPDU收发需要和普通报文一样进行去标打标签操作。
7. 将SW1侧改为仅允许vlan1通过,STP状态如下。抓包结果可以发现,SW1作为根桥,会一直每次往外发送2个BPDU报文,一个为标准RSTP格式的,另一个为PVST格式的,不带vlan tag。而SW2侧端口未成为根端口时则每次会向外发送3个BPDU报文,第一个为标准的RSTP BPDU,第二个为PVST格式的BPDU,不带vlan tag,第三个为PVST格式的BPDU,带vlan tag 2。当SW2侧端口成为根端口后,每次只发送一个BPDU报文,为PVST格式,带vlan tag 2。这是因为,端口不放通vlan2,SW1不会向SW2发PVST BPDU,SW2就一直认为自己是vlan2的根桥往SW1发PVST BPDU。
8. SW1重新允许vlan2通过,修改pvid值为2,并在两台设备上同时创建vlan3,允许通过。这时有端口pvid不连续告警,且两台设备上VLAN1和VLAN2的状态都为discarding。查看抓包结果,当状态稳定后,SW1除了发送带vlan tag 3的PVST BPDU外,还发送了标准的RSTP BPDU、不带tag的PVST BPDU、带vlan tag 1的PVST BPDU。而SW2发送了标准的RSTP BPDU、不带tag的PVST BPDU、带vlan tag 2的PVST BPDU。在当链路相连的两端PVID不一致时,PVST的计算可能出现错误,为了防止这样的错误,系统默认会开启PVID不一致保护功能,即做PVID不一致的检查。若端口PVID不一致保护功能触发后,端口在PVID不一致的VLAN中,会变为阻塞状态。
[SW1]%Dec 12 10:40:15:682 2020 SW1 STP/4/STP_PVID_INCONSISTENCY: Port GigabitEthernet1/0/1 with PVID 2 received PVST BPDUs from a port with PVID 1.
[SW2]%Dec 12 10:54:20:882 2020 SW2 STP/4/STP_PVID_INCONSISTENCY: Port GigabitEthernet1/0/1 with PVID 1 received PVST BPDUs from a port with PVID 2.
从上面可以看到,当两端的PVID不同时,会触发不连续PVID保护,导致端口discard。最后看一下access和trunk对接的情况。
9. SW1侧口改为access,属于vlan1,SW2侧trunk,pvid为1,允许所有vlan。有如下告警,且最终的状态SW1被discard了,但SW2侧vlan1显示为根端口。这里说明SW2收到了SW1 access口发送的RSTP BPDU消息,对于trunk口RSTP BPDU会影响VLAN 1的stp计算。而由于SW2侧允许vlan1通过且pvid为1,就会往外发送不带tag的PVST BPDU,导致SW1触发此不连续端口保护。
[SW1]%Dec 12 13:02:50:684 2020 SW1 STP/4/STP_PORT_TYPE_INCONSISTENCY: Access port GigabitEthernet1/0/1 in VLAN 1 received PVST BPDUs from a trunk or hybrid port.
10. 在9的基础上,SW2侧不允许vlan1通过,那么SW2就不会向SW1发送PVST BPDU了。从而不会产生阻塞。
[SW1]%Dec 12 13:08:56:846 2020 SW1 STP/6/STP_CONSISTENCY_RESTORATION: Consistency restored on VLAN 1's port GigabitEthernet1/0/1.
解决方法
1、 当设备运行STP、RSTP、MSTP时,发出的BPDU报文都是不带vlan tag的,对端开启STP后则能接受并上CPU处理,此时报文交互与端口类型(access、trunk、hybrid)和有无放通vlan无关;
2、 当设备运行PVST时,发出的Pvst的BPDU报文有两种,此时报文交互与端口类型(access、trunk、hybrid)和有无放通vlan有关:
l 对于Access端口,PVST将发送RSTP格式的BPDU。目的MAC也是标准BPDU报文的MAC:0180-c200-0000,此类型的报文是untag形式的。即使两端放通的vlan不一致,仍能正常收发BPDU报文。这时如果对端设备不是PVST模式,一样可以互通,完成BPDU交互(和MSTP对接时,仅实例0之间有BPDU交互)。
l 对于Trunk端口(Hybrid口类似),PVST将会发送两种BPDU。一种是RSTP BPDU,仅当端口放通了vlan 1时才会发出,是untag的;另一种是思科私有的Pvst BPDU报文,目的MAC为0100-0ccc-cccd,此类型的报文是per-vlan的,Trunk端口上允许多少个vlan通过,就会发多少个这样的报文,并且除了缺省vlan的是untag外,其余vlan的均为带Tag的,此外都会携带origin vlan属性。