For an intro to 802.1D Spanning-Tree, checkout [CertBros Explanation](https://www.youtube.com/watch?v=japdEY1UKe4&t=218s) for an excellent conceptual start. > Remember, like most Layer 2 protocols, **LOWER** values are better! Keep in mind that 802.1D Spanning-Tree is only ever implemented on modern network switches using PVST+. This enhancements allows a spanning-tree instance to run per VLAN. This means that each VLAN has its own spanning-tree process and topology-- but devices can only handle up to 128 instances. Most of this document is focused on PVST+ spanning-tree operation, with a section for Rapid-PVST+ for rapid spanning-tree operations at the end. A separate document will be made for [[Multiple Spanning-Tree (MST)]]. ### BPDUs and Costs BPDUs are special Layer 2 messages forwarded by switches downstream to share STP information. These messages are used to: - Elect the **Root Bridge** - Determine the **best path** to the Root - Prevent **loops** by defining port roles There are two main types: | Type | Description | | -------------------------------------- | --------------------------------------------------- | | **Configuration** | Used in standard STP for root election and updates. | | **Topology Change Notification (TCN)** | Alerts the network of a topology change. | The "best path" is what is called a Path Cost, or a **Root Cost**. 1. Each switch **adds its the receiving ports cost** to the cost received in a BPDU. 1. For example, if a non-root switch receives a BPDU from the root bridge with a cost of 0, it will then look at the received interfaces bandwidth, and add that equivalency value to the root cost when forwarding it downstream. 2. It then **forwards** the BPDU with the **updated root cost** to other switches. 3. Each switch uses this info to: - Choose the **Root Port** (best path to Root Bridge) - Elect **Designated Ports** on each segment **Port Cost** is a numerical value assigned to each interface based on its **bandwidth**, used by STP to select the *lowest-cost path to the Root Bridge*. There are **two path cost calculation methods**: | Link Bandwidth | (Short) Cost | (Long) Cost | | -------------- | ------------ | ----------- | | 10 Mbps | 100 | 2,000,000 | | 100 Mbps | 19 | 200,000 | | 1 Gbps | 4 | 20,000 | | 10 Gbps | 2 | 2,000 | | 100 Gbps | N/A | 200 | | 1 Tbps | N/A | 20 | ### Configuring Costs Use the following configuration to use the Long port costs: ``` spanning-tree pathcost method long ``` Use the following configuration to custom configure a port cost for an interface: ``` spanning-tree cost <1-200000000> spanning-tree vlan 1 cost <1-200000000> ``` **Note**: if you do not specify which VLAN, it will apply to all VLANs on that interface. ## Root Bridge Election Devices running STP will first negotiate and determine who the Root Bridge is in the network. To do this, they perform the following steps: 1. **All switches assume they are the Root Bridge** initially. Each switch sends out BPDUs containing its own **Bridge ID** (`Bridge Priority (default is 32768) + VLAN ID + ":" + MAC Address`). 2. As switches receive BPDUs from other switches, they compare them to their **current best-known BPDU** (themselves if first received). If a switch receives a superior BPDU (one with a lower Bridge ID), it stops claiming to be root and **forwards that superior BPDU** instead. *Note that when forwarding it alters values like root costs etc.* 3. Eventually, all switches agree on the same root bridge, the switch with the **lowest Bridge ID**. For example, in the following topology, SW2 has the **lowest MAC address**, which is appended to the Bridge Priority, so it becomes the **Root Bridge**. | Switch | Priority | MAC Address | Bridge ID | | ------ | -------- | ----------------- | ---------------------------- | | SW1 | 32768 | 00:11:22:33:44:03 | 32768.00:11:22:33:44:03 | | SW2 | 32768 | 00:11:22:33:44:01 | 32768.00:11:22:33:44:01 ← 🏆 | | SW3 | 32768 | 00:11:22:33:44:02 | 32768.00:11:22:33:44:02 | ### Configuring the Root Bridge Spanning-tree priority values can only be configured in **increments of 4096**. Making its configurable range to be `0-61440`. ``` (config)#spanning-tree vlan 1 priority ? % Bridge Priority must be in increments of 4096. % Allowed values are: 0 4096 8192 12288 16384 20480 24576 28672 32768 36864 40960 45056 49152 53248 57344 61440 ``` There are three ways to configure a devices spanning-tree priority: ``` (config)# spanning-tree vlan 1 priority 4096 (config)# spanning-tree vlan 1 root primary (config)# spanning-tree vlan 1 root secondary ``` The command that uses `root primary` will take the current **known Root Bridge's priority**, and set its *own* priority to TWO intervals less than, so: `mypriority - 8192`. The command that uses `root secondary` will take the current **known Root Bridge's priority**, and set its *own* priority to ONE intervals less than, so: `mypiority - 4096`. ## Port Elections All ports on the **Root Bridge** are **Designated** ports (forwarding state). Each remaining switch will select ONE of its interfaces to be its **Root Port** (forwarding state). ### Selection: Root Ports The **Root Port Selection** process is as follows: 1. Lowest **Root Cost** - *BUT* what if they have the same *Root Cost*? 2. Lowest neighbor **Bridge ID** - *BUT* what if they have the the *Bridge ID* (two ports to the same switch)? 3. Lowest neighbor **Port ID** - The Port ID is a value assigned to all ports, with a numerical value per port as the decimal: `Port Priority (128) + "." + Port Number`. ### Selection: Blocking Ports Each remaining collision domain will select ONE interface to be a **Designated Port** (forwarding state). The other port in the collision domain will be Blocking (**non-designated). The **Blocking Selection** process is as follows: 1. **LOCAL** interface with **lowest Root Cost** - becomes **Designated** and the neighbor **Blocks**. - *BUT* what if its a tie? 2. **LOCAL** switch with the **lowest Bridge ID** - becomes **Designated** and the neighbor **Blocks**. Below is an excellent example of this election process from [Jeremy's IT Lab - Part 1](https://www.youtube.com/watch?v=j-bK-EFt9cY&t=699s) (30 minutes in). ![[JeremySTP-P1.png]] ## Understanding Timers The general flow of an 802.1D STP environment in terms of timers is as follows: 1. **Failure Occurs** 2. **Max Age (20s)** — Wait to detect failure. 3. **Forward Delay (15s)** — Listening... 4. **Forward Delay (15s)** — Learning... 5. **Port becomes Forwarding** | Timer | Default | Used By | | ------------- | ---------- | -------------------- | | Hello | 2 seconds | Root Bridge | | Forward Delay | 15 seconds | All Bridges | | Max Age | 20 seconds | All Non-Root Bridges | ``` ! STP & RSTP (config)# spanning-tree vlan 1 hello-time <1-10> (config)# spanning-tree vlan 1 max-age <6-40> (config)# spanning-tree vlan 1 forward-time <4-30> ! RSTP (config)# spanning-tree mode rapid-pvst (config)# interface Ethernet1/1 (config-if)# spanning-tree link-type point-to-point ``` ## Resources [CertBros Explanation](https://www.youtube.com/watch?v=japdEY1UKe4&t=218s) [CBT Micro-Nugget](https://www.youtube.com/watch?v=mxCPdB7aWtY) [Jeremy's IT Lab - Part 1](https://www.youtube.com/watch?v=j-bK-EFt9cY&t=699s) [Jeremy's IT Lab - Part 2](https://www.youtube.com/watch?v=nWpldCc8msY&t=2280s) [Jeremy's IT Lab - Algorithm](https://www.youtube.com/watch?v=FcrTb43AkhI) [Jeremy's IT Lab - Analyzing](https://www.youtube.com/watch?v=Ev9gy7B5hx0&t=17s) [CBT Nuggets - CCIE L2](https://learn.adept.at/cbtnuggets/layer-2-ccie-training-vlan-etherchannel-stp-tutorial) [Cisco Press STP Whitepaper](https://www.ciscopress.com/articles/article.asp?p=2832407&seqNum=4) [INE Course - Switched Campus](https://my.ine.com/Networking/courses/3473abc7/switched-campus) [Kevin Wallace - Deep Dive](https://www.youtube.com/watch?v=XoLPGH4awKc)