Menu Zavrieť

9. Spanning Tree Protocol

Myslím, že správca menšej siete, ani nemusí vedieť, ako presne STP funguje (aj keď je to vždy lepšie), ale dôležité je vedieť, čo môže slučka v sieti spôsobiť, a že sa dajú využiť STP. Môj popis ani nezachádza do úplných podrobností, nie je problém nájsť, napr. priamo od Cisca, viac detailné informácie. Tento opis sa venuje všeobecne STP (povedzme podľa normy IEEE 802.1D) a pre konfiguráciu jeho Cisco verziou PVSTP. Ak to prax dovolí, tak je lepšie použiť novší variant Rapid STP či Multiple STP, ktorým sa budeme venovať v ďalšom diele.

Slučky v sieti

Pre bežnú ethernetovú sieť sa používa zapojenie do rozšírenej topológie hviezda. Jedná sa o stromovú štruktúru, kde medzi každými prvkami existuje len jedna cesta. Jednoduchý príklad ukazuje nasledujúci obrázok spolu s cestou komunikácie od PC 1 k PC 2.

Ak však prepojíme Switch 1 a 2, tak vznikne slučka a medzi stanicami bude existovať viac ako jedna cesta.

Problémy slučiek

Slučky môžu spôsobiť niekoľko problémov:

  • broadcastové búrka – u Broadcast sa tieto budú rozmnožovať, až dosiahnu kritického množstva
  • problémy s konektivitou alebo nestabilita tabuľky MAC adries (CAM) – vďaka slučke správa príde na switch z viac portov a on si stále mení adresu zdroja, v určitom prípade môže dôjsť k tomu, že si switch myslí, že je stanica pripojená k zlému portu a nikdy ju nedoručí správu
  • niekoľkonásobné doručenie – správa koluje v sieti stále dookola a stále sa doručuje

Najčastejší problém, ak v bežnej ethernetovej LAN existuje slučka, je, že dôjde k tzv. Broadcastové búrke (broadcast storm), ktorá väčšinou skončí úplným zahltením siete. Broadcastová búrka znamená, že sa v sieti šíri viac broadcastových (alebo i iných) rámcov, ako je sieť (aktívne prvky) schopná spracovať. Ak máme v sieti slučku, tak z princípu funkcie switchov dôjde k tomuto efektu.

Pripomeňme, ako funguje switch . Ak dostane rámec pre neznámy cieľ, tak ho prepošle na všetky porty mimo toho odkiaľ rámec prišiel. Rovnako pracuje aj s Broadcast. Ďalej si tiež uloží zdrojovú MAC adresu do CAM tabuľky s priradením portu, z ktorého prišiel rámec.

Pozn .: Na 3. vrstve ISO / OSI (IP) máme TTL (time to live), takže kolovanie správy po určitej dobe skončí, ale na 2. vrstve nič také nie je.

Takže na našom príklade prebieha komunikácia nasledovne, ak PC1 posiela správu pre PC2 (ešte spolu nekomunikovali)

  • krok 1 – SW1 prijme na porte e2 a odošle na ostatných (e0, e1), tiež si uloží záznam do CAM
  • krok 2 – SW0 prijme na porte e1 a odošle na e0, tiež vytvorí záznam vo svojej CAM
  • krok 2 – SW2 tiež prijme na porte e1 a odošle na e0, e2, cieľové PC2 teda už obdržalo správu, ale switche to nevie
  • krok 3 – SW0 prijme na porte e0 a odošle na port e1, pritom si opraví záznam v CAM, pretože si myslí, že bolo PC presmerované
  • krok 3 – SW2 prijme na porte e0 a odošle na port e1, e2, pritom si opraví záznam v CAM
  • krok 4 – SW1 prijme na porte e1 a odošle na e0, e1, PC1 spozná, že to nie je správa pre neho a zahodí ju, SW1 si opraví CAM
  • krok 4 – SW1 prijme na porte e0 a odošle na e1, e2, opraví CAM

A tak kolujú pakety v sieti stále, pridáva sa ďalšia komunikácia a zaťaženie siete rastie.

Pozn .: Všade sa uvádza, že broadcastové búrka vznikne pri zaslaní Broadcast, ale ja myslím, že zaslanie unicast môže mať rovnaký efekt.

Prečo vznikajú slučky

V dnešných lokálnych sieťach, ktoré sú často veľmi rozsiahle, môže dôjsť k vzniku slučky z dvoch dôvodov. Jedna možnosť je chyba obsluhy či neodborná manipulácia. Vo väčšej sieti nie je problém omylom prepojiť dva switche dohromady, miesto, aby sme pripojili nejakú stanicu. Môže sa tiež stať, že niekto pripojí do siete switch miesto stanice a pripojí ho do dvoch zásuviek.

Druhý dôvod je asi dôležitejšie a jedná sa o redundanciu alebo load balancing . Pretože je dnes veľmi dôležitá vysoká dostupnosť, tak sa vytvárajú redundantné (nadbytočné) spojenie. Potom, keď dôjde k výpadku niektorej linky alebo aktívneho prvku, tak stále väčší časť siete funguje po inej ceste. V tomto prípade slúži redundantné spojenie ako záloha. Iný prípad je, kedy využívame redundantné zapojenie pre zvýšenie výkonu (priepustnosti) a jedná sa o vyvažovanie záťaže. V tom prípade sú využívané všetky spoje zároveň.

Pozn .: Jednoduchým riešením rozloženie záťaže môže byť spájanie liniek Cisco EtherChannel (používa normu IEEE 802.3ad či PAgP).

Spanning Tree Protocol

Preto, aby sme zabránili slučkám v sieti, slúži Spanning Tree Protocol – STP Môžeme povedať, že pracuje na princípe teórie grafov, sieť je ohodnotený graf a algoritmus hľadá kostru tohto grafu. Inak povedané, hľadá najkratšiu cesty medzi každými dvoma switchu. Používa Spanning Tree Algorithm (STA) pre vytvorenie databázy topológie a potom hľadá a ruší redundantné spoje (blokuje porty – tie nevysielajú a prijaté dáta zahadzujú). STP je definovaný normou IEEE 802.1D a je označovaný ako Common Spanning Tree (CST).

Pozn .: Doplnené vďaka Tomfimu. Originálne STP (povedzme CSTP) už dnes neexistuje. V roku 2004 bola revidovaná norma IEEE 802.1D a bola zlúčená s rozšíreniami 802.1ta 802.1w, pričom originálne STP bolo nahradené pomocou RSTP. Napriek tomu sa v ďalšom popise venujem pôvodnému STP, ktoré je najbližšie (a tiež najjednoduchší) k defaultný Cisco verzii PVSTP.

STP na fyzickej topológii , ktorá môže obsahovať slučky, vytvorí virtuálny topológiu , ktorá už slučky neobsahuje. Je to dynamický protokol, pokiaľ teda vznikne slučka, tak sa prekonfiguruje, aby jej zabránil. Rovnako tak, ak sa preruší niektorá linka, tak sa pokúsi vytvoriť alternatívnu cestu (povolením predtým blokovaného portu), pokiaľ je to možné.

Určenie najkratšej cesty

STP vytvára strom najkratších ciest (kostru grafu). Najkratšia cesta je určovaná na základe kumulatívne ceny liniek. Cena linky je daná jej priepustnosťou (Bandwith), podľa nasledujúcej tabuľky. V pôvodnej špecifikácii sa počítalo s maximálnou rýchlosťou 1Gbs, takže bola aktualizovaná, aby zahŕňala aj linky 10Gbps.

rýchlosť linky cena od 2001 cena od 1998 cena pôvodnej
10 Gbps 2000 2 1
2 Gbps 10000 3 1
1 Gbps 20000 4 1
100 Mbps 200000 19 10
10 Mbps 2000000 100 100

Bridge ID – BID

Bridge ID (BID) je základná hodnota každého switche a skladá sa z  priority (2B), defaultný je 0x8000, a MAC adresy switche (6B). Switch, ktorý má najnižší BID sa stáva Root Bridge . BID môžeme zmeniť tým, že zmeníme prioritu switche.

Bridge Protocol Data Units – BPDU

STP využíva zasielanie špeciálnych správ medzi zariadeniami. Tieto správy sa volajú BPDU (bridge protocol dáta units) a sú prijímané aj blokovanými porty. Na začiatku komunikácie sa používajú konfiguračné BPDU , následne Topology Change Notification – TCN BPDU (oznamujú zmenu v sieťovej topológii) a Topology Change Notification Acknowledgment – TCA BPDU . BPDU rámca používajú ako zdrojovú MAC adresu adresu portu a odosielajú sa na STP multicast adresu 01:80:C2:00:00:00.

BPDU má tri hlavné časti. Globálne informácie o STP (verzia pod.), Informácie danej inštancie STP pre konfiguráciu a časové parametre (STP timers). Hello Time je interval, po ktorom sa zasielajú BPDU (default 2s). Max age (default 20s) a Forward delay (default 15s) sú doby medzi stavmi.

veľkosť [B] položka
2 protocol ID
1 protocol version
1 BPDU type
1 flags
8 root BID
4 root path cost
8 sender BID
2 sender port ID
2 Message Age
2 Max Age
2 Hello Time
2 forward Delay

Superior BPDU (nadradenej BPDU) je také BPDU, ktoré má nižšie hodnoty Root BID, cenu cesty k roote, odosielacie BID a odosielajúcej port ID ako ostatní.

Root Bridge

  • má najnižšiu BID
  • všetky jeho porty sú v stave forwarding (sú komunikujúci) a sú typu designated
  • je to koreň stromu
  • všetky rozhodnutia sa dejú z jeho pohľadu
  • bežne je dobré zabezpečiť, aby Root Bridge bol najvýkonnejší switch (čo býva zároveň centrálny prvok)

Voľba Root Bridge

Ak nastavíme prioritu switche na nižšiu hodnotu, tak môžeme určiť, ktorý switch bude Root Bridge. Voľba Root Bridge prebieha nasledovne:

  • switch (napríklad novo pripojený) odošle BPDU (ako broadcast), kde nastaví svoje BID ako root BID
  • každý switch prijme BPDU a ak je jeho BID menšia ako root, tak je opraví na svoje a odošle
  • ak prijme BPDU s nižším root BID, ako je jeho, tak ho uzná za Root Bridge

Typy portov

Jednotlivým portom na switchi nastaví STP jeden z troch typov (ak nie je port disabled):

  • root port – port s najnižšou cenou, buď linka priamo spojená s Root Bridge alebo s najkratšou cestou k nemu.
  • designated port – port, ktorý je členom STP topológie a pripája segment.
  • non-designated port – blokovaný port, redundantné cesta.

Root a designated port sú porty, ktoré posielajú dáta, sú v stave forwarding . Non-designated port je blokujúce, teda v stave blocked .

Stavy portov

Pri konvergencii (zmene topológie, napríklad pripojenie switcha do siete) prechádza jednotlivé porty niekoľkých stavy. Medzi každým prechodom je určitý maximálny časový interval.

stav portu popis čas [s]
Blocking (blokujúce) prijíma iba BPDU, nevysiela
| 20 Max-Age
Listening (počúvajúci) posiela a prijíma BPDU, nič iné
| 15 Forward Delay 1
Learning (učiaci sa) posiela a prijíma BPDU a učia sa MAC adresy
| 15 Forward Delay 2
Forwarding (přeposílající) posiela a prijíma všetko

Konvergencia STP

Prepínanie počítačová sieť je konvergovaná vo chvíli, keď všetky porty switchov sú buď v stave blocking alebo forwarding. Teda konvergencie je čas, než port prejde zo stavu blocking do forwarding, štandardne je to max. 50s. Ku konvergenciu dochádza vždy pri zmene topológie, teda pripojenie alebo odpojenie switche / portu alebo zmene konfigurácie STP. Štandardne teda každý novo pripojený port začne komunikovať až po 50s. Rovnako tak pri výpadku jednej linky dôjde k preklopeniu na záložný linku až po tejto dobe.

priebeh STP

  1. volí sa Root Bridge
  2. určujú sa Root Porty
  3. určujú sa Designated Porty
  4. ostatné sa nastaví ako Non-designated

Módy / typy STP

To čo som doposiaľ popisoval, bol klasický STP, ktorý sa označuje ako Common Spanning Tree (CST) a je daný normou IEEE 802.1D. V priebehu času vzniklo niekoľko ďalších typov STP, ktoré vylepšujú niektoré vlastnosti. Na Cisco zariadeniach sa nehovorí o type, ale módu, v ktorom STP pracuje. Navyše Cisco používa väčšinu STP vo vlastnej upravenej verzii.

Rôzne typy STP

  • Common Spanning Tree (CST) – IEEE 802.1D, pre všetky VLANy beží jediná inštancia STP. Norma vznikla v roku 1998 a CST bol zrušený revízií v roku 2004.
  • Per-VLAN Spanning Tree (Pin) – Cisco, vychádza z IEEE 802.1D, ale pre každú VLAN beží samostatná inštancie STP. Výhodou je, že môžem rozdeliť záťaž, že každá VLAN komunikuje inou cestou. Používa ISL trunk.
  • Per-VLAN Spanning Tree Plus (Pin +) – Cisco, rozdiel oproti Pin je v tom, že používa 802.1q trunk.
  • Rapid Spanning Tree (RST) – IEEE 802.1w, hlavný rozdiel je v rýchlej konvergencii (okolo 1s). Revízií v roku 2004 spojilo do normy 802.1D.
  • Rapid per-VLAN Spanning Tree Plus (RPVST +) – Cisco, vychádza z IEEE 802.1w, RST beží pre každú VLAN zvlášť.
  • Multiple Spanning Tree (MST) – IEEE 802.1s, rýchle ako RST a umožňuje mapovať niekoľko VLAN do jednej STP inštancie, teda umožní ušetriť počet STP pre veľký počet VLAN. MSTP beží navrchu nad RSTP, takže vždy musí existovať oboje. Používa sa na chrbticu siete. Revízií v roku 2003 spojilo do normy 802.1q, ktorá sa venuje VLANám.

STP Load Balancing – vyvažovanie záťaže medzi trunk portami

Pomocou priority portu – port priority

Spanning-Tree protokol môžeme použiť pre určité vyvažovanie záťaže VLAN na trunk portoch. Vychádza sa z toho, že switche máme priamo prepojené viac ako jedným Trunk (čo je bežné kvôli redundanciu). Vtedy je jedna linka blokovaná a komunikuje sa len cez jednu. Pretože pre obe linky je rovnaké Root Bridge ID , cena cesty aj BID odosielajúceho switche , tak sa blokovaný port volí iba podľa odosielajúceho port ID .

Port ID (16tich bitová hodnota) sa skladá z priority portu a jeho indexu . Priorita portu je defaultne 128, ale môžeme ju zmeniť konfigurácií a to aj len pre niektorú VLAN. Validný hodnoty sú násobkami 16-tich do hodnoty 240, ostatné hodnoty sú odmietnuté. Vyššiu prioritu má Port ID s nižšou hodnotou (teda aj nižšie port priority).

SWITCH (config-if) # spanning-tree port-priority 48          // priorita celého interfacu 
SWITCH (config-if) # spanning-tree vlan 3 port-priority 48   // priorita portu pre danú VLAN

Pomocou ceny cesty – path cost

Druhá možnosť vyvažovanie záťaže pomocou STP je využitie ceny cesty (path cost). Pri tejto metóde môžu byť rôzne trunk linky zapojené do rôznych switchov. Cena cesty sa štandardne určuje podľa rýchlosti linky. Cenu môžeme tiež zadať ručne, nižšia hodnota má väčšiu prioritu (ak sú hodnoty rovnaké, tak sa určuje podľa BID a port ID).

SWITCH (config-if) # spanning-tree cost 4           // cena celého interfacu 
SWITCH (config-if) # spanning-tree vlan 10 cost 4   // cena pre VLAN na interfacu

Konfigurácia STP v Cisco IOS

Pozn .: Myslím, že v mnohých prípadoch v praxi, nám stačí konfigurovať iba dve veci. Určiť Root Bridge a na každý koncový port (kde je pripojený počítač) nastaviť PortFast .

Dnešné Cisco switche podporujú STP v móde Pin +, Rapid Pin + a MSTP. Pre Pin + a RPVST + môže existovať (väčšinou) max. 128 STP inštancií. Pre MSTP býva limit 65 inštancií. Ide teda iba o verzie STP, ktoré obsahujú Cisco rozšírenia.

Pozn .: STP je na Cisco switchoch štandardne zapnuté (v móde Pin +) a neodporúča sa ho vypínať.

Základná konfigurácia parametrov STP nezáleží na použitom módu, pre vyššie režimy len pribúdajú ďalšie vlastnosti. V tejto kapitole budem opisovať iba konfiguráciu STP v móde Pin +. V tomto prípade väčšinou nepotrebujeme konfigurovať takmer nič.

Pozn .: Možné konfigurácie a vlastnosti sa líšia podľa verzie IOSu.

Na začiatku konfigurácie môžeme zvoliť, v akom móde má STP pracovať.

SWITCH (config) # spanning-tree mode Pin     // nastavenie módu STP

Pozn .: Ak zmeníme mód STP, tak sú všetky inštancie znova inicializované a môže dôjsť k prerušeniu komunikácie.

Ďalej môžeme zapnúť či vypnúť STP pre jednotlivú VLAN.

SWITCH (config) # spanning-tree vlan 10       // zapne STP pre VLAN 10 
SWITCH (config) # no spanning-tree vlan 10    // vypne STP pre VLAN 10

Potom môžeme konfigurovať jednotlivé parametre STP pre každú VLAN zvlášť. Myslím, že najdôležitejšie je nastavenie priority, pretože tým určujeme Root Bridge. Príkaz s root primaryzistia aktuálne najnižšiu prioritu v STP inštanciu a nastaví nižšia, takže je ešte lepší ako nastavovanie priamo priority.

Pozn .: STP inštancie pre VLAN vzniká automaticky, keď je prvý port zaradený do VLANy a ruší sa, keď sa posledný port vyradí.

SWITCH (config) # spanning-tree vlan 10 priority 32768 // nastaví prioritu switche, násobky 4096 
SWITCH (config) # spanning-tree vlan 10 root primary    // nastaví switch ako root

Namiesto jednej VLANy môžeme definovať aj niekoľko oddelených čiarkou alebo rozsah pomocou pomlčky.

Tiež môžeme použiť voliteľné kľúčové slovo diameter a definovať maximálny priemer siete. V praxi väčšinou ako Root Bridge volíme centrálny prvok (core switch) a polomer siete býva 2 (k centru sú pripojené rovno access switch) alebo 3 (máme ešte distribučné vrstvu). Switch potom dopočíta optimálne hodnoty pre hello time , forward-delay time , a maximum-age time .

SWITCH (config) # spanning-tree vlan 1-4094 root primary diameter 2

Pre kontrolu a dohľad na STP slúži rad show príkazov.

SWITCH # show spanning-tree                 // zobrazí info o STP pre každú VLAN 
SWITCH # show spanning-tree summary         // stručné info o STP 
SWITCH # show spanning-tree detail          // detailné info o STP 
SWITCH # show spanning-tree vlan 100        / / info o STP len pre danú VLAN 
SWITCH # show spanning-tree interface f0 / 1 // info o STP iba pre daný interface 
SWITCH # show spanning-tree bridge detail   // stručné prehľad STP inštancií

Ako zistím, ktorý switch je Root Bridge?

Pomocou show spanning-tree summary vidím, pre ktoré VLANy je daný switch root . Tiež to poznám podľa toho, že pre danú VLAN sú všetky porty v stave Designated .

Aby som vyhľadal správny switch, tak sa na akomkoľvek switchi pozriem na show spanning-tree vlan 100, ktorý port je Root a prejdem na switch, ktorý je do neho pripojený. Postupne sa dostanem až na Root Bridge .

Rozšírenie STP

Cisco má rad rozšírenie pre bežné STP. Väčšinou sa jedná o zvýšenie rýchlosti alebo zlepšenie bezpečnosti. Iba stručne sa zmienim o niekoľkých z nich. Najdôležitejšie je, podľa môjho názoru, portfast.

PortFast

Normálne sa po pripojení zariadenia k portu musí prejsť celý cyklus od zablokovaného stavu k forwarding. Ak vieme, že na porte je pripojený len počítač a nemôže dôjsť k slučke, tak môžeme nastaviť port ako portfast , kedy po zapnutí prejde rovno do stavu forwarding . Nastaviť môžeme buď na port alebo globálne pre všetky porty (kde nie je určené inak).

SWITCH (config-if) # spanning-tree portfast        // pre jeden port 
SWITCH (config) # spanning-tree portfast default  // pre všetky

Pozn .: Ak nie je nastavený portfast, tak sa často stane, že pripojené PC (napríklad s Windows XP) nabootuje skôr, než port prejde do forwarding stavu, takže pri odoslaní žiadosti DHCP o adresu nedostaneme odpoveď a nastáva rad problémov. Portfast môžeme nastaviť aj na trunk port, ak je tu pripojený server.

UplinkFast

Používa sa prevažne na prístupových switchoch (access switch). Pri výpadku hlavnej linky (Root Port), odblokuje záložnú linku a zabezpečí jej okamžité prepnutie do forwarding stavu (vynecháva stavy listening a learning). Nastavuje sa pre celý switch.

SWITCH (config) # spanning-tree uplinkfast

BPDUguard a BPDUfilter

Obe funkcie môžeme nastaviť buďto per port alebo globálne , ako defaultný správanie portu, vtedy sa však týka iba portov, ktoré majú nastavený portfast .

BPDU guard ochraňuje port, ktorý je určený pre koncovú stanicu (alebo server). Ak cez tento port príde BPDU, tak sa port vypne (prepne sa do stavuerror-disable). Väčšinou to znamená, že niekto pripojil nepovolený switch.

SWITCH (config-if) # spanning-tree bpduguard enable          // pre jeden interface 
SWITCH (config) # spanning-tree portfast bpduguard default // pre všetky

BPDU filter slúži na filtrovanie STP prevádzky na portoch určených pre koncovú stanicu (alebo server). Zabráni prijímanie a odosielanie BPDU paketov, čo je dobré nastaviť, aby klientské stanice nedostávali túto komunikáciu. Pokiaľ na port dorazí BPDU, tak sa vypne portfast (ak bolo zapnuté) a tiež BPDU filter .

SWITCH (config-if) # spanning-tree bpdufilter enable          // pre jeden interface 
SWITCH (config) # spanning-tree portfast bpdufilter default // pre všetky

STP Guard

Môžeme použiť Root Guard , ktorý chráni sieť, aby sa nestal nechcený switch Root Bridge . Ak by napríklad niekto pripojil switch s prioritou 0 a nízkou MAC adresou. Vynucuje, aby port, na ktorý je nastavený Root Guard bol designated portom , ak by sa mal stať root portom, tak sa zablokuje (prepne sa do root-inconsistentstavu, kedy neposiela dáta, ale prijíma BPDU).

SWITCH (config-if) # spanning-tree guard root

Dodatočnú obranu pred vznikom slučiek ponúka Loop Guard .

SWITCH (config-if) # spanning-tree guard loop      // pre jeden interface 
SWITCH (config) # spanning-tree loopguard default // pre všetky