25 April 2013

Spanning Tree Protocol


Spanning Tree Protocol

สาเหตุของการมี Spanning Tree 
อุปกรณ์ต่างๆ มีโอกาสที่จะชำรุดเสียหายหรือใช้ไม่ได้  พวก Switch/Bridge ก็เช่นกัน เราเลยต้องการความสามารถทนทานต่อความผิดพลาด (fault tolerance) เหล่านั้น จึงได้มีแนวคิดว่าควรต้องทำการเพิ่มอุปกรณ์เข้าไป เพื่อให้สามารถทำงานแทนได้ เมื่อเกิดปัญหาความผิดพลาด ซึ่งการเพิ่ม Switch เข้าไปนั้น เป็นเสมือนเป็นการมีเส้นทางสำรองให้ Network ที่ใช้ Switch แต่การเพิ่มก็มีข้อดีและผลกระทบข้างเคียงบางอย่างตามมา ก็คือการเกิด Bridge Loop  โดย Bridge Loop คือการเรียนรู้ที่ผิดพลาดของ Switch เนื่องจากธรรมชาติของการเรียนรู้ของ Switch นั้นเอง ผลกระทบทำให้ Network ของ Switch เกิดล้ม และทำให้ CPU Switch 100% จากนั้นจึงได้มีการคิดค้น Spanning Tree Algorithm มาแก้ปัญหาดังกล่าวครับ

การเกิด Bridge Loop บน Network Switch


แนวคิดการแก้ปัญหา Bridge Loop บน Switch 
      การใช้ Spanning Tree Protocol (STP) เป็นการป้องกันไม่ให้ทางสำรองย้อนกลับมากลายเป็นเส้นทางที่ทำให้เกิดลูปได้ โดยสถานกรณ์ปกติจะเป็นการ "block" บาง Port ของ switch ไม่ให้ทำการรับส่งเฟรมได้ชั่วคราว จนกว่าจะมีการเปลี่ยนแปลง Topology Network จะมีการคำนวณใหม่ว่าจะให้ยกเลิกการ "block" Port นั้นออกไปและให้ Port ดังกล่าวสามารถรับส่งเฟรมได้หรือไม่

สรุปจุดประสงค์หลักของโปรโตคอล Spanning Tree 
      ก็คือ การสร้างเส้นทาง (path) เพียงเส้นทางเดียวที่ปราศจากลูป (loop free path) โดยเริ่มต้นเส้นทางจากสวิตซ์ที่ถูกเลือกให้ทำหน้าที่เป็นศูนย์กลางหลักของ Network (Root bridge) ผ่านจะไปยัง Switch ตัวที่เป็นอื่นๆ ที่เชื่อมต่ออยู่ ซึ่งเส้นทางที่ปราศจากลูป (loop free path) จะถูกสร้างขึ้นมาโดยการคำนวณอัลการิทึมของ Spanning Tree เพื่อเลือกเฟ้นหาว่า Switch ตัวใดตัวหนึ่งที่ทำหน้าที่เป็น Root bridge และพิจารณาตัดสินว่าทุกๆ Port ของ Switch ควรจะเป็น blocking state หรือไม่ก็ forwarding state อย่างใดอย่างหนึ่ง

Note: Switch ของ Cisco จะ Enable ฟังก์ชัน Spanning Tree Protocol เป็นปกติอยู่แล้ว (by Default) โดยจะทำงานอัตโนมัติเมื่อตรวจพบว่ามีเส้นทางสำรองที่อาจก่อให้เกิด Bridge loop ใน Network ได้

หลักการทำงานของ Spanning Tree
     STP เป็นมาตรฐาน IEEE802.1d  ซึ่ง SpanningTree Algorithm คือเริ่มจากการค้นหา Root Bridge (Root Switch) เพื่อทำหน้าที่เป็นศูนย์กลางหลักของ Network (Root Bridge) จากนั้นก็จะพิจารณา port Switch แต่ละตัวควรได้รับการเซตให้เป็น Forwarding state ส่วน Port นอกเหนือจะการถูกเลือก ก็จะเป็น Blocking state โดยอัตโนมัติ (ส่วนของกระบวนการหา Minimum Spanning Tree Algorithm ขอเว้นไม่พูดในที่นี้นะครับ)



สรุปคร่าวๆ ว่า STP ใช้ 3 เงื่อนไขในการพิจารณาในการให้ forwarding state ดังนี้
      1. STP จะมีการเลือก Root Bridge ซึ่ง Port ทั้งหมดจะมีสถานะเป็น forwarding state ดังนั้นจะมี 1 Root Bridge ต่อ 1 Layer 2 Domain (ให้จินตนาการ VLAN ด้วยนะครับ)
      2. Switch ที่เป็นไม่ใช่ Root Bridge (non-Root bridge) จะมีการพิจารณาเลือกพอร์ตใดพอร์ตหนึ่งให้ทำหน้าที่เป็น "Root Port" โดยพอร์ตที่เป็น Root port จะต้องเป็นพอร์ตที่มี "Root Path Cost" น้อยที่สุด (Cost จากพอร์ตนั้นๆ ไปยัง Root Bridge) เมื่อเทียบกับ Port อื่นๆ ใน switch ตัวเดียวกัน ดังนั้นจะต้องมี Root Port 1 พอร์ตต่อ Switch 1 ตัว ซึ่ง Root Port จะถูก Set ให้เป็น Forwarding state
     3. ในแต่ละ Segment หรือแต่ละ Connection ที่เชื่อมต่อระหว่าง Switch บน Connection ในลักษณะนี้ STP จะมีการเลือกให้พอร์ตของ Switch ตัวใดตัวหนึ่งทำหน้าที่เป็น "Designated Port" โดย "Designated Port" จะต้องเป็นพอร์ตที่มี "Root Path Cost" ที่ดี คือ จะมี Cost จาก Switch ตัวนั้นๆ ไปยัง Root Bridge ต่ำที่สุดเมื่อเทียบกับพอร์ตของ Switch ตัวอื่นๆ ที่เชื่อมต่ออยู่กับ Segment เดียวกัน ดังนั้นจะต้องมี Designated Port 1 Port ต่อ 1 Segment หรือต่อ 1 Connection ระหว่าง Switch ซึ่งสุดท้าย Designated port จะได้รับการเซตให้เป็น Forwarding state นอกนั้น พอร์ตอื่นๆ ที่เหลือบนทุกๆ Switch จะได้รับการเซตให้เป็น Blocking state ทั้งหมด

กระบวนการทำงานของ Spanning Tree Protocol 

Step 1. เลือก Root Bridge
            STP เริ่มต้นด้วยการที่ Switch แต่ละอ้างว่าตัวเองนี่แหละคือ Root Bridge ด้วยการส่ง Message ที่เรียกว่า BPDU (Bridge Protocol Data Unit) แลกเปลี่ยนกับ Switch ตัวอื่นๆ เพื่อ "เลือกตั้ง" กันว่า Switch ตัวใดจะชนะการเลือกตั้ง (ใครมีคะแนนน้อยสุด) และได้รับการเลือกให้เป็น "Root Bridge" โดยภายใน BPDU จะมีฟิลด์สำคัญหนึ่งที่เรียกว่า Bridge ID
ซึ่ง Bridge ID เป็นค่าตัวเลข 8 byte ที่ประกอบด้วยฟิลด์ดังนี้
- Bridge Priority (2 byte) เป็นค่าลำดับความสำคัญ (priority)ของ Switch นั้นเมื่อเทียบกับ Switch ตัวอื่น (มีค่าตั้งแต่ 0 - 65,535) by default คือ 32,768 (2^15)
- Mac address (6 byte) เป็น Mac address ประจำตัว Switch เองขึ้นกับ Switch แต่ละโมเดล  ซึ่งจะ Hard code ไว้ภายใน Switch มาจากโรงงาน และไม่สามารถเปลี่ยนโดยผู้ใช้ได้


Note:  BPDU  เป็น Frame ประเภทหนึ่งที่ Switch/Bridge รับส่งกันเพื่อแลกเปลี่ยนข่าวสารต่างๆ ที่ใช้การคำนวณ SpanningTree Algorithm ประโยชน์อย่างหนึ่งที่เราได้ก็คือ การแลกเปลี่ยน BPDU กันเพื่อเลือก
ตั้งหา Root Bridge โดยพิจารณา จาก Bridge ID โดยปกติ Switch จะส่ง Frame นี้ออกไปทุกๆ port ที่รัน STP โดยเฟรมที่ว่านี้จะมี Mac address ต้นทางเป็นหมายเลข Mac address ของ port นั้นๆ และหมายเลข Mac address ปลายทางเป็น Multicast address 01-80-c2-00-00-00 ซึ่งเป็น Multicast พิเศษที่รู้จักกันในหมู่ Switch/Bridge ที่รัน STP ทั้งนี้เพื่อให้เฉพาะ Switch/Bridge รับเอาไปประมวลผลต่อ โดยจุดประสงค์เพื่อหา Root Bridge/Root switch ของ Layer 2 ใน Domain ปัจจุบันและตัดสินใจว่าพอร์ตไหนควรมีสถานะเป็นอะไร
BPDU นั้นมีอยู่ด้วยกัน 2 ประเภท คือ
1. Configuration BPDU เป็น BPDU เพื่อใช้ในการคำนวณ STP
2. Topology Change Notification (TCN) BPDU  เป็น BPDU ที่ใช้เพื่อประกาศให้ Switch/Bridge อื่นๆ ทราบถึงการเปลี่ยนแปลง  Topology ที่เกิดขึ้นใน Network

          BPDU นั้นจะถูกส่งออกทุกๆ พอร์ตเป็นเวลาทุกๆ 2 นาทีเพื่อให้ Switch ต่างๆ รับทราบ Topology ปัจจุบันอยู่เสมอภายในเฟรม BPDU จะมีฟิลด์อยู่หลายฟิลด์ แต่ที่สำคัญๆ ได้แก่
1. Message Type ระบุว่าเป็น configuration BPDU หรือ   Topology Change BPDU
2. Root Bridge ID
3. Sender Bridge ID
4. Root Path Cost
5. Message Age
6. Maximum Age
7. Hello Time
8. Forward Delay

     เมื่อเปิด Switch ขึ้นมา Switch แต่ละตัวจะทำการส่ง BPDU ออกไปโดยเซตฟิลด์ Root Bridge ID ให้เท่ากับค่า Bridge ID ของมันเอง (เพื่ออ้างว่าตัวเองนี้แหละคือ Root Bridge) และเซตฟิลด์ Sender Bridge ID เป็นค่า Bridge ID ของมันเอง (เพื่อบอกให้รู้ถึงแหล่งที่มาของ BPDU นั้นๆ ว่าใครเป็นผู้ส่ง) Switch แต่ละตัวเมื่อได้รับ BPDU เข้ามาทาง Port ใดๆ ก็ตามแต่ มันจะนำมาวิเคราะห์ดูว่ามี BPDU ไหนที่มีค่าฟิลด์ Bridge ID ที่ดีกว่าของมันหรือดีกว่า Bridge ID อื่นๆ ที่มันรู้จักหรือไม่ ซึ่งค่า Bridge ID ที่ดี จะต้องมีค่าต่ำที่สุดนั้นเอง 
     หากมันพบ BPDU ที่มีค่า Bridge ID ที่ดีกว่า มันจะแทนที่ฟิลด์ Root Bridge ID ในเฟรม BPDU ที่ตัวมันประกาศออกไปด้วยค่า Bridge ID ที่อยู่ใน BPDU ที่ดีกว่านั้นๆ โดยที่ยังคงเซตค่าฟิลด์ Sender Bridge ID ให้เท่ากับค่า Bridge ID ปัจจุบันของมันเหมือนเดิม  ในไม่ช้าเร็วการเลือก Root Bridge ก็จะจบ และทุกๆ Switch/Bridge  ก็จะได้ Switch ที่มีค่า Bridge ID ที่ดีที่สุด (มีค่าต่ำสุด) หลังจากนั้นพอร์ตทุกๆ พอร์ตบน Root Bridge จะได้รับการเซตให้เป็น Designated Port บน Segment นั้นๆ ไปโดยอัตโนมัติ
     ในกรณีที่มี Root Bridge อยู่แล้ว หากมีการนำ Swtich ตัวใหม่เพิ่มเข้ามาใน Network ซึ่ง Bridge ID ของ Switch ตัวใหม่ก็จะถูกนำมาพิจารณาใหม่เมื่อครบช่วงเวลาทุกๆ 2 วินาทีที่มีการรับส่ง BPDU  กัน

จำให้ขึ้นใจ ไม่งั้นก็เขียนแปะไว้ตรงประตูห้องน้ำไว้นะครับ ^^

     เมื่อมีการเปรียบเทียบ Bridge ID เกิดขึ้น ค่าของ Bridge Priority จะนำมาเปรียบเทียบก่อนเพื่อหาค่าที่ต่ำที่สุด แต่เนื่องจากใน Switch ทุกๆ ตัวจะมีค่า Default Bridge Priority (32,768=2^15) เท่ากันหมด ซึ่งสามารถกำหนดได้ แต่ถ้าเท่ากันต่อไปจึงต้องพิจารณาที่ Mac address ของแต่ละ Switch ว่ามีค่าที่ Switch ตัวไหน มีค่าต่ำสุดก็จะรับเลือกให้เป็น Root Bridge แล้วพอร์ตของ Root Bridge จะได้รับการเซตให้เป็น Designated Port โดยอัตโนมัติ ตามหลักการ

Note: Bridge ID และ ID (Mac adddress) มีค่าต่ำหรือน้อย ถือว่าเป็นค่าดี

Step 2. การเลือก Root Port
             เมื่อเราได้ทำการเลือก Root Bridge แล้วต่อไป Switch แต่ละตัวที่ไม่ใช่ Root Bridge ก็จะพิจารณาตนเองว่าใน พอร์ตทั้งหมดของตน พอร์ตไหนเป็นเส้นทางที่ใกล้ที่สุดหรือเร็วที่สุดในการเดินทางไปถึง Root Bridge พอร์ตนั้นจะเป็น Root Port ซึ่งมีได้เพียงพอร์ตเดียวเท่านั้นต่อ Switch 1 ตัว ซึ่ง STP ใช้การพิจารณา "Root Path Cost" มาเป็นตัวสินใจว่าจะให้ Port ใดทำหน้าที่เป็น Root Port ซึ่งต้องมีค่า Cost น้อยที่สุดเมื่อเทียบกับพอร์ตอื่นๆ ซึ่งแต่ละ Link หรือ Connection ของ Switch จะมีค่า Path cost ประจำตัวอยู่ 
      Path Cost เป็นค่าอัตราส่วนผกผันกับค่า Bandwidth ของ Link ซึ่งก็คือ Link ที่มี Bandwidth มาก จะมีค่า Path Cost ที่ต่ำ และ Link ที่มี Bandwidth น้อยจะมีค่า Path cost ที่สูง ในการพิจารณาค่า "Root Path Cost" นั้นจะได้จากผลบวกของ Path Cost ทั้งหมดนับจาก Root Bridge จนถึงพอร์ตนั้นๆ บน Non-Root Bridge ปัจจุบัน (Cumulative path cost = ผลรวมสะสม)
      ซึ่งค่า Path cost ของ SpanningTree Protocol โดยทาง IEEE เป็นคนนิยามขึ้นมาดังนี้
ขั้นตอนการได้มาซึ่ง Root Path Cost
1. Root Bridge ส่ง BPDU ออกไปโดยเซตค่าฟิลด์ Root Path Cost ให้เท่ากับ 0 เพราะพอร์ตของมันต่อโดยตรงกัย Root Bridge
2. เมื่อ Switch ตัวอื่นๆ ได้รับ BPDU จาก Root Bridge มันจะเพิ่มค่า Path Cost ของพอร์ตของมันที่ชี้ไปยัง Root Bridge บวกเข้าไปในค่าฟิลด์ Root Path Cost ของเฟรม BPDU ที่ได้รับเข้ามา
3. จากนั้น Switch ที่อยู่ติดกับ Root Bridge ก็จะส่งต่อไปยัง switch ตัวอื่นๆ ไปเรื่อยๆ
4. ค่าฟิลด์ Root Path Cost จะได้รับการพวกเพิ่มทุกครั้งในขณะที่ ได้รับ BPDU เข้ามาโดยแต่ละ switch ที่อยู่ตามเส้นทาง

Note: ค่าฟิลด์ Root Path Cost จะถูกเพิ่มค่าก็ต่อเมื่อ Switch ได้รับ BPDU เข้ามาเท่านั้น ค่า Root Path Cost มีค่าต่ำแสดงว่าดี

Step 3. เลือก Designated Port 
             เมื่อมีการเลือก Root Bridge และ Root Ports เสร็จแล้ว ต่อไปต้องเลือกพอร์ตที่ทำหน้าที่เป็น Designated port ประจำ Segment นั้นๆ เพื่อให้ Active นอกนั้นจะมี Status = blocking state หมด หลักการที่นำมาใช้เพื่อเลือกหา Designated port ก็คือ การพิจารณาว่าพอร์ตไหนมี Root Path Cost ที่ดีกว่า เพราะว่าจะแสดงถึงความเร็วในการส่งข้อมูลมาถึง Root Bridge เมื่อเทียบกับพอร์ตอื่นๆ ใน Segment เดียวกัน

Spanning Tree Protocol จะมีเงื่อนไขในการเลือก Root port และ Designated port ดังนี้
        1. เลือกพอร์ตที่มี Root Path cost ต่ำที่สุดก่อน ถ้ามีค่าเท่ากันให้ พิจารณาข้อถัดไป
2. สำหรับการเลือก Designated Port ระหว่าง  Switch มากกว่าหนึ่งตัว ให้เลือกพอร์ตของ Switch ที่มี Bridge ID ต่ำที่สุด 
    สำหรับการเลือก Root Port บน Switch เดียวกันให้เลือกพอร์ตที่ชี้ไปยัง Switch ที่มีค่าของ Bridge ID ต่ำกว่า
3. เลือกพอร์ตที่มีค่า Port ID ต่ำที่สุด

ส่วนของ ทฤษฎีบท มีประมาณนี้ครับ ส่วนการที่จะทำให้เข้าใจมากขึ้นจะต้องมี Lab เพื่อจะได้มองเห็นภาพ  โปรดติดตามบทความต่อไป >>>