Introduction
This post explains flow of BPDU and TCN behaviour of full converged STP
Design
S1 is a root bridge, all switches run PVST+.

BPDU flow
Once STP is fully converged, only root bridge sends BPDUs, S2 and S3 switches forward the BPDUs out of their designated ports.

S1#debug spanning-tree bpdu transmit Spanning Tree BPDU Transmitted debugging is on S1# *Mar 14 18:22:21.732: STP: VLAN0001 Et0/0 tx BPDU: config protocol=ieee Data : 0000 00 00 00 8001AABBCC001000 00000000 8001AABBCC001000 8001 0000 1400 0200 0F00 *Mar 14 18:22:21.732: STP: VLAN0001 Et0/1 tx BPDU: config protocol=ieee Data : 0000 00 00 00 8001AABBCC001000 00000000 8001AABBCC001000 8002 0000 1400 0200 0F00
TCN flow
Let’s generate the topology change notofication by shutting down eth0/0 on S3.
S3(config)#int ethernet 0/0 S3(config-if)#sh S3(config-if)# *Mar 14 18:24:02.893: STP: VLAN0001 new root port Et0/1, cost 200 *Mar 14 18:24:02.893: STP: VLAN0001 Et0/1 -> listening *Mar 14 18:24:02.893: STP[1]: Generating TC trap for port Ethernet0/0 S3(config-if)# *Mar 14 18:24:04.897: %LINK-5-CHANGED: Interface Ethernet0/0, changed state to administratively down S3(config-if)# *Mar 14 18:24:04.897: STP: VLAN0001 sent Topology Change Notice on Et0/1 *Mar 14 18:24:05.901: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to down S3(config-if)# *Mar 14 18:24:17.893: STP: VLAN0001 Et0/1 -> learning S3(config-if)# S3(config-if)# S3(config-if)# S3(config-if)# S3(config-if)# *Mar 14 18:24:32.893: STP[1]: Generating TC trap for port Ethernet0/1 *Mar 14 18:24:32.893: STP: VLAN0001 sent Topology Change Notice on Et0/1 *Mar 14 18:24:32.893: STP: VLAN0001 Et0/1 -> forwarding

Two TCN traps are generated, eth0/1 becomes a root bridge but it goes through normal STP changes (no Uplnik fast feature), once TCN are received, switches flush their CAM tables.