บทที่ 15

Spanning Tree Protocol

เมื่อ LAN มีสวิตช์หลายตัวต่อกันจนเกิด ลูป เฟรมจะวนไม่จบและเครือข่ายล่ม STP แก้ปัญหานี้ด้วยการ "ตัดกิ่งส่วนเกิน" ให้เหลือเป็นต้นไม้เส้นทางเดียว — บทนี้คือ ขั้นตอน 3 ขั้น ที่ต้องท่องให้ได้: หา Root Bridge → หา Root Port → หา Designated Port ที่เหลือคือ Blocked

อ่าน ~18 นาที ข้อสอบ Q10 · 10 คะแนน ต่อจาก บทที่ 14 (Transparent Bridge)
ข้อสอบออกแบบไหน

บทนี้ออกเป็น ข้อสอบ Q10 (10 คะแนน) ตรง ๆ — ให้โทโพโลยีมาพร้อมตาราง priority/MAC ของสวิตช์ทุกตัว และ cost ของทุกพอร์ต แล้วให้ตอบว่า

  1. สวิตช์ตัวไหนเป็น Root Bridge (พร้อมเหตุผล)
  2. พอร์ตไหนของแต่ละสวิตช์เป็น Root Port (พร้อมค่า path cost)
  3. ในแต่ละ LAN segment พอร์ตไหนเป็น Designated Port และพอร์ตไหนถูก Block

15.0ทำไมต้องมี STP

เพื่อรองรับผู้ใช้จำนวนมาก เครือข่ายหนึ่งอาจต้องใช้สวิตช์มากกว่าหนึ่งตัว จึงต้องเชื่อมสวิตช์แต่ละตัวเข้าด้วยกัน — และการเชื่อมแบบนี้เองที่ทำให้เกิด ลูป (loop) ขึ้นได้ ผลคือเฟรมถูกส่งต่อจากสวิตช์หนึ่งไปอีกสวิตช์หนึ่ง อย่างไม่สิ้นสุด ทำให้ประสิทธิภาพของเครือข่ายลดลง

จุดที่คนพลาดบ่อย

"ทำไมเฟรมไม่ตายไปเองล่ะ?" — เพราะเฟรมของเลเยอร์ 2 ไม่มีฟิลด์ TTL / Hop count เหมือนแพ็กเก็ต IP ในเลเยอร์ 3 พอไม่มีตัวนับอายุ เฟรมที่ติดอยู่ในลูปจึงวนได้ตลอดกาลจนกว่าจะปิดสวิตช์ นี่คือเหตุผลที่ปัญหา loop ในเลเยอร์ 2 รุนแรงกว่าเลเยอร์ 3 มาก และเป็นเหตุผลที่ต้องมีโปรโตคอลมาตัดลูปให้ตั้งแต่ต้น

ส่วนขยาย (ไม่ได้อยู่ในตำรา แต่ควรรู้) — อาการ 3 อย่างของ L2 loop

ตำราสรุปสั้น ๆ ว่า "ส่งต่อกันไม่สิ้นสุด ประสิทธิภาพลดลง" ในทางปฏิบัติอาการที่เห็นแยกได้เป็น 3 อย่าง:

  • Broadcast storm — เฟรมบรอดคาสท์ (เช่น ARP request) ถูก flood วนซ้ำและทวีคูณทุกรอบ จนแบนด์วิดท์และ CPU ของสวิตช์เต็ม
  • Multiple frame copies — ปลายทางได้รับเฟรมเดียวกันหลายสำเนา ซึ่งโปรโตคอลชั้นบนไม่ได้ออกแบบมารองรับ
  • MAC table instability (MAC flapping) — สวิตช์เห็น MAC ต้นทางเดิมเข้ามาจากคนละพอร์ตสลับไปมา ตาราง MAC จึงถูกเขียนทับตลอดเวลาและใช้ตัดสินใจ forward ไม่ได้
สวิตช์ห้าตัวชื่อ สวิตช์-A ถึง สวิตช์-E เชื่อมกันด้วยสายหลายเส้น โดย A ต่อกับ B ด้านบน A ต่อกับ C ด้านซ้าย C ต่อกับ E ตรงกลาง และ E ต่อกับ B ด้านขวา ทำให้เกิดเส้นทางวนกลับมาที่เดิม ส่วนสวิตช์-D อยู่มุมล่างขวา
รูปที่ 15.1 จากตำรา — ตัวอย่างการเกิดการส่งเป็นแบบลูป (loop) ของเลเยอร์ 2 (จุดที่ต้องสังเกต: เดินตามสายจาก A → B → E → C แล้วกลับมาที่ A ได้อีกครั้ง — วงปิดแบบนี้คือสิ่งที่ทำให้เฟรมวนไม่จบ)

ที่มาของมาตรฐาน

Spanning Tree Protocol (STP) เป็นโปรโตคอลที่พัฒนาขึ้นเพื่อกำจัดลูป โดยบริษัท Digital Equipment Corporation (DEC) ภายหลังได้รับการปรับปรุงโดย IEEE ให้เป็นมาตรฐาน IEEE 802.1d

อย่างไรก็ตาม ผู้ผลิตสวิตช์ทุกรายมิได้ใช้มาตรฐาน IEEE 802.1d ทั้งหมด ดังนั้นหากใช้สวิตช์ มากกว่าหนึ่งผู้ผลิต ใน LAN เดียวกัน ผู้ดูแลระบบต้องระวังลูปที่อาจเกิดขึ้น เช่นการใช้สวิตช์ของ CISCO (ซึ่งใช้ 802.1d โดยปริยาย) ร่วมกับสวิตช์ของบริษัทอื่น

15.1Bridge Protocol Data Units (BPDU)

การทำงานของ STP เริ่มต้นด้วยการที่สวิตช์แลกเปลี่ยนข้อมูลกับสวิตช์ที่อยู่ใน LAN เดียวกัน ข้อมูลชุดนี้เรียกว่า Bridge Protocol Data Units (BPDUs) ซึ่งถูกส่งออกแบบบรอดคาสท์ เพื่อให้สวิตช์ที่ทำงานอยู่บนเลเยอร์ 2 (หรือบริดจ์) รับรู้

  • เริ่มแรก ทุกบริดจ์อ้างตัวเองว่าเป็น root bridge แล้วส่ง BPDU ออกไป
  • BPDU นี้จะถูกส่งต่อโดยทุกสวิตช์ที่เชื่อมต่อกัน
  • root bridge จะส่ง BPDU ออกไปเป็นช่วง ๆ ทำให้สวิตช์เชื่อว่าตนเป็น designated bridge พร้อมทั้งกำหนดพอร์ตเพื่อใช้เป็น root port ก่อนจะส่ง BPDU ต่อจนครบทั้ง STP
  • BPDU ที่ส่งทั้งหมดนี้เรียกรวมกันว่า configuration message

ในมาตรฐาน IEEE 802.1d กำหนดรูปแบบของ BPDU ไว้ สองแบบ:

Configuration BPDU

ใช้ในการกำหนดการทำงานและการคำนวณ STP (รูปที่ 15.3) — คือตัวที่พาข้อมูล Root ID / Root path cost / Bridge ID ไปเปรียบเทียบกัน

Topology Change Notification BPDU

ใช้แจ้งกรณีที่มีการเปลี่ยนแปลงของ LAN เกิดขึ้น เช่นสวิตช์เสียหาย

ตำรามีสองรูปที่มองแพ็กเก็ตเดียวกันคนละมุมกับ animation ด้านบน — รูปที่ 15.2 มองว่า BPDU "พูดอะไร" ตอนวิ่งระหว่างสวิตช์สองตัว ส่วน รูปที่ 15.3 มองว่า BPDU "หน้าตายังไง" คือฟิลด์ไหนกว้างกี่ไบต์เรียงจากซ้ายไปขวา:

สวิตช์สองตัวเชื่อมกันด้วยสายเส้นเดียว มีกล่องเล็กเขียนว่า BPDU วิ่งบนสาย · เส้นประลากขึ้นไปกางแพ็กเก็ตออกเป็นรายการฟิลด์เรียงลงมา คือ Protocol ID 2 bytes, Version 1 byte, Type 1 byte, Flags 1 byte, Root Bridge ID 8 bytes, Root Path Cost 4 bytes, Sender Bridge ID 8 bytes, Port ID 8 bytes, Message Age 2 bytes, Max Age 2 bytes, Hello Time 2 bytes และ Forward Delay 2 bytes · สี่ฟิลด์กลางถูกไฮไลต์สีเข้มและมีลูกศรชี้จากกล่องคำพูดสี่บรรทัดคือ This is my Root Bridge ID, How far I am from the Root Bridge, This is my Bridge ID และ I am sending this BPDU through this interface
รูปที่ 15.2 จากตำรา — การทำงานของ BPDU (จุดที่ต้องสังเกต: สี่ฟิลด์ที่ถูกไฮไลต์คือสี่ประโยคที่สวิตช์ใช้คุยกัน — "root ของฉันคือใคร · ฉันอยู่ห่างจาก root เท่าไร · ฉันคือใคร · ฉันส่งออกจากพอร์ตไหน" — สี่ประโยคนี้พอสำหรับตัดสินทั้ง root bridge, root port และ designated port)
แถบฟิลด์ของ Configuration BPDU เรียงสิบสองช่องพร้อมตัวเลขขนาดกำกับด้านบน: Protocol Identifier 2, Version 1, Message Type 1, Flags 1, Root ID 8, Root path Cost 4, Bridge ID 8, Port ID 2, Message Age 2, Maximum Time 2, Hello Time 2 และ Forward Delay 2 · ลูกศรชี้ลงจากช่อง Flags ไปยังแถวบิตที่เรียงจาก 7 ลงมาถึง 0 โดยบิต 7 และบิต 0 ถูกไฮไลต์ · ลูกศรชี้ลงต่อไปยังตารางสองคอลัมน์ บิตกับฟังก์ชัน ระบุว่าบิต 7 คือ Topology Change (TC) บิต 6 ถึง 1 คือ Unused และบิต 0 คือ Topology Change Ack (TCA)
รูปที่ 15.3 จากตำรา — Configuration BPDU (จุดที่ต้องสังเกต: ในไบต์ Flags ทั้ง 8 บิต ใช้จริงแค่ 2 บิต คือบิต 7 = TC และบิต 0 = TCA ที่เหลือเป็น Unused)

ฟิลด์ใน Configuration BPDU

ฟิลด์ขนาดหน้าที่
Protocol identifier2 ไบต์ระบุถึงอัลกอริทึมของ spanning tree และโปรโตคอลที่กำหนดไว้ใน 802.1 โดยมีค่าเป็นศูนย์ทั้งหมด
Protocol version identifier1 ไบต์กำหนดเวอร์ชันของมาตรฐาน มีค่าเป็นศูนย์
BPDU type1 ไบต์ประเภทของ BPDU — สำหรับ Configuration BPDU จะกำหนดให้เป็นศูนย์ทั้งหมด
Flags1 ไบต์กำหนดว่าเป็น BPDU เพื่อแจ้งการเปลี่ยนแปลงโทโพโลยี (Topology Change flag) หรือเพื่อตอบกลับการเปลี่ยนแปลง (Topology Change Acknowledgment flag)
Root identifier8 ไบต์แอดเดรสของ root bridge ที่สวิตช์ผู้ส่ง BPDU นี้เชื่อว่าเป็น root bridge ประกอบด้วย 2 ไบต์ของ priority + 6 ไบต์ของ MAC address
Root path cost4 ไบต์ค่า path cost จากสวิตช์ที่ส่ง ไปยังสวิตช์ที่เชื่อว่าเป็น root bridge
Bridge identifier8 ไบต์แอดเดรสของสวิตช์ที่ส่ง BPDU นี้ ประกอบด้วย 2 ไบต์ของ priority + 6 ไบต์ของ MAC address
Port identifier2 ไบต์หมายเลขของพอร์ตที่ส่ง BPDU นี้
Message age2 ไบต์อายุของ configuration message ตั้งแต่ถูกสร้างขึ้นโดย root — หากอายุมากกว่าที่กำหนด BPDU จะถูกกำจัดทิ้ง
Maximum age2 ไบต์เวลาสูงสุดที่ควรจะกำจัด configuration message ออกไป
Hello time2 ไบต์ช่วงเวลาของการส่ง configuration message ของ root
Forward delay2 ไบต์เวลา timeout ของบริดจ์ที่กำหนดโดย root เพื่อให้แต่ละสวิตช์ทำงานสอดคล้องกันในการเปลี่ยนสถานะของพอร์ตไปเป็น forwarding state · นอกจากนี้ยังใช้ลดเวลาของแอดเดรสที่อยู่ใน forwarding database เมื่อโทโพโลยีเปลี่ยน

รวม 2+1+1+1+8+4+8+2+2+2+2+2 = 35 ไบต์

ข้างในไบต์ Flags มีอะไร

ตารางข้างบนบอกแค่ว่า Flags กว้าง 1 ไบต์ แต่รูปที่ 15.3 กางออกมาให้เห็นทีละบิตเลยว่าใช้จริงแค่สองบิตหัวท้าย:

บิตที่ฟังก์ชันหมายความว่าอะไร
7 (บิตซ้ายสุด)Topology Change (TC)root กำลังบอกทุกสวิตช์ว่า โทโพโลยีเปลี่ยนไปแล้ว ให้ล้างตาราง MAC เร็วขึ้น
6, 5, 4, 3, 2, 1Unusedไม่ได้ใช้
0 (บิตขวาสุด)Topology Change Ack (TCA)designated bridge ใช้ตอบรับว่าได้รับ TC-BPDU แล้ว ผู้ส่งจะได้หยุดส่งซ้ำ
เลข 10000000 ที่โผล่ในตำราสองที่ — อย่าสับสน

ทั้งสองที่เป็นเลขเดียวกันแต่อยู่คนละฟิลด์ · ① BPDU type = 10000000 ⇒ แปลว่าแพ็กเก็ตนี้เป็น TC-BPDU (ไม่ใช่ Configuration BPDU ซึ่ง type เป็นศูนย์ทั้งหมด) · ② BPDU flag = 10000000 ⇒ คือบิตที่ 7 ถูกตั้งเป็น 1 ซึ่งจากตารางข้างบนคือธง Topology Change — เป็น configuration message ปกติจาก root ที่ติดธง TC มาด้วย · ถามในข้อสอบ ให้ระบุให้ชัดว่าเป็นค่าของ type หรือของ flags

จุดที่คนพลาดบ่อย — สองรูปในตำราเขียนขนาด Port ID ไม่ตรงกัน

ถ้าเทียบรูปที่ 15.2 กับรูปที่ 15.3 ทีละช่อง จะเจอว่ามีช่องหนึ่งไม่ตรงกัน และชื่อฟิลด์บางช่องก็เรียกคนละแบบ:

ฟิลด์เนื้อความในตำรารูปที่ 15.3รูปที่ 15.2ยึดอันไหน
Port identifier2 ไบต์28 bytes2 ไบต์ — เพราะบวกทั้งแพ็กเก็ตแล้วต้องได้ 35 ไบต์พอดี (ถ้าเป็น 8 จะกลายเป็น 41)
BPDU typeBPDU typeMessage TypeTypeชื่อต่างกันเฉย ๆ · ฟิลด์เดียวกัน ขนาด 1 ไบต์
Maximum ageMaximum ageMaximum TimeMax Ageชื่อต่างกันเฉย ๆ · ฟิลด์เดียวกัน ขนาด 2 ไบต์ ค่าปกติ 20 วินาที
Bridge identifierBridge identifierBridge IDSender Bridge IDชื่อของรูปที่ 15.2 ชัดที่สุด — มันคือ BID ของผู้ส่ง BPDU ใบนี้ ไม่ใช่ของ root

เวลาสอบให้เขียน 2 ไบต์ แล้วโชว์การบวกให้ครบ 35 ไบต์กำกับไว้ — เป็นวิธีพิสูจน์ตัวเองที่อาจารย์ตรวจแล้วเถียงไม่ได้

3 ฟิลด์ที่ใช้ตัดสินทุกอย่าง

ถ้าจำได้แค่ 3 ฟิลด์ ให้จำ Root identifier (ใช้เลือก root bridge ในขั้นที่ 1), Root path cost (ใช้เลือก root port ในขั้นที่ 2 และ designated port ในขั้นที่ 3) และ Bridge identifier + Port identifier (ใช้ตัดสินเมื่อ cost เท่ากัน) — สามฟิลด์นี้คือทั้งบทเรียนย่อลงมาเป็นแพ็กเก็ตเดียว

Topology Change Notification BPDU (TC-BPDU)

นอกจากใช้สร้าง STP ในช่วงต้นแล้ว สวิตช์ยังใช้ BPDU เพื่อแจ้งการเปลี่ยนแปลงของโทโพโลยี เช่นเกิดความเสียหายของสวิตช์ โดยส่ง TC-BPDU ออกจาก root port ของสวิตช์นั้น

  • TC-BPDU ประกอบด้วย protocol identifier, protocol version และ BPDU type เท่านั้น โดยค่าของ BPDU type มีค่าเป็น 10000000
  • จุดประสงค์คือทำให้ root ทราบ TC-BPDU จึงถูกส่งผ่านตาม STP ขึ้นไปหา root
  • เพื่อให้มั่นใจว่า TC-BPDU ถึง root จริง สวิตช์จะส่งซ้ำไปเรื่อย ๆ จนกว่าจะได้รับ acknowledgment จาก designated bridge จากนั้น designated bridge จะส่ง TC-BPDU ต่อไปจนถึง root
  • เมื่อ root ได้รับแจ้ง จะส่ง configuration message ออกไปโดยตั้งค่า BPDU flag เป็น 10000000
  • เมื่อบริดจ์ได้รับ BPDU นี้จาก root จะใช้ค่าในฟิลด์ forwarding delay มาตั้งเป็นเวลาหมดอายุของแอดเดรสใน forwarding table ใหม่ (ปกติเดิมอยู่ที่ 300 วินาที) เพื่อกำจัดเส้นทางเดิมที่บันทึกไว้ออกไป เพราะหลังโทโพโลยีเปลี่ยน สวิตช์อาจมีเส้นทางใหม่ในการส่งเฟรม
  • เมื่อได้รับ configuration message ใหม่ที่ BPDU flag เป็นศูนย์ทั้งหมด เวลาการบันทึกแอดเดรสจะกลับไปใช้ค่าเดิม

กรณีล้มเหลว — สวิตช์กลางทางพัง แล้วเกิดอะไรขึ้นถ้าไม่มี TC-BPDU

สมมติ PC-X เคยคุยกับ PC-Y ผ่านเส้นทางที่วิ่งผ่าน SW-B แล้วอยู่ดี ๆ SW-B พัง จน STP ต้องเปิดพอร์ตสำรองให้ traffic วิ่งอ้อมไปอีกทาง

ถ้าไม่มี TC-BPDUตามที่มาตรฐานทำจริง (มี TC-BPDU)
ตาราง forwarding ของสวิตช์ที่เหลือยังจำว่า "MAC ของ PC-Y อยู่ทางพอร์ตเดิม" ซึ่งเป็นทางที่ตายไปแล้วถูกล้างเร็วขึ้นพร้อมกันทั้งเครือข่าย
เวลาที่แอดเดรสเก่าค้างอยู่สูงสุด ~300 วินาที (ค่า aging ปกติ) = ประมาณ 5 นาทีถูกลดลงเหลือเท่าค่าใน forward delay ของ BPDU (ค่าปกติ 15 วินาที)
สิ่งที่ผู้ใช้เห็นเส้นทางสำรอง "ขึ้น" แล้วแท้ ๆ แต่เฟรมยังถูกส่งเข้าทางที่ตาย ⇒ เน็ตดับต่ออีกหลายนาทีทั้งที่สายสำรองพร้อมใช้สะดุดสั้น ๆ แล้วกลับมาใช้งานได้

ลำดับที่ต้องท่องได้: สวิตช์ที่เจอการเปลี่ยนแปลง → ส่ง TC-BPDU ออกทาง root port → ส่งซ้ำเรื่อย ๆ จน designated bridge ตอบรับ (TCA) → designated bridge ส่งต่อขึ้นไปจนถึง root → root ส่ง configuration message ที่ตั้ง flag = 10000000 กระจายกลับลงมาทั้งเครือข่าย → ทุกสวิตช์ย่นเวลา aging ชั่วคราว → เมื่อ flag กลับเป็นศูนย์ทั้งหมด ก็กลับไปใช้ 300 วินาทีตามเดิม

จุดที่คนพลาดบ่อย — TC-BPDU ไม่ได้ "สั่งให้คำนวณ STP ใหม่"

หน้าที่ของ TC-BPDU คือทำให้ทุกสวิตช์ล้างตาราง MAC เร็วขึ้น เท่านั้น (ย่นเวลา aging จาก 300 วินาที เหลือเท่า forward delay) · ส่วนการคำนวณ root bridge / root port / designated port ใหม่ เกิดจากการเปรียบเทียบ BPDU ที่ไหลอยู่ตลอดเวลา และจากการที่ไม่ได้รับ BPDU ภายใน maximum age (20 วินาที) ต่างหาก — เป็นคนละกลไกกัน

15.1.1Root Bridge

ขั้นแรกของการสร้าง STP คือเลือกสวิตช์ที่จะมาเป็น root โดยเลือกจากสวิตช์ที่มีค่า Bridge ID ต่ำที่สุด ค่านี้ตรวจสอบได้จากแพ็กเก็ต BPDU ที่แลกเปลี่ยนกันระหว่างสวิตช์

Bridge ID (8 ไบต์) = Bridge Priority (2 ไบต์) + MAC Address (6 ไบต์) เทียบ priority ก่อน — ถ้าเท่ากันจึงเทียบ MAC · ค่าน้อยชนะ
ส่วนประกอบขนาดความหมาย
Bridge priority2 ไบต์ค่าความสำคัญของบริดจ์ — ของ CISCO ถูกกำหนดให้เป็น 32,768 โดยปริยาย
MAC address6 ไบต์ค่า MAC address ของบริดจ์นั้น
แถบฟิลด์ของ Configuration BPDU 12 ช่อง แล้วชี้ลงมาที่ Bridge ID ซึ่งแยกเป็น Bridge Priority 2 ไบต์ กับ MAC Address 6 ไบต์
รูปที่ 15.4 จากตำรา — ข้อมูลใน Bridge ID (แถบบนคือฟิลด์ของ Configuration BPDU ชุดเดียวกับรูปที่ 15.3 แล้วชี้ลงมาว่าช่อง Bridge ID ขนาด 8 ไบต์ ประกอบด้วย Bridge Priority 2 ไบต์ + MAC Address 6 ไบต์)
จุดที่คนพลาดบ่อย

Bridge ID ไม่ใช่ "priority หรือ MAC" แต่เป็น เลข 8 ไบต์ก้อนเดียว ที่เอา priority มาต่อหน้า MAC ดังนั้นการเทียบจึงเป็นการเทียบเลขจากซ้ายไปขวา → priority ตัดสินก่อนเสมอ และ MAC จะถูกใช้ก็ต่อเมื่อ priority เท่ากันเป๊ะ ๆ เท่านั้น · ข้อสอบชอบให้สวิตช์ที่ MAC ต่ำสุดมี priority สูง เพื่อดูว่าเราจะหลงเลือกมันเป็น root ไหม

รูปที่ 15.5 ในตำราเล่าเรื่องเดียวกันด้วยสวิตช์จริงสามตัว — animation ด้านบนเน้นการเทียบตัวเลข BID ทีละหลัก ส่วนรูปนี้เน้นว่า "ความเชื่อ" ของแต่ละสวิตช์เปลี่ยนไปยังไงหลังแลก BPDU กันครบ:

สองภาพเรียงจากบนซ้ายไปล่างขวา คั่นด้วยลูกศรใหญ่ที่เขียนว่า BPDUs are sent · ภาพซ้ายมีสวิตช์สามตัวต่อกันเป็นสามเหลี่ยม A มี Bridge ID 32768.1.aaaa.aaaa.aaaa, B มี 32768.1.bbbb.bbbb.bbbb และ C มี 32768.1.cccc.cccc.cccc โดยทั้งสามตัวมีกล่องคำพูดว่า I am the Root! เหมือนกันหมด · ภาพขวาเป็นโทโพโลยีเดิมแต่หลังแลก BPDU แล้ว มีลูกศรกำกับทิศทาง BPDU บนทุกลิงก์ A ยังพูดว่า I am the Root! ส่วน B และ C เปลี่ยนเป็น A is the Root.
รูปที่ 15.5 จากตำรา — ข้อมูลใน Bridge ID (คำบรรยายในตำราซ้ำกับรูปที่ 15.4 แต่ภาพจริงคือขั้นตอนการเลือก Root Bridge: ตอนเริ่มต้นทุกสวิตช์อ้างว่าตัวเองเป็น root — "I am the Root!" — พอแลก BPDU กันครบ B กับ C ก็ยอมรับว่า "A is the Root." เพราะ aaaa… เล็กกว่า bbbb… และ cccc… ในขณะที่ priority เท่ากันหมดที่ 32768)
อ่านตัวเลขในรูปที่ 15.5 ให้ออก

ทั้งสามตัวใช้ priority 32768 เท่ากันหมด (ค่าปริยายของ CISCO) ⇒ ตัดสินด้วย MAC address ล้วน ๆ · เรียงจากน้อยไปมาก: aaaa.aaaa.aaaa < bbbb.bbbb.bbbb < cccc.cccc.cccc ⇒ A ชนะ · ข้อสังเกตที่ใช้ได้จริงคือ ถ้าผู้ดูแลไม่ยอมตั้ง priority เอง เครื่องที่ MAC เก่าที่สุด (มักเป็นเครื่องที่เก่าและช้าที่สุดในห้อง) จะกลายเป็น root ซึ่งเป็นสิ่งที่เราไม่อยากได้

ส่วนขยาย (ไม่ได้อยู่ในตำรา) — เลข .1 ที่แทรกอยู่กลาง Bridge ID ในรูปคืออะไร

ในรูปที่ 15.5–15.7 Bridge ID ถูกเขียนเป็น 32768.1.aaaa.aaaa.aaaa ซึ่งมีเลข 1 คั่นอยู่ · ตำราอธิบาย Bridge ID ไว้แค่ 2 ส่วน คือ priority 2 ไบต์ + MAC 6 ไบต์ (ตามรูปที่ 15.4) ให้ยึดตามนั้นเวลาตอบข้อสอบ · ส่วนเลข .1 ในรูปคือรูปแบบการเขียนของอุปกรณ์ CISCO ที่แบ่ง 2 ไบต์ของ priority ออกเป็น priority จริง กับ หมายเลข VLAN — ในรูปคือ VLAN 1 · ไม่ต้องเอาไปคิดเวลาเทียบว่าใครเป็น root เพราะทุกตัวในรูปอยู่ VLAN เดียวกันหมด

การเลือก root จะทำใหม่ทุกครั้งที่มีการเปลี่ยนแปลงเกิดขึ้น เช่นสวิตช์เสียหาย หรือมีการติดตั้งสวิตช์เพิ่ม — สวิตช์ทุกตัวในเน็ตเวิร์กจะต้องได้รับ BPDU จากสวิตช์ที่เป็น root ตาม maximum age time ที่กำหนด ทั่วไปคือ 20 วินาที ถ้าไม่ได้รับ BPDU ภายในเวลาดังกล่าว สวิตช์อื่น ๆ จะเข้าใจว่า root อาจล่ม และจะเลือกสวิตช์ที่จะมาทำหน้าที่เป็น root ใหม่

กรณีล้มเหลว — Root Bridge ล่ม แล้วเครือข่ายเงียบไปนานแค่ไหน

ใช้โทโพโลยีเดียวกับรูปที่ 15.5 (A เป็น root · B และ C เป็นลูก) แล้วสมมติว่า A ดับกะทันหัน ไทม์ไลน์ที่ต้องตอบได้คือ:

เวลาเกิดอะไรขึ้นเครือข่ายใช้งานได้ไหม
t = 0A ดับ → หยุดส่ง BPDU · แต่ B และ C ยังไม่รู้ ยังเชื่อว่า A เป็น root และยังคง block พอร์ตส่วนเกินไว้เหมือนเดิม✕ ขาด
0 → 20 sB และ C นับถอยหลัง maximum age = 20 วินาที · ยังไม่ทำอะไรทั้งนั้น✕ ขาด
t = 20 sครบ max age → ทิ้งข้อมูล root เดิม → ทั้ง B และ C กลับไปอ้างว่าตัวเองเป็น root แล้วแลก BPDU กันใหม่ · bbbb… < cccc… ⇒ B เป็น root คนใหม่✕ ยังขาด
20 → 35 sพอร์ตที่เคยถูก block ต้องไต่สถานะ: เข้าสู่ Listening 15 วินาที (ฟัง BPDU อย่างเดียว ยังไม่เรียน MAC)✕ ยังขาด
35 → 50 sLearning 15 วินาที — เริ่มเรียน MAC จากเฟรมผู้ใช้ แต่ยังไม่ forward✕ ยังขาด
t = 50 sเข้าสู่ Forwarding — ข้อมูลผู้ใช้เริ่มวิ่งผ่านเส้นทางใหม่ได้จริง✓ กลับมาแล้ว
เวลากู้คืนของ STP มาตรฐาน = 20 (max age) + 15 (listening) + 15 (learning) = 50 วินาที ตัวเลขชุดเดียวกับหัวข้อ 15.2 Port States — ทั้งสองหัวข้อพูดถึงเวลาก้อนเดียวกัน

นี่คือ "ราคา" ของ STP ที่ข้อสอบชอบให้อธิบาย — เราได้เครือข่ายที่ไม่มีลูปและมีสายสำรอง แต่แลกมาด้วยการที่เวลาสายหลักพัง เครือข่ายจะเงียบไปประมาณ 50 วินาที ก่อนสายสำรองจะเริ่มทำงานจริง

จุดที่คนพลาดบ่อย — "สายสำรองมีแล้ว ทำไมยังดับ"

พอร์ตที่ถูก Block ไม่ได้แปลว่า "พร้อมใช้ทันทีเมื่อสายหลักพัง" — มันต้องไต่ผ่าน Listening → Learning ก่อนเสมอ ซึ่งกินเวลา forward delay อย่างละ 15 วินาที · ถ้าปล่อยให้พอร์ตกระโดดจาก Blocking ไป Forwarding ทันที จะเกิดสถานการณ์ที่สวิตช์บางตัวเปิดพอร์ตแล้วแต่บางตัวยังคิดไม่เสร็จ ⇒ เกิดลูปชั่วคราวและ broadcast storm ทันที ซึ่งเป็นสิ่งที่ STP ตั้งใจจะกันตั้งแต่แรก · เวลา 50 วินาทีจึงเป็นการยอมเจ็บสั้น ๆ เพื่อไม่ให้เจ็บยาว

จุดที่คนพลาดบ่อย — สวิตช์ต่างยี่ห้อในวงเดียวกัน

ตำราเตือนไว้ตรง ๆ ว่า ผู้ผลิตสวิตช์ทุกรายมิได้ใช้มาตรฐาน IEEE 802.1d ทั้งหมด · ถ้ามีสวิตช์ตัวหนึ่งในวงที่ไม่ได้พูด 802.1d มันจะไม่ส่งและไม่เข้าใจ BPDU ⇒ ไม่มีใครสั่ง block พอร์ตของมัน ⇒ ลูปที่ผ่านสวิตช์ตัวนั้นไม่ถูกกำจัด และเครือข่ายเจอ broadcast storm ทั้งที่ "เปิด STP ไว้แล้ว" · CISCO ใช้ 802.1d โดยปริยาย ดังนั้นเวลาผสมยี่ห้อ ต้องไล่เช็คทีละตัวว่าเปิด STP มาตรฐานเดียวกันจริงหรือไม่

15.1.2Root Port

หลังจากเลือก root ได้แล้ว สวิตช์อื่นทุกตัวต้องเลือกพอร์ตของตนเองหนึ่งพอร์ต ทำหน้าที่เป็น root port เพื่อใช้สื่อสารกับสวิตช์ที่เป็น root โดยพิจารณาจากค่าต่าง ๆ ดังนี้

ค่า Port Cost and Priorities

ขั้นแรกจะกำหนดค่า cost ของแต่ละพอร์ต เรียกว่า port cost โดยพอร์ตที่มีค่าต่ำสุดจะถูกเลือกก่อน ค่า cost นี้เป็นส่วนกลับของแบนด์วิดท์ของพอร์ต — ยิ่งเร็ว cost ยิ่งต่ำ

ปัจจุบันมีการกำหนดค่า port cost ไว้ 2 ชุด — ชุดเก่าใช้กับสวิตช์ CISCO ที่เลิกผลิตไปแล้ว เช่น Catalyst 1900 ส่วนชุดใหม่ใช้กับสวิตช์ที่ขายอยู่ในปัจจุบัน เช่น Catalyst 2960 โดยสวิตช์จะเลือกค่า port cost ที่มีค่าต่ำมากกว่า

แบนด์วิดท์Short-Path Cost MethodLong-Path Cost Method
10 Mbps1002,000,000
100 Mbps19200,000
1 Gbps420,000
10 Gbps22,000
40 Gbps1500
100 Gbps1200

ตารางที่ 15.1 — พอร์ต Costs ของ STP

Short

กำหนดไว้ใน spanning tree เวอร์ชันดั้งเดิม แยกความเร็วที่สูงกว่า 20 Gbps ไม่ได้ — สังเกตว่า 40 Gbps กับ 100 Gbps ได้ cost = 1 เท่ากัน

Long

สร้างขึ้นเพื่อแก้ข้อจำกัดของ short กำหนดในมาตรฐาน IEEE 802.1t คำนวณได้จาก 20 Tbps ÷ แบนด์วิดท์ (bit/s)

Long-Path Cost = 20 × 1012bandwidth (bit/s) ตรวจสอบ: 20×1012 ÷ (100×106) = 200,000 ✓ ตรงกับตาราง

นอกจากนั้นแต่ละพอร์ตยังตั้งค่าความสำคัญได้ เรียกว่า port priority โดยทั่วไปจะมีค่าเป็น 32

ส่วนขยาย — ชื่อเรียกอีกแบบที่เจอในเอกสารอื่น

ชุด Short มักถูกเรียกว่าค่าตาม IEEE 802.1D-1998 ส่วนชุด Long (802.1t) ถูกรวมเข้ามาใน IEEE 802.1D-2004 ถ้าโจทย์เขียนว่า "802.1D-1998" ให้ใช้คอลัมน์ Short (100/19/4/2/1) ถ้าเขียนว่า "802.1D-2004" หรือ "802.1t" ให้ใช้คอลัมน์ Long — ตัวเลขที่ต้องจำให้ได้แน่ ๆ คือ 100 Mbps → 19 เพราะตำราใช้ตัวเลขนี้เป็นตัวอย่างในหัวข้อถัดไป

15.1.3ค่า Path Cost

Path cost คือการคำนวณหาค่า cost ของพอร์ตของสวิตช์ในโทโพโลยีไปยังสวิตช์ที่เป็น root กติกามีข้อเดียว:

Root Path Cost ใหม่ = Root Path Cost ที่ได้รับมาใน BPDU + cost ของพอร์ตที่รับ BPDU เข้ามา หัวข้อ 15.1.3 — cost บวกที่ "ขารับ" เสมอ
  • เมื่อ root ส่ง BPDU ออกจากอินเตอร์เฟซ จะมีค่า path cost เป็น 0 (ศูนย์)
  • หลังจากสวิตช์ที่ต่อเชื่อมอยู่รับค่า BPDU มา จะเพิ่มค่า path cost ขึ้นตาม cost ของพอร์ตที่รับเข้ามา
  • ตัวอย่างในตำรา: ถ้าพอร์ตที่ต่ออยู่เป็น Fast Ethernet ค่า path cost จะเป็น 0 (ค่าของ root) + 19 (ค่าของสวิตช์) = 19
  • หากสวิตช์ส่ง BPDU นี้ต่อไป ค่าจะถูกบวกเพิ่มไปเรื่อย ๆ
จุดที่คนพลาดบ่อย

คนส่วนใหญ่บวก cost ของทั้งสองปลายของลิงก์ ซึ่งผิด — cost ถูกบวกที่ พอร์ตขารับ เท่านั้น ผลที่ตามมาที่เห็นชัดที่สุดคือ cost ของพอร์ตบน root bridge เอง จะไม่เคยถูกนับในเส้นทางของใครเลย (เพราะ root เป็นฝ่ายส่งอย่างเดียว) ถ้าโจทย์ให้ cost ของพอร์ต root มาแล้วเราเผลอเอาไปบวก ตัวเลขจะเพี้ยนทั้งข้อ

15.1.4Root Port Selection

หากสวิตช์มีทางเลือกเส้นทางไปยัง root ได้มากกว่าหนึ่งเส้นทาง สวิตช์จำเป็นต้องเลือกหนึ่งพอร์ตที่จะเป็น root port โดยเลือกตามลำดับดังนี้ (ข้อบนตัดสินก่อน ถ้าเสมอจึงลงข้อถัดไป)

  1. เลือกเส้นทางที่มีผลรวมของ path cost ไปยัง root ที่มีค่าน้อยที่สุด
  2. หากผลรวม path cost เท่ากัน ให้เลือกสวิตช์ที่อยู่ติดกันที่มีค่า switch ID ต่ำสุด
  3. หากมีหลายเส้นทางที่จะไปยังสวิตช์ติดกัน (ตัวเดียวกัน) ให้เลือกพอร์ตที่มีค่าความสำคัญ (port priority) ต่ำสุด
  4. หากค่าความสำคัญเท่ากัน ให้เลือกพอร์ตตามหมายเลขของพอร์ตที่มีค่าต่ำสุด เช่น FastEthernet 0/1
สองภาพคั่นด้วยลูกศรใหญ่ที่เขียนว่า BPDUs are compared · ภาพซ้ายคือสวิตช์ A, B, C ต่อกันเป็นสามเหลี่ยม A พูดว่า I am the Root! ส่วน B และ C พูดว่า A is the Root. มีลูกศร BPDU กำกับบนลิงก์ · ภาพขวาเป็นโทโพโลยีเดิม โดย A เปลี่ยนคำพูดเป็น I am the origin of every path! กล่องข้าง B ระบุว่า e1/2 is my Root Port และกล่องข้าง C ระบุว่า e1/3 is my Root Port · พอร์ตที่ปรากฏในรูปคือ e1/1 กับ e1/4 บน A, e1/2 กับ e1/5 บน B และ e1/3 กับ e1/6 บน C
รูปที่ 15.6 จากตำรา — การเลือก root port (จุดที่ต้องสังเกต: root port คือพอร์ตที่ชี้กลับไปหา root เสมอ — B เลือก e1/2 และ C เลือก e1/3 ซึ่งเป็นพอร์ตที่ต่อตรงกับ A ทั้งคู่ ส่วนพอร์ต e1/5 กับ e1/6 ที่หันเข้าหากันเองยังไม่ได้บทบาท ต้องรอขั้นตอนถัดไป)
ข้อควรจำ

root bridge ไม่มี root port — เพราะมันคือ root อยู่แล้ว ไม่ต้องหาทางไปหาตัวเอง · และสวิตช์ที่ไม่ใช่ root ต้องมี root port หนึ่งพอร์ตเสมอ (และมีได้แค่พอร์ตเดียว)

15.1.5Designate Port

แต่ละสวิตช์จะมีหนึ่งพอร์ตที่เป็น root port เพื่อส่งเฟรมไปหา root ส่วนพอร์ตที่เหลือเรียกว่า designated port รวมถึงกรณีที่มีสวิตช์มากกว่าหนึ่งตัวในเซกเมนต์เดียวกัน จึงต้องเลือก designated port ซึ่งทำได้ดังนี้

  1. เลือกสวิตช์ที่ต่อในเซกเมนต์นั้นที่มีผลรวมของ path cost ไปยัง root ต่ำที่สุด
  2. ถ้าผลรวม path cost เท่ากันระหว่างสองสวิตช์ จะเลือกสวิตช์ที่มีค่า switch ID ต่ำสุด
  3. ถ้าพบว่าเป็นสวิตช์เดียวกัน แต่มีการเชื่อมต่อสองเส้นไปยัง LAN เซกเมนต์ จะเลือกพอร์ตที่มีค่าความสำคัญ (priority) ต่ำสุด
  4. หากค่าความสำคัญเท่ากันอีก ให้เลือกพอร์ตของสวิตช์ที่มีหมายเลขต่ำสุด

ข้อสำคัญ: ทุกพอร์ตของ root สวิตช์จะเป็น designated port ทั้งหมด เนื่องจากค่า cost ที่ต่อไปยังเซกเมนต์ของเครือข่ายมีค่าเป็น 0 ซึ่งเป็นค่าที่ต่ำสุด หรืออีกนัยหนึ่งคือ เซกเมนต์นั้นต่ออยู่กับ root สวิตช์โดยตรง จึงไม่มีค่า cost ใด ๆ ในการที่จะไปยัง root

สองภาพคั่นด้วยลูกศรใหญ่ที่เขียนว่า BPDUs are compared · ภาพซ้ายคือสวิตช์ A, B, C ต่อกันเป็นสามเหลี่ยม A พูดว่า I am the origin of every path! กล่องข้าง B ระบุ e1/2 is my Root Port และกล่องข้าง C ระบุ e1/3 is my Root Port · ภาพขวาเป็นโทโพโลยีเดิม แต่ลิงก์ระหว่าง B กับ C ถูกขีดกากบาททับ กล่องข้าง B เปลี่ยนเป็น e1/5 is the Designated Port และกล่องข้าง C เปลี่ยนเป็น e1/6 is blocked · Bridge ID ของ A คือ 32768.1.aaaa.aaaa.aaaa ของ B คือ 32768.1.bbbb.bbbb.bbbb และของ C คือ 32768.1.cccc.cccc.cccc
รูปที่ 15.7 จากตำรา — การเลือก Designate port (จุดที่ต้องสังเกต: บนลิงก์ B–C มีข้างหนึ่งได้เป็น DP และอีกข้างถูก block พร้อมกากบาทขีดทับเส้น — นี่คือจุดที่ลูปถูกตัดออกจริง ๆ)

ไล่รูปที่ 15.7 ทีละกฎ — ทำไม e1/6 ของ C ถึงเป็นพอร์ตที่ "แพ้"

เซกเมนต์ที่ยังไม่มีใครได้บทบาทคือลิงก์ระหว่าง B (e1/5) กับ C (e1/6) ไล่ตามกฎ 4 ข้อของหัวข้อ 15.1.5 ทีละข้อ:

กฎเทียบอะไรฝั่ง B (e1/5)ฝั่ง C (e1/6)ผล
ข้อ 1path cost ไป root ต่ำสุดห่าง A หนึ่งลิงก์ห่าง A หนึ่งลิงก์เสมอ → ไปข้อ 2
ข้อ 2switch ID (Bridge ID) ต่ำสุด32768.1.bbbb.bbbb.bbbb32768.1.cccc.cccc.ccccbbbb < cccc ⇒ B ชนะ
ข้อ 3–4port priority / หมายเลขพอร์ตไม่ต้องใช้ เพราะตัดสินจบตั้งแต่ข้อ 2—

ผลลัพธ์: e1/5 ของ B = Designated Port · e1/6 ของ C = Blocked ตรงกับที่รูปเขียนไว้ · สังเกตว่า C ไม่ได้ "เสีย" อะไรเลย — มันยังมี e1/3 เป็น root port ใช้คุยกับ A ได้ตามปกติ แค่ทางลัด C→B ถูกปิดไว้เฉย ๆ เพื่อไม่ให้ครบวง

จุดที่คนพลาดบ่อย — "block" ไม่ได้แปลว่าพอร์ตเสีย

พอร์ตที่ถูก block ยังรับและประมวลผล BPDU อยู่ตลอดเวลา (ดูหัวข้อ 15.2 สถานะ Blocking) มันแค่ไม่ส่งต่อเฟรมข้อมูลของผู้ใช้ เท่านั้น · นี่คือเหตุผลที่มันรู้ตัวได้ทันทีเมื่อ BPDU หายไปเกิน maximum age แล้วเข้าคิวไต่ขึ้นมาเป็น forwarding แทน · ตอบว่า "พอร์ตถูกปิด/ตัดขาด" จะเสียคะแนน — ต้องตอบว่า "ยังฟัง BPDU อยู่ แต่ไม่ forward ข้อมูล"

สรุปกฎ 3 ขั้นให้ท่อง
  1. Root Bridge — Bridge ID ต่ำสุดในเครือข่าย มีได้ 1 ตัวเท่านั้น ทุกพอร์ตของมันเป็น DP
  2. Root Port — ของทุกสวิตช์ที่ไม่ใช่ root ตัวละ 1 พอร์ต คือพอร์ตที่มี path cost ไป root ต่ำสุด (เสมอ → เทียบ BID ของสวิตช์ข้างเคียง → เทียบ port ID)
  3. Designated Port — ทุก segment/link ต้องมี DP หนึ่งพอร์ต คือฝั่งที่ path cost ไป root ต่ำกว่า
  4. พอร์ตที่ไม่ใช่ทั้ง RP และ DP → ถูก Block (ตัดลูปตรงนี้เอง)
จุดที่คนพลาดบ่อย

หลายคนไล่หา RP ครบแล้วก็หยุด แล้วเดาว่าที่เหลือ block ทั้งหมด — ผิด ต้องไล่ทีละ segment ก่อนว่าใครเป็น DP เพราะ ทุก segment ต้องมี DP หนึ่งพอร์ตเสมอ (ไม่งั้นเซกเมนต์นั้นจะถูกตัดขาดจากเครือข่าย) พอร์ตที่เหลือหลังจากแจก RP และ DP ครบแล้วเท่านั้นจึงจะเป็น Blocked

ตัวอย่างเต็มรูปแบบ — โจทย์ข้อสอบเก่า

โจทย์ — เครือข่ายหนึ่งมีสวิตช์ 5 ตัว เชื่อมกันผ่าน LAN segment 4 เซกเมนต์ ข้อมูลของสวิตช์และพอร์ตเป็นดังนี้ จงหา Root Bridge, Root Port ของทุกสวิตช์, Designated Port ของทุกเซกเมนต์ และพอร์ตที่ถูก Block

สวิตช์PriorityMAC Addressพอร์ต (cost)
Switch-11000000.0001.1234I (10), J (10)
Switch-2250001.0001.0001E (20), F (10)
Switch-31500001.0000.AC1DC (10), D (20)
Switch-4500000.0001.1787G (40), H (20)
Switch-51000000.0001.A134A (10), B (10)
LAN Segmentพอร์ตที่ต่ออยู่
Segment-AH (Switch-4), D (Switch-3)
Segment-BA (Switch-5), E (Switch-2), J (Switch-1)
Segment-CC (Switch-3), F (Switch-2), I (Switch-1)
Segment-DB (Switch-5), G (Switch-4)

สังเกต: สวิตช์ทุกตัวมี 2 พอร์ต · รวม 10 พอร์ต (= 10 ลิงก์) · โหนดในกราฟ = 5 สวิตช์ + 4 เซกเมนต์ = 9 โหนด

สมมติฐานที่ใช้ตีความโจทย์ (อ่านก่อนเทียบคำตอบ)
  1. Segment-B มี 3 พอร์ต คือ A, E และ J — เพราะโจทย์ระบุเพิ่มว่า "J ต่อ Segment-B"
  2. path cost บวกที่พอร์ตขารับ ตามหัวข้อ 15.1.3 ของตำรา ผลคือ cost ของพอร์ต E (20) และ F (10) ซึ่งอยู่บน root bridge ไม่ถูกนำไปบวกในเส้นทางของสวิตช์ใดเลย
  3. port priority ของทุกพอร์ตเท่ากัน (ค่าปกติ 32) จึงต้องตัดสินด้วยหมายเลขพอร์ต โดยเรียงตามตัวอักษร A < B < … < J
  4. โจทย์นี้เกิดเสมอกันหนึ่งจุดที่ Switch-1 (พอร์ต I และ J ได้ cost 10 เท่ากัน) — ในหน้านี้ตัดสินด้วยกฎข้อ 4 ของหัวข้อ 15.1.4 คือเลือกพอร์ตหมายเลขต่ำสุดของเครื่อง → I ชนะ J (ดูกล่องม่วงท้ายหัวข้อนี้ประกอบ)

แสดงการคำนวณทีละขั้น

ขั้นที่ 1 — Root Bridge · เทียบ priority ก่อน: 25 (SW2) < 50 (SW4) < 100 (SW1) = 100 (SW5) < 150 (SW3)

Root Bridge = Switch-2 (priority 25) priority ต่ำสุดตัวเดียว ไม่ต้องเทียบ MAC เลย · Root Path Cost ของ Switch-2 = 0 · พอร์ต E และ F เป็น DP ทั้งคู่

ขั้นที่ 2 — Root Port ของสวิตช์ที่ไม่ใช่ root (Root ประกาศ cost = 0 ลงทั้ง Segment-B และ Segment-C)

สวิตช์เส้นทางที่ 1เส้นทางที่ 2ผล
Switch-5 พอร์ต A (Seg-B) = 0 + 10 = 10 พอร์ต B (Seg-D) = 30 (จาก SW4) + 10 = 40 RP = A · cost = 10
Switch-3 พอร์ต C (Seg-C) = 0 + 10 = 10 พอร์ต D (Seg-A) = 30 (จาก SW4) + 20 = 50 RP = C · cost = 10
Switch-1 พอร์ต I (Seg-C) = 0 + 10 = 10 พอร์ต J (Seg-B) = 0 + 10 = 10 เสมอ → กฎข้อ 4 → RP = I · cost = 10
Switch-4 พอร์ต G (Seg-D) = 10 (จาก SW5) + 40 = 50 พอร์ต H (Seg-A) = 10 (จาก SW3) + 20 = 30 RP = H · cost = 30

ลำดับการคิดสำคัญ — ต้องรู้ cost ของ Switch-5 กับ Switch-3 (ตัวที่ติดกับ root โดยตรง) ก่อน จึงจะคิด Switch-4 ได้ เพราะ Switch-4 อยู่ห่างจาก root สองต่อ

ขั้นที่ 3 — Designated Port ของแต่ละเซกเมนต์ (ฝั่งที่ path cost ไป root ต่ำกว่าเป็น DP)

Segmentพอร์ตที่ต่ออยู่ (cost ของสวิตช์นั้นไป root)DPผลของพอร์ตที่เหลือ
Segment-AD → SW3 = 10 · H → SW4 = 30DH เป็น RP ของ SW4 อยู่แล้ว
Segment-BE → SW2 = 0 · A → SW5 = 10 · J → SW1 = 10EA เป็น RP ของ SW5 · J ไม่ใช่ทั้ง RP และ DP → Block
Segment-CF → SW2 = 0 · C → SW3 = 10 · I → SW1 = 10FC เป็น RP ของ SW3 · I เป็น RP ของ SW1 → ไม่มีพอร์ตถูก block
Segment-DB → SW5 = 10 · G → SW4 = 30BG ไม่ใช่ทั้ง RP และ DP → Block

คำตอบสุดท้าย

สวิตช์Bridge ID (priority : MAC)cost ไป rootRoot PortDesignated PortBlocked
Switch-2 ★25 : 0001.0001.00010— (เป็น root)E, F—
Switch-1100 : 0000.0001.123410I—J
Switch-3150 : 0001.0000.AC1D10CD—
Switch-450 : 0000.0001.178730H—G
Switch-5100 : 0000.0001.A13410AB—
วิธีตรวจคำตอบใน 10 วินาที

Spanning tree ที่ถูกต้องต้องเป็นต้นไม้ — โหนด n ตัวต้องเหลือกิ่ง n − 1 กิ่ง โจทย์นี้มี

พอร์ตที่ถูก block = 10 (ลิงก์) − (9 (โหนด) − 1) = 2 พอร์ต โหนด = 5 สวิตช์ + 4 LAN segment = 9 · ลิงก์ = พอร์ตทั้งหมด 10 พอร์ต

ได้ G และ J = 2 พอร์ตพอดี ✓ · ถ้าคำนวณแล้วได้จำนวน block ไม่ตรงกับสูตรนี้ แปลว่าตกหล่นหรือแจกบทบาทซ้ำแน่นอน · เช็คเพิ่มอีกชั้น: ทุกสวิตช์ที่ไม่ใช่ root ต้องมี RP ตัวละ 1 พอร์ต (SW1=I, SW3=C, SW4=H, SW5=A ✓) และ ทุกเซกเมนต์ต้องมี DP 1 พอร์ต (A→D, B→E, C→F, D→B ✓)

ส่วนขยาย — จุดเสมอที่ Switch-1 ตอบได้ 2 แบบ ให้เขียนกฎที่ใช้กำกับไว้ด้วย

ที่ Switch-1 พอร์ต I และ J ได้ cost เท่ากัน (10 = 10) และ BPDU ทั้งสองก็มาจากสวิตช์เดียวกัน (Switch-2) จึงตกมาถึงกฎเรื่องหมายเลขพอร์ต ซึ่งตีความได้ 2 ทาง:

  • ตามตำรา (ที่หน้านี้ใช้) — กฎข้อ 4 ของ 15.1.4 "เลือกพอร์ตที่มีหมายเลขต่ำสุด" หมายถึงพอร์ตของตัวเอง → I < J → RP = I, block J
  • ตาม IEEE 802.1D จริง ๆ — เทียบ Port identifier ของผู้ส่ง ที่ติดมาใน BPDU: พอร์ต J รับ BPDU จากพอร์ต E ของ Switch-2 ส่วนพอร์ต I รับจากพอร์ต F เนื่องจาก E < F จึงได้ RP = J, block I

ข่าวดีคือ ต้นไม้ที่ได้สมมูลกันทั้งสองแบบ — Switch-1 มีพอร์ตใช้งานได้ 1 พอร์ตเท่ากัน จำนวนพอร์ตที่ถูก block ยังเป็น 2 เท่าเดิม และไม่มีลูปทั้งคู่ · เวลาทำข้อสอบให้เขียนกำกับไว้ว่าใช้กฎข้อไหนตัดสิน จะได้คะแนนขั้นตอนเต็มไม่ว่าอาจารย์เฉลยแบบไหน

ถ้าโจทย์เปลี่ยน priority ของ Switch-2 เป็น 100 คำตอบจะเปลี่ยนไหม? (ลองคิดก่อนกด)

เมื่อ Switch-2 มี priority 100 ค่า priority ต่ำสุดจะกลายเป็น 50 ของ Switch-4 ทันที → Root Bridge = Switch-4 (ไม่ต้องเทียบ MAC เพราะไม่มีใคร priority 50 ซ้ำ)

ผลคือต้องคำนวณ path cost ใหม่ทั้งหมด เพราะ "ระยะทาง" วัดจาก root คนใหม่ — พอร์ต G และ H ของ Switch-4 จะกลายเป็น DP ทั้งคู่ (cost 0) และพอร์ตที่เคยถูก block จะเปลี่ยนตำแหน่ง

บทเรียนที่ข้อสอบต้องการ

การเปลี่ยน priority ของสวิตช์ตัวเดียว ทำให้โครงสร้างทั้งเครือข่ายเปลี่ยน — นี่คือเหตุผลที่ในงานจริงเราตั้ง priority ต่ำ ๆ ให้สวิตช์แกนกลางที่แรงที่สุด เพื่อบังคับให้มันเป็น root แทนที่จะปล่อยให้ MAC address ตัดสินแบบสุ่ม

15.2Port States

ใน STP พอร์ตที่ต่อกับสวิตช์สามารถเป็นไปได้อยู่ 5 สถานะ (state) — พอร์ตจะไม่กระโดดจาก blocking ไป forwarding ทันที แต่ต้องไต่ผ่านสถานะกลางเพื่อป้องกันลูปชั่วคราวระหว่างที่ STP ยังคำนวณไม่เสร็จ

รูปที่ 15.8 ในตำราคือผังสถานะของเรื่องเดียวกัน — animation ด้านบนเดินไปตามเส้นทางปกติทีละสถานะพร้อมนาฬิกา ส่วนรูปนี้แสดงเส้นทางทั้งหมดที่เป็นไปได้ รวมทั้งทางลัดเข้า–ออก Disabled ที่ animation ไม่ได้เดินให้ดู:

ผังสถานะ: กล่อง Power Up อยู่บนสุด มีลูกศรทึบลงมาที่ Blocked แล้วลงต่อไปยัง Listening, Learning และ Forwarding ตามลำดับเป็นแถวตั้งทางซ้าย · ทางขวามีกล่อง Disabled · มีลูกศรประจาก Blocked, Listening, Learning และ Forwarding ชี้เข้าหา Disabled และมีลูกศรทึบจาก Disabled ชี้กลับไปที่ Blocked
รูปที่ 15.8 จากตำรา — Spanning Tree Port State Transition Process (จุดที่ต้องสังเกตสองจุด: ① เส้นทางปกติเป็นทางเดียววิ่งลง Power Up → Blocked → Listening → Learning → Forwarding ไม่มีทางลัดข้ามสถานะ · ② Disabled เข้าได้จากทุกสถานะ แต่ออกจาก Disabled แล้วต้องกลับไปเริ่มที่ Blocked เสมอ ไม่ได้กลับไปที่เดิมที่จากมา)
อ่านลูกศรในรูปที่ 15.8 ให้ครบ
  • Power Up → Blocked — เสียบสายปุ๊บ พอร์ตเริ่มที่ Blocked เสมอ ไม่ว่าสุดท้ายมันจะได้เป็น RP, DP หรือถูก block ก็ตาม
  • Blocked → Listening → Learning → Forwarding — เส้นทึบเรียงลงมาเป็นทางเดียว ห้ามข้าม · รวมเวลา 20 + 15 + 15 = 50 วินาที
  • ทุกสถานะ → Disabled (เส้นประ) — พอร์ตถูกปิดโดยผู้ดูแล ถูก disable เพราะปัญหาความมั่นคง หรือไม่ทำงานเพราะความไม่สมบูรณ์ ⇒ หลุดออกจากกระบวนการ STP ได้จากทุกจุด
  • Disabled → Blocked (เส้นทึบ) — พอเปิดพอร์ตกลับมา ต้องเริ่มไต่ใหม่ตั้งแต่ Blocked ⇒ กว่าจะ forward ได้อีกครั้งก็ต้องรออีก 50 วินาทีเต็ม ไม่ใช่กลับไปเป็น Forwarding ทันที
สถานะเวลารับ/ประมวลผล BPDUเรียน MAC addressส่งต่อเฟรมข้อมูล
Blocking20 วินาที (max age)✓ เฉพาะ BPDU✕✕ ทิ้งเฟรมอื่นทั้งหมด
Listening15 วินาที (forward delay)✓ เฉพาะ BPDU✕✕ ข้อมูลอื่นถูกกำจัด
Learning15 วินาที (forward delay)✓✓ เริ่มปรับตาราง MAC✕ ยังไม่ forward
Forwardingตลอดไป✓✓✓ ส่งต่อเฟรมได้เต็มที่
Disabled—✕ ไม่สนใจ STP✕✕

รายละเอียดแต่ละสถานะ

Blocking

พอร์ตจะอยู่ในสถานะนี้เมื่อเกิดกรณีต่อไปนี้

  • ระหว่างเลือกสวิตช์ที่จะเป็น root
  • เมื่อพบว่ามีเส้นทางอื่นที่ดีกว่าในการไปหา root สวิตช์ จากการรับข้อมูลจาก BPDU
  • เมื่อไม่ได้เป็นทั้ง root port และ designated port

โดยทั่วไปพอร์ตจะอยู่ในสถานะนี้ 20 วินาที ระหว่างนี้จะรับและประมวลผล BPDU ที่อินเตอร์เฟซเท่านั้น เฟรมอื่นที่รับได้จะถูกโยนทิ้ง ในระหว่างนี้พอร์ตจะหาว่าพอร์ตใดควรเป็น root หรือ designated และพอร์ตใดควรอยู่ในสถานะ blocking เพื่อป้องกันการเกิดลูป

Listening

ทุก 20 วินาที ตามเวลาที่ตั้งไว้ พอร์ตที่เป็น root และ designated จะเข้าสู่สถานะ listening (พอร์ตอื่นยังคงอยู่ใน blocking ต่อไป) ระหว่างนี้พอร์ตจะ listening BPDU และคอยตรวจสอบการเปลี่ยนแปลงของโทโพโลยีในเลเยอร์ 2 โดยประมวลผลเฉพาะ BPDU ส่วนข้อมูลอื่นถูกกำจัดไป พอร์ตจะอยู่ในสภาวะนี้ตามค่า forward delay timer ทั่วไปคือ 15 วินาที

Learning

หลังจาก listening พอร์ตที่เป็น root และ designated จะเข้าสู่ learning — ระหว่างนี้พอร์ตจะประมวลผล BPDU และเริ่มประมวลผลเฟรมที่มาจากผู้ใช้ด้วย เมื่อได้รับเฟรมจากผู้ใช้ สวิตช์จะปรับค่าตาราง MAC / port address แต่ยังไม่ส่งต่อ (forward) เฟรมออกไป พอร์ตจะอยู่ในสภาวะนี้ตามเวลา forward delay time ทั่วไปคือ 15 วินาที

Forwarding

หลังจากหมดเวลา forward delay time พอร์ตที่อยู่ในสภาวะ learning จะเปลี่ยนเป็น forwarding — พอร์ตเริ่มประมวลผลเฟรม BPDU, ปรับค่าตาราง MAC แอดเดรสจากเฟรมที่รับเข้ามา และส่งต่อ (forward) เฟรมออกไปยังพอร์ต

Disabled

เป็นสภาวะพิเศษ พอร์ตที่อยู่ในสภาวะนี้จะไม่สนใจ STP เนื่องจากพอร์ตอาจถูกปิดไปโดยผู้จัดการระบบ หรือถูก disable เนื่องจากปัญหาความมั่นคง หรือไม่ทำงานเนื่องจากความไม่สมบูรณ์

เวลาที่พอร์ตใช้กว่าจะ forward ได้ = 20 + 15 + 15 = 50 วินาที Blocking (max age 20) → Listening (forward delay 15) → Learning (forward delay 15) → Forwarding
จุดที่คนพลาดบ่อย

สับสนระหว่าง Listening กับ Learning — จำจากชื่อ: Listening = ฟังอย่างเดียว (ฟัง BPDU เพื่อจัดโครงสร้าง ยังไม่เรียน MAC) ส่วน Learning = เริ่มเรียน MAC แล้ว แต่ยังไม่ส่งต่อ · ทั้งสองสถานะใช้เวลาเท่ากันคือ forward delay = 15 วินาที และทั้งคู่ยัง forward ข้อมูลไม่ได้

เช็คความเข้าใจ

สวิตช์สองตัวใน LAN เดียวกัน — A: priority 32768, MAC 00-00-0C-00-00-01 · B: priority 4096, MAC 00-00-0C-FF-FF-FF ตัวไหนเป็น Root Bridge?
Bridge ID = priority (2 ไบต์) ต่อหน้า MAC (6 ไบต์) การเทียบจึงไล่จากซ้ายไปขวา → priority ตัดสินก่อนเสมอ 4096 < 32768 ดังนั้น B เป็น root แม้ MAC ของ B จะสูงกว่าก็ไม่มีผล เพราะ MAC จะถูกใช้ก็ต่อเมื่อ priority เท่ากันเท่านั้น · และ "priority สูง" ใน STP ไม่ได้แปลว่าสำคัญกว่า — ค่าน้อยต่างหากที่ชนะ
จากโจทย์ข้อสอบเก่าในหน้านี้ — พอร์ตไหนคือ Root Port ของ Switch-4?
Switch-4 คิดสองเส้นทาง — ผ่าน G: BPDU มาจาก Switch-5 ที่มี cost 10 บวก cost ของพอร์ตขารับ G (40) = 50 · ผ่าน H: BPDU มาจาก Switch-3 ที่มี cost 10 บวก cost ของพอร์ตขารับ H (20) = 30 → เลือกน้อยกว่าคือ H · หมายเหตุ: สวิตช์ที่ไม่ใช่ root มี root port ได้เพียง 1 พอร์ตเท่านั้น และ Switch-4 ไม่ได้เป็น root เพราะ Switch-2 มี priority 25 ซึ่งต่ำกว่า 50
สถานะไหนที่สวิตช์เรียน MAC address จากเฟรมผู้ใช้แล้ว แต่ยังไม่ส่งต่อ (forward) เฟรม?
Learning — ในสถานะนี้พอร์ตประมวลผล BPDU และเริ่มประมวลผลเฟรมจากผู้ใช้เพื่อปรับค่าตาราง MAC แต่ยังไม่ forward ใช้เวลาเท่ากับ forward delay = 15 วินาที · Blocking กับ Listening ประมวลผลเฉพาะ BPDU เท่านั้น (ยังไม่เรียน MAC) ส่วน Forwarding ทำได้ครบทุกอย่างแล้ว
จากโทโพโลยีข้อสอบเก่า (5 สวิตช์ · 4 LAN segment · 10 พอร์ต) จะมีพอร์ตที่ถูก Block ทั้งหมดกี่พอร์ต?
มองเป็นกราฟ: โหนด = 5 สวิตช์ + 4 เซกเมนต์ = 9 โหนด · ลิงก์ = พอร์ตทั้งหมด = 10 · ต้นไม้ที่ครอบคลุม 9 โหนดใช้กิ่งแค่ 9 − 1 = 8 กิ่ง ดังนั้นต้องตัดออก 10 − 8 = 2 พอร์ต ซึ่งก็คือ G (Switch-4) และ J (Switch-1) · ใช้สูตรนี้ตรวจคำตอบได้ทุกข้อ
Root Bridge ในเครือข่ายดับกะทันหัน ใช้เวลานานเท่าไรกว่าพอร์ตสำรองจะส่งข้อมูลผู้ใช้ได้จริง (ใช้ค่าปริยาย)
มีสามก้อนที่ต้องบวกกัน — ① สวิตช์อื่นต้องรอจนไม่ได้รับ BPDU ครบ maximum age = 20 วินาที ก่อนจึงยอมรับว่า root ล่มและเลือก root ใหม่ · ② พอร์ตที่เคยถูก block ต้องผ่าน Listening = forward delay 15 วินาที · ③ แล้วต่อด้วย Learning อีก 15 วินาที จึงเข้าสู่ Forwarding · รวม 50 วินาที · ข้อ "ทันที" ผิดเพราะการกระโดดข้ามสถานะคือสิ่งที่ทำให้เกิดลูปชั่วคราว ซึ่ง STP ตั้งใจกันไว้ · ส่วน 300 วินาทีคือค่า aging ของตาราง MAC คนละเรื่องกัน
จากรูปที่ 15.7 — B (32768.1.bbbb.bbbb.bbbb) และ C (32768.1.cccc.cccc.cccc) อยู่คนละปลายของลิงก์เดียวกัน ทั้งคู่ห่างจาก root เท่ากัน พอร์ตไหนถูก block และเพราะกฎข้อไหน
ไล่กฎของ designated port ตามลำดับ — ข้อ 1 path cost ไป root: เสมอ (ห่าง A หนึ่งลิงก์เท่ากัน) → ข้อ 2 switch ID ต่ำสุด: bbbb… < cccc… ⇒ B ชนะ ได้ e1/5 เป็น DP ⇒ พอร์ตที่เหลือบนเซกเมนต์นี้คือ e1/6 ของ C ซึ่งไม่ใช่ทั้ง RP และ DP จึงถูก block · ข้อ "ทั้งสองถูก block" ผิดเพราะทุกเซกเมนต์ต้องมี DP หนึ่งพอร์ตเสมอ ไม่งั้นเซกเมนต์นั้นจะถูกตัดขาด
รูปที่ 15.2 พิมพ์ว่า Port ID กว้าง 8 bytes แต่รูปที่ 15.3 และเนื้อความในตำราบอกว่า 2 ไบต์ ควรตอบเลขไหนและพิสูจน์ยังไง
วิธีตัดสินที่เถียงไม่ได้คือบวกความยาวทุกฟิลด์: 2+1+1+1+8+4+8+2+2+2+2+2 = 35 ไบต์ ซึ่งตรงกับขนาดของ Configuration BPDU · ถ้าใส่ 8 แทน จะได้ 41 ไบต์ ไม่ตรงกับอะไรเลย · เวลาสอบให้เขียนการบวกกำกับไว้ด้วย — ตอบเลขเปล่า ๆ ได้คะแนนน้อยกว่าตอบพร้อมวิธีพิสูจน์
เก็บก่อนออกจากบทนี้
  • Bridge ID = Priority (2 ไบต์) + MAC (6 ไบต์) — เทียบ priority ก่อน เท่ากันค่อยเทียบ MAC · ค่าน้อยชนะ · CISCO priority ปริยาย = 32,768
  • ขั้นตอน 3 ขั้น: ① Root Bridge (BID ต่ำสุด มีตัวเดียว ทุกพอร์ตเป็น DP) → ② Root Port (ทุกสวิตช์ที่ไม่ใช่ root ตัวละ 1 พอร์ต cost ต่ำสุด) → ③ Designated Port (ทุก segment ต้องมี 1 พอร์ต) · ที่เหลือ = Blocked
  • path cost บวกที่พอร์ตขารับ เท่านั้น — cost ของพอร์ตบน root ไม่เคยถูกนับ
  • ตัวเลข cost ที่ต้องจำ (Short): 10 Mbps = 100 · 100 Mbps = 19 · 1 Gbps = 4 · 10 Gbps = 2 · 40/100 Gbps = 1 · Long = 20 Tbps ÷ bandwidth
  • ลำดับ tie-break ของ Root Port: cost → BID ของสวิตช์ข้างเคียง → port priority (ปริยาย 32) → หมายเลขพอร์ต
  • Port States: Blocking 20s → Listening 15s → Learning 15s → Forwarding (รวม 50 วินาที) · Learning คือสถานะเดียวที่ "เรียน MAC แต่ยังไม่ forward" · Disabled ไม่ยุ่งกับ STP
  • ตรวจคำตอบเสมอ: จำนวนพอร์ตที่ block = จำนวนลิงก์ − (จำนวนโหนด − 1)
  • Configuration BPDU = 35 ไบต์ · Flags ใช้จริงแค่ 2 บิต — บิต 7 = TC และ บิต 0 = TCA · 10000000 ที่เป็น BPDU type แปลว่า TC-BPDU ส่วน 10000000 ที่เป็น flag แปลว่าธง Topology Change
  • กรณีที่ผิดพลาดที่ต้องตอบให้ได้: ① root ล่ม ⇒ เงียบ 50 วินาที (20 max age + 15 listening + 15 learning) · ② ไม่มี TC-BPDU ⇒ แอดเดรสเก่าค้าง ~300 วินาที ทั้งที่เส้นทางสำรองพร้อมแล้ว · ③ มีสวิตช์ที่ไม่พูด 802.1d ในวง ⇒ ลูปไม่ถูกกำจัด แม้จะ "เปิด STP ไว้แล้ว" · ④ พอร์ตข้ามจาก Blocking ไป Forwarding ทันที ⇒ ลูปชั่วคราว + broadcast storm
  • พอร์ตที่ถูก block ยังฟังและประมวลผล BPDU อยู่ แค่ไม่ forward ข้อมูลผู้ใช้ · และออกจาก Disabled แล้วต้องกลับไปเริ่มที่ Blocked เสมอ (รูปที่ 15.8)