> For the complete documentation index, see [llms.txt](https://juan-martin-franco.gitbook.io/network-+/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://juan-martin-franco.gitbook.io/network-+/5.-fundamentos-de-ethernet/5.4-spanning-tree-protocol-stp.md).

# 5.4 - Spanning Tree Protocol (STP)

## Spanning Tree Protocol (STP)

El protocolo <mark style="color:blue;">**Spanning Tree Protocol**</mark>, conocido como **STP**, es una función adicional de Ethernet realmente importante.

### Spanning Tree Protocol (802.1d)

El protocolo STP, cuyo estándar es 802.1d, **nos permite tener enlaces redundantes entre switches previniendo loops** en nuestro tráfico de red.

Es importante tener enlaces redundantes ya que nos ayudan a lograr la famosa disponibilidad del 99,999% que deseamos.

En el siguiente ejemplo, se puede ver como funciona una red con enlaces redundantes sin el protocolo STP activado:

<figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2F6mrPqcRqBPoBodlvnv4K%2Fimage.png?alt=media&amp;token=9dc1677a-58fc-413c-9615-3ebad88e0508" alt=""><figcaption></figcaption></figure>

En este ejemplo, las tablas de direcciones MAC internas de los Switches pueden corromperse.

Por ejemplo, si la pc PC2 intenta enviarle una trama la pc PC1, se puede ver que hay una red redundante, ya que la trama puede ir:

* Desde el Switch 4 hacia el Switch 2 y luego hacia el Switch 1
* Desde el Switch 4 hacia el Switch 3 y luego hacia el Switch 1

y luego llegar a la pc PC1, lo cual es bueno ya que la redundancia es beneficiosa, sobre todo cuando se habla en términos de disponibilidad.

Si bien la redundancia es buena, si recordamos como funcionan las tablas internas de los switches, las cuales almacenan puertos y direcciones MAC, sabemos que pueden ocurrir problemas.

Cuando la trama enviada por PC2 llega al Switch 4, aprenderá la dirección MAC de PC2 y el puerto por donde llegó la trama.

### Broadcast Storm (Tormenta de Broadcast)

Una tormenta de broadcast sucede cuando se genera un loop en nuestra red y tenemos deshabilitado el protocolo STP.

Este loop conocido como tormenta de broadcast, se genera cuando un frame es recibido por más de un switch y estos se reenvían dicha trama entre ellos por medio de los enlaces redundantes, y las tramas siguen moviéndose "en círculos".

<figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FHj6cbImwVkoTaHIF4o94%2Fimage.png?alt=media&amp;token=610a7251-12f7-4a02-83c0-6bcd04adbeb8" alt=""><figcaption></figcaption></figure>

Cuando se generan este tipo de loops, es cuestión de tiempo para que las copias de los frames consuman el total del ancho de banda y la red quede inutilizable.

Una forma de solucionar esto, sin el uso del protocolo STP, es desconectar uno de los enlaces involucrados en el loop y esperar unos 30 segundos a que todo el tráfico se olvide y se pierda, y luego volver a conectarlo, aunque esto no es recomendable, ya que la forma de solucionar esto es utilizando STP.

### Funcionamiento del protocolo Spanning Tree Protocol (STP)

El protocolo STP funciona definiendo a los Switches (o Bridges) en dos roles conocidos como:

* <mark style="color:blue;">**Root Bridge (Nodo Raíz)**</mark>: El **Root Bridge es el Switch elegido como punto de referencia** para todo el árbol de expansión.\
  El switch seleccionado es aquel que tenga menor Bridge ID (BID) y será designado como Root Bridge. Para que todos los Switches estén de acuerdo, intercambian **mensajes BPDU** para poder conocer el BID y así comparar con el propio.
* <mark style="color:red;">**Non-root Bridge**</mark>: Un Non-Root Bridge, es cualquiera de los Switches que no fueron elegidos como Root Bridge. Es decir, una vez que se seleccionó el Root Bridge, los demás pasan a ser Non-Root Bridge.

Los puertos, además de tener roles (Root, Designated, etc.) tienen estados:

* <mark style="color:purple;">**Forwarding**</mark>: Estado normal, se reenvían tramas por este puerto. También se procesan BPDUs.
* <mark style="color:blue;">**Learning**</mark>: El puerto envía y recibe BPDUs, porque se está configurando la topología del protocolo STP. En este estado se aprenden direcciones MAC con las que se construyen las tablas.
* <mark style="color:green;">**Listening**</mark>: El puerto escucha BPDUs para asegurarse que no hay otra ruta mejor hacía el Root Bridge antes de comenzar a enviar.&#x20;
* <mark style="color:red;">**Blocking**</mark>: El puerto está bloqueado, puede recibir BPDUs, pero no envía ni recibe tramas de datos. Este estado es habitual encontrarlo una vez que la red ha convergido.

Los estados de los puertos transicionan de la siguiente manera:&#x20;

<figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FC5AaTzbpTzfdDCuGixpc%2Fimage.png?alt=media&amp;token=b2448818-bc79-423b-9627-cbc4e599afa9" alt=""><figcaption></figcaption></figure>

### Algoritmo de Spanning Tree Protocol (STP - IEEE 802.1d)

Dada la siguiente topología, la cual contiene enlaces redundantes, lo que genera loops:

&#x20;

<figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2F7EWm3SgrWn38yd1zsfpp%2Fimage.png?alt=media&amp;token=1e77e84a-769f-4625-8d17-d45656fd633e" alt=""><figcaption></figcaption></figure>

El protocolo STP crea una **topología lógica libre de loops** realizando los siguientes pasos:

1. Primero, <mark style="color:blue;">**se selecciona el Root Bridge**</mark>.\
   La elección del root bridge se basa en el <mark style="color:green;">**Bridge ID (8 Bytes)**</mark> de cada Switch, el cual está formado por la combinación de dos partes:&#x20;

   * <mark style="color:green;">**El campo de prioridad (2 Bytes)**</mark>
   * <mark style="color:green;">**La dirección MAC (6 Bytes)**</mark>

   Todos los Switches interconectados intercambian sus Bridge ID entre si, enviándose BPDUs (Bridge Protocol Data Unit), y **quien tenga el valor menor en el campo de prioridad será elegido como Root Bridge**. **En caso de empate en el campo de prioridad, se elegirá aquel que tenga menor dirección MAC**.\
   En este caso, se selecciona el Switch A como Root Bridge, ya que todos tienen la misma prioridad, y la menor MAC Address es la de dicho Switch.<br>

   <figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FpeWytXhNrkRvdrL3Gznq%2Fimage.png?alt=media&amp;token=82caea5c-84f3-43f1-9396-a621e84e4c42" alt=""><figcaption></figcaption></figure>
2. Una vez elegido el Root Bridge, <mark style="color:blue;">**los otros Switches seleccionan el camino con menor costo para llegar al Root Bridge**</mark>. Este costo es calculado por el ancho de banda del enlace, a mayor ancho de banda, menor costo.\
   \
   Suponiendo que los costos son los de la siguiente imagen:

   <figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FPM8pBiGwzVLqMvaKIppC%2Fimage.png?alt=media&amp;token=1f44d3e6-73bc-4068-8cfb-0aefeb25f5ae" alt=""><figcaption></figcaption></figure>

   <mark style="color:red;">**Switch B**</mark>: El Switch B tiene dos formas de llegar al Root Bridge. Ir directamente hacia él (BA - Costo: 2) o siguiendo el camino alterno (BDCA - Costo: 7). \
   Entonces, **se elige el camino BA como camino para llegar desde el Switch B hacia el Root Bridge A**.\
   El Puerto del Switch B que me permite llegar hacia el Root Bridge es designado como <mark style="color:green;">**Root Port**</mark>, mientras que el otro extremo es designado como <mark style="color:orange;">**Designated Port**</mark>.<br>

   <figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2Fz1TJUFXf7d8JMi8IRiCT%2Fimage.png?alt=media&amp;token=3ddccdcc-de69-4c57-bbab-dcc0e351e82d" alt=""><figcaption></figcaption></figure>

   <mark style="color:red;">**Switch C**</mark>: El Switch C tiene dos formas de llegar al Root Bridge. Ir directamente hacia él (CA - Costo: 1) o siguiendo el camino alterno (CDBA - Costo: 8). \
   Entonces, **se elige el camino CA como camino para llegar desde el Switch C hacia el Root Bridge A**.\
   El Puerto del Switch C que me permite llegar hacia el Root Bridge es designado como <mark style="color:green;">**Root Port**</mark>, mientras que el otro extremo es designado como <mark style="color:orange;">**Designated Port**</mark>.<br>

   <figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FhoobWjDj3MXWjtVQgSpp%2Fimage.png?alt=media&amp;token=2b1b52b2-15df-4aec-8507-5b7653919093" alt=""><figcaption></figcaption></figure>

   <mark style="color:red;">**Switch D**</mark>: El Switch D tiene dos formas de llegar al Root Bridge. Ir por el camino de la izquierda (DBA - Costo: 4) o por el camino de la derecha (DCA - Costo: 5).\
   Entonces, **se elige el camino DBA como camino para llegar desde el Switch D hacia el Root Bridge A**.\
   El Puerto del Switch D que me permite llegar hacia el Root Bridge es designado como <mark style="color:green;">**Root Port**</mark>, mientras que el otro extremo es designado como <mark style="color:orange;">**Designated Port**</mark>.<br>

   <figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FbWOqfp1qdbMOiRz8dmqj%2Fimage.png?alt=media&amp;token=a83c306b-000d-4392-ab16-79cc1a9bb7f1" alt=""><figcaption></figcaption></figure>

   <mark style="color:purple;">**Un Bridge No Root (Nodo no raíz) puede tener muchos puertos designados, pero solo un Root Port.**</mark>\ <mark style="color:green;">**Todos los puertos del Root Bridge son puertos designados. En el Root Bridge, no hay Root Ports.**</mark><br>
3. Una vez que cada Switch encuentra el mejor camino para alcanzar el Root Bridge, <mark style="color:blue;">**se bloquea el enlace que no fue seleccionado como mejor camino para llegar al root bridge.**</mark>\
   En este caso, es el enlace que une los Switches C y D:<br>

   <figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2FAd6EWYabykPG2PJErrIG%2Fimage.png?alt=media&amp;token=aed00503-0636-4856-85d5-d1496086c98d" alt=""><figcaption></figcaption></figure>

   <mark style="color:red;">**Cuando se bloquea un enlace, uno de los dos extremos tiene que designarse como Puerto designado, mientras que el otro tiene que designarse como Puerto bloqueado.**</mark> \
   Esta decisión se toma de la siguiente manera:\
   **El puerto con el menor Switch ID es seleccionado como puerto designado, mientras que el otro extremo es seleccionado como puerto bloqueado.**<br>

   <figure><img src="https://1668154188-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKyoEXmY0jfChHS8PdGMX%2Fuploads%2Fd4FFuZciBKR91eB0j6A6%2Fimage.png?alt=media&amp;token=e307b2f0-b364-4fed-a41d-2fdca0f1d092" alt=""><figcaption></figcaption></figure>

   Los puertos bloqueados pueden seguir recibiendo tramas, pero no reenvían ni envían tramas, simplemente las descartan.
