Spanning Tree Protocol – podstawy
Protokół drzewa rozpinającego (STP) został przedstawiony jako mechanizm przeciwdziałania pętlą w warstwie drugiej modelu ISO/OSI. STP używa mechanizmu, który polega na wyłączaniu redundantnych linków w celu uniknięcia pętli w sieci LAN. Gdyby nie STP pakiety rozgłoszeniowe (Broadcast) krążyły by w sieci w nieskończoność.
Załóżmy, że mamy poniższą topologię sieci przedstawioną na rysunku poniżej.
PC-1 chcę się skomunikować z PC-2, załóżmy że na PC-1 wydamy komendę ping 192.168.0.2. Host PC-1 nie zna adresu MAC hosta PC-2, więc musi wysłać zapytanie ARP na adres rozgłoszeniowy. Ramka z tym zapytaniem trafia najpierw do switcha SW3, który przesyła ją do wszystkich swoich interfejsów (Gi0/0, Gi0/1), z wyjątkiem interfejsu z którego ta ramka przyszła (Gi0/2). Następnie ramka dociera do SW1 oraz do SW2. Oba te switche również przesyłają tą ramkę w taki sam sposób jak zrobił to SW3, czyli SW1 przesyła ramkę przez Gi0/1 w kierunku SW2, oraz przez Gi0/2 do PC-2, natomiast SW2 przesyła ramkę przez Gi0/0 w kierunku SW1. Host PC-2 otrzymał zapytanie ARP i może na nie odpowiedzieć, jednak ramka z zapytaniem dalej krąży pomiędzy SW1, SW2 i SW3 i będzie tak krążyć w nieskończoność. Jedynym sposobem na przerwanie tej pętli jest wyłączenie jednego z interfejsów pomiędzy switchami, w taki sposób żeby istniała tylko jedna ścieżka pomiędzy PC-1 a PC-2 i do tego właśnie celu służy protokół drzewa rozpinającego (Spanning Tree Protocol).
Domyślnie przełączniki Cisco mają uruchomiony protokół STP, natomiast dla celów zobrazowania co się stanie jak w sieci LAN powstanie pętla i ramki będą krążyć w nieskończoność wyłączymy STP na switchach w topologii przedstawionej powyżej. Sprawdźmy co się stanie z przełącznikami jak wyłaczymy STP i wykonamy ping z PC-1 na PC-2.
Do wyłączenia STP służy komenda:
SW(config)# no spanning-tree vlan 1
Wykonajmy ją na wszystkich trzech switchach:
SW1(config)# no spanning-tree vlan 1
SW2(config)# no spanning-tree vlan 1
SW3(config)# no spanning-tree vlan 1
Teraz wykonajmy ping z PC-1 i PC-2 i obserwujmy co się stanie. Switche SW1 i SW2 przestały odpowiadać na komendy, utylizacja procesora jest na bardzo wysokim poziomie, dlatego nie odpowiada konsola, dodatkowo jak uruchomimy wiresharka na jednym z interfejsów pomiędzy switchami to zobaczymy, że cały czas krążą w sieci pakiety broadcast:
Dodatkowo ping pomiędzy PC-1 a PC-2 nie działa, dostajemy timeout i jest to spowodowane pętlą w sieci. Wyłączmy teraz jeden z interfejsów switcha SW3 (Gi0/1) i zobaczmy jak będzie wyglądała sytuacja. Od razu po wyłączeniu interfejsu Gi0/1 możemy zaobserwować, że konsole na switchach zaczęły odpowiadać, oraz ping z PC-1 na PC-2 działa.
VPCS> ping 192.168.0.2
84 bytes from 192.168.0.2 icmp_seq=1 ttl=64 time=9.095 ms
84 bytes from 192.168.0.2 icmp_seq=2 ttl=64 time=15.457 ms
84 bytes from 192.168.0.2 icmp_seq=3 ttl=64 time=27.437 ms
84 bytes from 192.168.0.2 icmp_seq=4 ttl=64 time=12.474 ms
84 bytes from 192.168.0.2 icmp_seq=5 ttl=64 time=11.474 ms
Jak działa STP ?
Włączmy teraz spowrotem na switchach spanning-tree protocol oraz interfejs który wyłączyliśmy. W celu weryfikacji czy STP jest uruchomione możemy posłużyć się następującą komendą:
SW1#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 00ca.0d3f.0c00
Cost 4
Port 1 (GigabitEthernet0/0)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 00ca.0dc1.2f00
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Root FWD 4 128.1 P2p
Gi0/1 Altn BLK 4 128.2 P2p
SW2#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 00ca.0d3f.0c00
Cost 4
Port 2 (GigabitEthernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 00ca.0d8e.9c00
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Desg FWD 4 128.1 P2p
Gi0/1 Root FWD 4 128.2 P2p
Gi0/2 Desg FWD 4 128.3 P2p
SW3#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 00ca.0d3f.0c00
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 00ca.0d3f.0c00
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Desg FWD 4 128.1 P2p
Gi0/1 Desg FWD 4 128.2 P2p
Gi0/2 Desg FWD 4 128.3 P2p
Protokół STP działa w oparciu o ramki BPDU (bridge protocol data unit). Switche wymieniają się tymi ramkami i na ich podstawie ustalają które nadmiarowe połączenia zablokować. Ramka BPDU wygląda następująco:
Najpierw na podstawie ramek BPDU wybierany jest korzeń drzewa (root bridge). Korzeń drzewa zostaje wybrany na podstawie Bridge Identifier, które składa się następujących pól:
Bridge Priority – priorytet przełacznika
Bridge System ID Extension – vlan dla którego działa STP
Bridge System ID – MAC adres przełącznika
Root Bridge zostaje switch który posiada najmniejszy priorytet, w przypadku gdy priorytety są takie same to korzeniem zostaje przełącznik o najniższym adresie MAC. W naszym przykładzie Root Bridge został wybrany switch SW3, ponieważ posiada najniższy MAC adres (priorytety na wszystkich switchach są takie same)
SW1 Bridge ID
Priority 32769 (priority 32768 sys-id-ext 1)
Address 00ca.0dc1.2f00
SW2 Bridge ID
Priority 32769 (priority 32768 sys-id-ext 1)
Address 00ca.0d8e.9c00
SW3 Bridge ID
Priority 32769 (priority 32768 sys-id-ext 1)
Address 00ca.0d3f.0c00
Zweryfikujmy to wydając komendę show spanning-tree na SW3:
SW3#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 00ca.0d3f.0c00
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 00ca.0d3f.0c00
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Desg FWD 4 128.1 P2p
Gi0/1 Desg FWD 4 128.2 P2p
Gi0/2 Desg FWD 4 128.3 P2p
Następny krok po wybraniu root bridge to ustawienie portów przełączników w odpowiedniej roli. Role portów w STP są trzy: Designated, Root, Alternate. Porty Designated i Root przesyłają ruch, natomiast porty Alternate są zablokowane tak aby nie powstała pętla. Porty Root są to porty które prowadzą do Root Bridge’a, natomiast porty Designated to porty które prowadzą do innych przełączników. Wszystkie porty root bridge są portami Designated:
Następnie pozostałe przełączniki wybierają porty Root i Designated, które wybierane są zgodnie z poniższym algorytmem:
1. Najniższy root bridge ID
2. Najniższy koszt ścieżki do root bridge
3. Najniższy bridge ID
4. Najniższy port ID (nadawcy).
Port ID składa się z priorytetu i numeru interfejsu. W wyniku polecenia show spanning-tree jest to pole Prio.Nbr.
Pierwszy punkt możemy ominąć, ponieważ ma on zastosowanie tylko dla portów Root Bridge’a. Kolejny punkt to najniższy koszt ścieżki do root bridge. Domyślnie koszty portów wyglądają następująco:
Pasmo | Koszt |
10 Mbps | 100 |
100 Mbps | 19 |
1-Gigabit Ethernet | 4 |
10-Gigabit Ethernet | 2 |
W naszej topologii mamy interfejsy Gigabitowe więc koszty poszczególnych linków wynoszą 4:
Dla SW1 koszt ścieżki do Root Bridge przez Gi0/0 wynosi 4, natomiast przez Gi0/1 wynosi 4+4 czyli 8. W związku z tym Gi0/0 zostanie Root Port.
Dla SW2 koszt ścieżki do Root Bridge przez Gi0/0 wynosi 4 +4 czyli 8, natomiast przez Gi0/1 wynosi 4. W związku z tym Gi0/1 zostanie Root Port.
Ostatni krok to wybór portu Designated i portu Alternate. W obu przypadkach zarówno port Gi0/1 na SW1 oraz Gi0/0 na SW2 mają ten sam koszt ścieżki do Root Bridge, dlatego musimy wziąć następny punkt algorytmu wyboru, czyli punkt 3. Najniższy bridge ID. Dla przypomnienia Bridge ID SW1 = 32769 + 00ca.0dc1.2f00, a Bridge ID SW2 = 32769 + 00ca.0d8e.9c00. Priorytet w obu przypadkach jest taki sam, czyli niższy Bridge ID jest ustalany a podstawie niższego adresu MAC, w tym przypadku SW2 ma niższy Bridge ID, czyli port Gi0/0 na SW2 zostanie portem Designated, a port Gi0/1 na switchu SW1 zostanie zablokowany, czyli będzie pełnił rolę Alternate.
Zweryfikujmy stan portów korzystając z komendy show spanning-tree.
SW1#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 00ca.0d3f.0c00
Cost 4
Port 1 (GigabitEthernet0/0)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 00ca.0dc1.2f00
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Root FWD 4 128.1 P2p
Gi0/1 Altn BLK 4 128.2 P2p
SW2#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 00ca.0d3f.0c00
Cost 4
Port 2 (GigabitEthernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 00ca.0d8e.9c00
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Desg FWD 4 128.1 P2p
Gi0/1 Root FWD 4 128.2 P2p
SW3#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 00ca.0d3f.0c00
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 00ca.0d3f.0c00
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Desg FWD 4 128.1 P2p
Gi0/1 Desg FWD 4 128.2 P2p
Każdy z portów w STP może być w jednym z poniższych stanów:
Disabled – port jest wyłączony administracyjnie (shutdown) i nie bierze udziału w procesie STP
Blocking – jest to początkowy stan portu, który trwa przez 20 sekund, po tym czasie port przechodzi do stanu Listening. Jeśli port nie jest portem Designated ani Root, czyli jest portem Alternate to również będzie w stanie blocking i w nim pozostanie dopóki nie zostanie zmieniona topologia sieci. Port w stanie blocking nie uczestniczy w procesie przesyłania ramek.
Listening – tylko designated i root port może przejść w stan nasłuchiwania. W tym stanie switch próbuje dowiedzieć się jak wygląda topologia. Port w stanie listening przesyła tylko ramki BPDU, ramki z danymi nie są przesyłane, po 15 sekundach w stanie listening port przechodzi w stan learning.
Learning – w tym stanie port uczy się adresów MAC poprzez analizowanie adresów źródłowych ramek ethernetowych otrzymanych na porcie. Port uczy się adresów przez 15 sekund, a następnie przechodzi w stan przesyłania ramek (Forwarding)
Forwarding – jest to finalny stan portu, w którym następuje przesyłanie ramek z danymi.
STP przydatne komendy:
- Zmiana Root Bridge
Zmianę root bridge’a możemy wykonać na dwa sposoby. Automatycznie i ręcznie.
SW1(config)#spanning-tree vlan 1 root primary
Powyższa komenda zmieni priorytet przełącznika (bridge priority) na wartość niższą niż priorytet obecnego root bridge’a.
SW1#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 24577
Address 00ca.0dc1.2f00
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 24577 (priority 24576 sys-id-ext 1)
Address 00ca.0dc1.2f00
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 15 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Desg FWD 4 128.1 P2p
Gi0/1 Desg FWD 4 128.2 P2p
Ręczną zmianę priorytetu możem wykonać następująca komendą:
SW1(config)#spanning-tree vlan 1 priority 4096
SW1#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 4097 Address 00ca.0dc1.2f00 This bridge is the root Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 4097 (priority 4096 sys-id-ext 1) Address 00ca.0dc1.2f00 Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Aging Time 300 sec Interface Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- -------------------------------- Gi0/0 Desg FWD 4 128.1 P2p Gi0/1 Desg FWD 4 128.2 P2p
- Zmiana kosztu intefejsu:
SW1(config-if)#spanning-tree cost 100
SW1#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 4097
Address 00ca.0dc1.2f00
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 4097 (priority 4096 sys-id-ext 1)
Address 00ca.0dc1.2f00
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Desg FWD 100 128.1 P2p
Gi0/1 Desg FWD 4 128.2 P2p