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
- volí sa Root Bridge
- určujú sa Root Porty
- určujú sa Designated Porty
- 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 primary
zistia 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-inconsistent
stavu, 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