# RSTP

## 1. RSTP <a href="#ariaid-title1" id="ariaid-title1"></a>

![Схема сети](https://1953625668-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MFMJhMiVjTLWfbfC-S4%2F-MXXIxR9YuZL05zoZR5Z%2F-MXXK2pWAZdHzoTDovvH%2F%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png?alt=media\&token=927eb6bb-fc18-4cd7-9521-9727d443b57b)

RSTP настраивается очень просто. Под edit protocols rstp прописываются интерфейсы и указывается Bridge Priority:

{% code title="Sun" %}
```
interfaces {
    xe-0/0/0 {
        native-vlan-id 4000;
        unit 0 {
            family ethernet-switching {
                interface-mode trunk;
                vlan {
                    members all;
                }
            }
        }
    }
    xe-0/0/1 {
        native-vlan-id 4000;
        unit 0 {
            family ethernet-switching {
                interface-mode trunk;
                vlan {
                    members all;
                }
            }
        }
    }
    em1 {
        unit 0 {
            family inet {
                address 169.254.0.2/24;
            }
        }
    }
}
protocols {
    rstp {
        bridge-priority 0;
        interface xe-0/0/0;
        interface xe-0/0/1;
    }
}
vlans {
    mgmt {
        description native;
        vlan-id 4000;
    }
}
```
{% endcode %}

Единственное, что стоит пояснить - это факт создания Native-VLAN - в QFX без него трафик просто не будет идти. При этом для RSTP необходимо, чтобы порты, которые мы указали для работы протокола, были в Family - Ethernet-Switching, а также необходимо, чтобы был указан Port-Mode (Trunk/Access). В целом, примерно этот конфиг достаточно развернуть, чтобы увидеть как работает STP. Теперь посмотрим на состояние STP:

```
root@Earth# run show spanning-tree bridge detail
STP bridge parameters
Routing instance name               : GLOBAL
Context ID                          : 0
Enabled protocol                    : RSTP
  Root ID                           : 0.02:05:86:71:08:02
  Root cost                         : 2000
  Root port                         : xe-0/0/1
  Hello time                        : 2 seconds
  Maximum age                       : 20 seconds
  Forward delay                     : 15 seconds
  Message age                       : 1
  Number of topology changes        : 1
  Time since last topology change   : 33 seconds
  Local parameters
    Bridge ID                       : 12288.02:05:86:71:ab:02
    Extended system ID              : 0
    Hello time                      : 2 seconds
    Maximum age                     : 20 seconds
    Forward delay                   : 15 seconds
    Path cost method                : 32 bit
```

Тут видно, что Root-Bridge - это Sun (Root ID состоит из Priority.MAC, приоритет 0 у Sun). Теперь найдём порт, который сейчас отключен для того, чтобы избежать петли:

```
root@Jupiter# run show spanning-tree interface

Spanning tree interface parameters for instance 0

Interface                  Port ID    Designated         Designated         Port    State  Role
                                       port ID           bridge ID          Cost
xe-0/0/0                   128:490      128:490  12288.02058671ab02         2000    BLK    ALT
xe-0/0/1                   128:491      128:491   8192.02058671b902         2000    FWD    ROOT
```

Т.е. тут видно, что решающую роль играет Highest Root Path Cost, а затем Highest Bridge ID соседа.

{% hint style="info" %}
Если и Bridge ID соседа, получаемый на двух портах коммутатора, равны (т.е. два кабеля уходят к одному коммутатору, но они не включены в LAG), то блокируется порт в сторону соседского порта с большим Port ID (Состоит из приоритета порта и его порядкового номера).&#x20;
{% endhint %}

### 1.1. MVRP

Выше представлена схема сети, для которой будет развёрнут RSTP (В VSTP MVRP не работает). MVRP необходим для того, чтобы не настраивать VLAN'ы на всех устройствах. Т.е. когда включен этот протокол и мы добавляем, удаляем или изменяем влан на одном коммутаторе, такая же настройка появляется на остальных (анлог VTP в Cisco).

Тут просто включаем транковые порты, которые включены в RSTP:

```
root@Sun# show | compare
[edit protocols]
+   mvrp {
+       interface xe-0/0/0;
+       interface xe-0/0/1;
+   }
```

Добавляем VLANы на коммутаторе Sun:

```
root@Sun# show | compare
[edit vlans]
+   v100 {
+       vlan-id 100;
+   }
+   v200 {
+       vlan-id 200;
+   }
+   v300 {
+       vlan-id 300;
+   }
+   v400 {
+       vlan-id 400;
+   }
+   v500 {
+       vlan-id 500;
+   }
+   v600 {
+       vlan-id 600;
+   }
```

Коммитим и видим, что в конфигурациях других коммутаторов ничего не добавилось. Однако, если посмотреть VLAN's при помощи show, то увидим:

```
root@Earth# run show vlans

Routing instance        VLAN name             Tag          Interfaces
default-switch          __dynamic_vlan-0100__ 100
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          __dynamic_vlan-0200__ 200
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          __dynamic_vlan-0300__ 300
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          __dynamic_vlan-0400__ 400
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          __dynamic_vlan-0500__ 500
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          __dynamic_vlan-0600__ 600
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          mgmt                  4000
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
```

При этом VLAN'ы можно добавлять в любом месте:

```
root@Earth# set vlans v1000 vlan-id 1000
root@Sun# run show vlans

Routing instance        VLAN name             Tag          Interfaces
default-switch          __dynamic_vlan-1000__ 1000
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          mgmt                  4000
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          v100                  100
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          v200                  200
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          v300                  300
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          v400                  400
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          v500                  500
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
default-switch          v600                  600
                                                           xe-0/0/0.0*
                                                           xe-0/0/1.0*
```

При этом у MVRP для интерфейсов есть различные режимы работы интерфейсов:

* Normal - принимаем VLANы через интерфейс и передаём настроенные локально
* Forbidden - Интерфейс не принимает VLANы остальным и не принимает их сам
* Restrict - Интерфейс только передаёт локально настроенные VLANы, но не принимает их от остальных

Т.е. можно настроить иерархию так, чтобы VLANы передавались от Sun всем остальным, но он их принимать не будет:

```
root@Sun# set protocols mvrp interface xe-0/0/0 registration restricted
root@Sun# set protocols mvrp interface xe-0/0/1 registration restricted
```

Теперь настроим порты на Earth и Saturn в сторону клиентов:

```
set interfaces xe-0/0/2 unit 0 family ethernet-switching interface-mode access
set interfaces xe-0/0/2 unit 0 family ethernet-switching vlan members 100
```

И проверим связь:

```
root@Moon:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:50:00:00:09:00 brd ff:ff:ff:ff:ff:ff
    inet 7.7.7.7/24 brd 7.7.7.255 scope global ens3
       valid_lft forever preferred_lft forever
    inet6 fe80::250:ff:fe00:900/64 scope link
       valid_lft forever preferred_lft forever
root@Moon:~# ping 7.7.7.8 -c 5
PING 7.7.7.8 (7.7.7.8) 56(84) bytes of data.
64 bytes from 7.7.7.8: icmp_seq=1 ttl=64 time=321 ms
64 bytes from 7.7.7.8: icmp_seq=2 ttl=64 time=105 ms
64 bytes from 7.7.7.8: icmp_seq=3 ttl=64 time=180 ms
64 bytes from 7.7.7.8: icmp_seq=4 ttl=64 time=107 ms
64 bytes from 7.7.7.8: icmp_seq=5 ttl=64 time=105 ms

--- 7.7.7.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 105.155/163.954/321.119/83.682 ms
```

RSTP, конечно, лучше, чем STP, но, не позволяет балансировать трафик, так как для всех VLAN'ов выбирается один Root-Bridge. Это можно исправить внедрением VSTP (Rapid PVST+ в Cisco).
