Spanning Tree Protocol
เมื่อ LAN มีสวิตช์หลายตัวต่อกันจนเกิด ลูป เฟรมจะวนไม่จบและเครือข่ายล่ม STP แก้ปัญหานี้ด้วยการ "ตัดกิ่งส่วนเกิน" ให้เหลือเป็นต้นไม้เส้นทางเดียว — บทนี้คือ ขั้นตอน 3 ขั้น ที่ต้องท่องให้ได้: หา Root Bridge → หา Root Port → หา Designated Port ที่เหลือคือ Blocked
บทนี้ออกเป็น ข้อสอบ Q10 (10 คะแนน) ตรง ๆ — ให้โทโพโลยีมาพร้อมตาราง priority/MAC ของสวิตช์ทุกตัว และ cost ของทุกพอร์ต แล้วให้ตอบว่า
- สวิตช์ตัวไหนเป็น Root Bridge (พร้อมเหตุผล)
- พอร์ตไหนของแต่ละสวิตช์เป็น Root Port (พร้อมค่า path cost)
- ในแต่ละ LAN segment พอร์ตไหนเป็น Designated Port และพอร์ตไหนถูก Block
15.0ทำไมต้องมี STP
เพื่อรองรับผู้ใช้จำนวนมาก เครือข่ายหนึ่งอาจต้องใช้สวิตช์มากกว่าหนึ่งตัว จึงต้องเชื่อมสวิตช์แต่ละตัวเข้าด้วยกัน — และการเชื่อมแบบนี้เองที่ทำให้เกิด ลูป (loop) ขึ้นได้ ผลคือเฟรมถูกส่งต่อจากสวิตช์หนึ่งไปอีกสวิตช์หนึ่ง อย่างไม่สิ้นสุด ทำให้ประสิทธิภาพของเครือข่ายลดลง
"ทำไมเฟรมไม่ตายไปเองล่ะ?" — เพราะเฟรมของเลเยอร์ 2 ไม่มีฟิลด์ TTL / Hop count เหมือนแพ็กเก็ต IP ในเลเยอร์ 3 พอไม่มีตัวนับอายุ เฟรมที่ติดอยู่ในลูปจึงวนได้ตลอดกาลจนกว่าจะปิดสวิตช์ นี่คือเหตุผลที่ปัญหา loop ในเลเยอร์ 2 รุนแรงกว่าเลเยอร์ 3 มาก และเป็นเหตุผลที่ต้องมีโปรโตคอลมาตัดลูปให้ตั้งแต่ต้น
ตำราสรุปสั้น ๆ ว่า "ส่งต่อกันไม่สิ้นสุด ประสิทธิภาพลดลง" ในทางปฏิบัติอาการที่เห็นแยกได้เป็น 3 อย่าง:
- Broadcast storm — เฟรมบรอดคาสท์ (เช่น ARP request) ถูก flood วนซ้ำและทวีคูณทุกรอบ จนแบนด์วิดท์และ CPU ของสวิตช์เต็ม
- Multiple frame copies — ปลายทางได้รับเฟรมเดียวกันหลายสำเนา ซึ่งโปรโตคอลชั้นบนไม่ได้ออกแบบมารองรับ
- MAC table instability (MAC flapping) — สวิตช์เห็น MAC ต้นทางเดิมเข้ามาจากคนละพอร์ตสลับไปมา ตาราง MAC จึงถูกเขียนทับตลอดเวลาและใช้ตัดสินใจ forward ไม่ได้
ที่มาของมาตรฐาน
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 "หน้าตายังไง" คือฟิลด์ไหนกว้างกี่ไบต์เรียงจากซ้ายไปขวา:
Flags ทั้ง 8 บิต ใช้จริงแค่ 2 บิต คือบิต 7 = TC และบิต 0 = TCA ที่เหลือเป็น Unused)ฟิลด์ใน Configuration BPDU
| ฟิลด์ | ขนาด | หน้าที่ |
|---|---|---|
| Protocol identifier | 2 ไบต์ | ระบุถึงอัลกอริทึมของ spanning tree และโปรโตคอลที่กำหนดไว้ใน 802.1 โดยมีค่าเป็นศูนย์ทั้งหมด |
| Protocol version identifier | 1 ไบต์ | กำหนดเวอร์ชันของมาตรฐาน มีค่าเป็นศูนย์ |
| BPDU type | 1 ไบต์ | ประเภทของ BPDU — สำหรับ Configuration BPDU จะกำหนดให้เป็นศูนย์ทั้งหมด |
| Flags | 1 ไบต์ | กำหนดว่าเป็น BPDU เพื่อแจ้งการเปลี่ยนแปลงโทโพโลยี (Topology Change flag) หรือเพื่อตอบกลับการเปลี่ยนแปลง (Topology Change Acknowledgment flag) |
| Root identifier | 8 ไบต์ | แอดเดรสของ root bridge ที่สวิตช์ผู้ส่ง BPDU นี้เชื่อว่าเป็น root bridge ประกอบด้วย 2 ไบต์ของ priority + 6 ไบต์ของ MAC address |
| Root path cost | 4 ไบต์ | ค่า path cost จากสวิตช์ที่ส่ง ไปยังสวิตช์ที่เชื่อว่าเป็น root bridge |
| Bridge identifier | 8 ไบต์ | แอดเดรสของสวิตช์ที่ส่ง BPDU นี้ ประกอบด้วย 2 ไบต์ของ priority + 6 ไบต์ของ MAC address |
| Port identifier | 2 ไบต์ | หมายเลขของพอร์ตที่ส่ง BPDU นี้ |
| Message age | 2 ไบต์ | อายุของ configuration message ตั้งแต่ถูกสร้างขึ้นโดย root — หากอายุมากกว่าที่กำหนด BPDU จะถูกกำจัดทิ้ง |
| Maximum age | 2 ไบต์ | เวลาสูงสุดที่ควรจะกำจัด configuration message ออกไป |
| Hello time | 2 ไบต์ | ช่วงเวลาของการส่ง configuration message ของ root |
| Forward delay | 2 ไบต์ | เวลา 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, 1 | Unused | ไม่ได้ใช้ |
| 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
ถ้าเทียบรูปที่ 15.2 กับรูปที่ 15.3 ทีละช่อง จะเจอว่ามีช่องหนึ่งไม่ตรงกัน และชื่อฟิลด์บางช่องก็เรียกคนละแบบ:
| ฟิลด์ | เนื้อความในตำรา | รูปที่ 15.3 | รูปที่ 15.2 | ยึดอันไหน |
|---|---|---|---|---|
| Port identifier | 2 ไบต์ | 2 | 8 bytes | 2 ไบต์ — เพราะบวกทั้งแพ็กเก็ตแล้วต้องได้ 35 ไบต์พอดี (ถ้าเป็น 8 จะกลายเป็น 41) |
| BPDU type | BPDU type | Message Type | Type | ชื่อต่างกันเฉย ๆ · ฟิลด์เดียวกัน ขนาด 1 ไบต์ |
| Maximum age | Maximum age | Maximum Time | Max Age | ชื่อต่างกันเฉย ๆ · ฟิลด์เดียวกัน ขนาด 2 ไบต์ ค่าปกติ 20 วินาที |
| Bridge identifier | Bridge identifier | Bridge ID | Sender Bridge ID | ชื่อของรูปที่ 15.2 ชัดที่สุด — มันคือ BID ของผู้ส่ง BPDU ใบนี้ ไม่ใช่ของ root |
เวลาสอบให้เขียน 2 ไบต์ แล้วโชว์การบวกให้ครบ 35 ไบต์กำกับไว้ — เป็นวิธีพิสูจน์ตัวเองที่อาจารย์ตรวจแล้วเถียงไม่ได้
ถ้าจำได้แค่ 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 คือทำให้ทุกสวิตช์ล้างตาราง 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 priority | 2 ไบต์ | ค่าความสำคัญของบริดจ์ — ของ CISCO ถูกกำหนดให้เป็น 32,768 โดยปริยาย |
| MAC address | 6 ไบต์ | ค่า MAC address ของบริดจ์นั้น |
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 กันครบ:
aaaa… เล็กกว่า bbbb… และ cccc… ในขณะที่ priority เท่ากันหมดที่ 32768)ทั้งสามตัวใช้ 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 = 0 | A ดับ → หยุดส่ง BPDU · แต่ B และ C ยังไม่รู้ ยังเชื่อว่า A เป็น root และยังคง block พอร์ตส่วนเกินไว้เหมือนเดิม | ✕ ขาด |
0 → 20 s | B และ 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 s | Learning 15 วินาที — เริ่มเรียน MAC จากเฟรมผู้ใช้ แต่ยังไม่ forward | ✕ ยังขาด |
t = 50 s | เข้าสู่ Forwarding — ข้อมูลผู้ใช้เริ่มวิ่งผ่านเส้นทางใหม่ได้จริง | ✓ กลับมาแล้ว |
นี่คือ "ราคา" ของ 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 Method | Long-Path Cost Method |
|---|---|---|
| 10 Mbps | 100 | 2,000,000 |
| 100 Mbps | 19 | 200,000 |
| 1 Gbps | 4 | 20,000 |
| 10 Gbps | 2 | 2,000 |
| 40 Gbps | 1 | 500 |
| 100 Gbps | 1 | 200 |
ตารางที่ 15.1 — พอร์ต Costs ของ STP
Short
กำหนดไว้ใน spanning tree เวอร์ชันดั้งเดิม แยกความเร็วที่สูงกว่า 20 Gbps ไม่ได้ — สังเกตว่า 40 Gbps กับ 100 Gbps ได้ cost = 1 เท่ากัน
Long
สร้างขึ้นเพื่อแก้ข้อจำกัดของ short กำหนดในมาตรฐาน IEEE 802.1t คำนวณได้จาก 20 Tbps ÷ แบนด์วิดท์ (bit/s)
นอกจากนั้นแต่ละพอร์ตยังตั้งค่าความสำคัญได้ เรียกว่า 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 ส่ง 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 โดยเลือกตามลำดับดังนี้ (ข้อบนตัดสินก่อน ถ้าเสมอจึงลงข้อถัดไป)
- เลือกเส้นทางที่มีผลรวมของ path cost ไปยัง root ที่มีค่าน้อยที่สุด
- หากผลรวม path cost เท่ากัน ให้เลือกสวิตช์ที่อยู่ติดกันที่มีค่า switch ID ต่ำสุด
- หากมีหลายเส้นทางที่จะไปยังสวิตช์ติดกัน (ตัวเดียวกัน) ให้เลือกพอร์ตที่มีค่าความสำคัญ (port priority) ต่ำสุด
- หากค่าความสำคัญเท่ากัน ให้เลือกพอร์ตตามหมายเลขของพอร์ตที่มีค่าต่ำสุด เช่น
FastEthernet 0/1
root bridge ไม่มี root port — เพราะมันคือ root อยู่แล้ว ไม่ต้องหาทางไปหาตัวเอง · และสวิตช์ที่ไม่ใช่ root ต้องมี root port หนึ่งพอร์ตเสมอ (และมีได้แค่พอร์ตเดียว)
15.1.5Designate Port
แต่ละสวิตช์จะมีหนึ่งพอร์ตที่เป็น root port เพื่อส่งเฟรมไปหา root ส่วนพอร์ตที่เหลือเรียกว่า designated port รวมถึงกรณีที่มีสวิตช์มากกว่าหนึ่งตัวในเซกเมนต์เดียวกัน จึงต้องเลือก designated port ซึ่งทำได้ดังนี้
- เลือกสวิตช์ที่ต่อในเซกเมนต์นั้นที่มีผลรวมของ path cost ไปยัง root ต่ำที่สุด
- ถ้าผลรวม path cost เท่ากันระหว่างสองสวิตช์ จะเลือกสวิตช์ที่มีค่า switch ID ต่ำสุด
- ถ้าพบว่าเป็นสวิตช์เดียวกัน แต่มีการเชื่อมต่อสองเส้นไปยัง LAN เซกเมนต์ จะเลือกพอร์ตที่มีค่าความสำคัญ (priority) ต่ำสุด
- หากค่าความสำคัญเท่ากันอีก ให้เลือกพอร์ตของสวิตช์ที่มีหมายเลขต่ำสุด
ข้อสำคัญ: ทุกพอร์ตของ root สวิตช์จะเป็น designated port ทั้งหมด เนื่องจากค่า cost ที่ต่อไปยังเซกเมนต์ของเครือข่ายมีค่าเป็น 0 ซึ่งเป็นค่าที่ต่ำสุด หรืออีกนัยหนึ่งคือ เซกเมนต์นั้นต่ออยู่กับ root สวิตช์โดยตรง จึงไม่มีค่า cost ใด ๆ ในการที่จะไปยัง root
ไล่รูปที่ 15.7 ทีละกฎ — ทำไม e1/6 ของ C ถึงเป็นพอร์ตที่ "แพ้"
เซกเมนต์ที่ยังไม่มีใครได้บทบาทคือลิงก์ระหว่าง B (e1/5) กับ C (e1/6) ไล่ตามกฎ 4 ข้อของหัวข้อ 15.1.5 ทีละข้อ:
| กฎ | เทียบอะไร | ฝั่ง B (e1/5) | ฝั่ง C (e1/6) | ผล |
|---|---|---|---|---|
| ข้อ 1 | path cost ไป root ต่ำสุด | ห่าง A หนึ่งลิงก์ | ห่าง A หนึ่งลิงก์ | เสมอ → ไปข้อ 2 |
| ข้อ 2 | switch ID (Bridge ID) ต่ำสุด | 32768.1.bbbb.bbbb.bbbb | 32768.1.cccc.cccc.cccc | bbbb < cccc ⇒ B ชนะ |
| ข้อ 3–4 | port priority / หมายเลขพอร์ต | ไม่ต้องใช้ เพราะตัดสินจบตั้งแต่ข้อ 2 | — | |
ผลลัพธ์: e1/5 ของ B = Designated Port · e1/6 ของ C = Blocked ตรงกับที่รูปเขียนไว้ · สังเกตว่า C ไม่ได้ "เสีย" อะไรเลย — มันยังมี e1/3 เป็น root port ใช้คุยกับ A ได้ตามปกติ แค่ทางลัด C→B ถูกปิดไว้เฉย ๆ เพื่อไม่ให้ครบวง
พอร์ตที่ถูก block ยังรับและประมวลผล BPDU อยู่ตลอดเวลา (ดูหัวข้อ 15.2 สถานะ Blocking) มันแค่ไม่ส่งต่อเฟรมข้อมูลของผู้ใช้ เท่านั้น · นี่คือเหตุผลที่มันรู้ตัวได้ทันทีเมื่อ BPDU หายไปเกิน maximum age แล้วเข้าคิวไต่ขึ้นมาเป็น forwarding แทน · ตอบว่า "พอร์ตถูกปิด/ตัดขาด" จะเสียคะแนน — ต้องตอบว่า "ยังฟัง BPDU อยู่ แต่ไม่ forward ข้อมูล"
- Root Bridge — Bridge ID ต่ำสุดในเครือข่าย มีได้ 1 ตัวเท่านั้น ทุกพอร์ตของมันเป็น DP
- Root Port — ของทุกสวิตช์ที่ไม่ใช่ root ตัวละ 1 พอร์ต คือพอร์ตที่มี path cost ไป root ต่ำสุด (เสมอ → เทียบ BID ของสวิตช์ข้างเคียง → เทียบ port ID)
- Designated Port — ทุก segment/link ต้องมี DP หนึ่งพอร์ต คือฝั่งที่ path cost ไป root ต่ำกว่า
- พอร์ตที่ไม่ใช่ทั้ง RP และ DP → ถูก Block (ตัดลูปตรงนี้เอง)
หลายคนไล่หา RP ครบแล้วก็หยุด แล้วเดาว่าที่เหลือ block ทั้งหมด — ผิด ต้องไล่ทีละ segment ก่อนว่าใครเป็น DP เพราะ ทุก segment ต้องมี DP หนึ่งพอร์ตเสมอ (ไม่งั้นเซกเมนต์นั้นจะถูกตัดขาดจากเครือข่าย) พอร์ตที่เหลือหลังจากแจก RP และ DP ครบแล้วเท่านั้นจึงจะเป็น Blocked
ตัวอย่างเต็มรูปแบบ — โจทย์ข้อสอบเก่า
โจทย์ — เครือข่ายหนึ่งมีสวิตช์ 5 ตัว เชื่อมกันผ่าน LAN segment 4 เซกเมนต์ ข้อมูลของสวิตช์และพอร์ตเป็นดังนี้ จงหา Root Bridge, Root Port ของทุกสวิตช์, Designated Port ของทุกเซกเมนต์ และพอร์ตที่ถูก Block
| สวิตช์ | Priority | MAC Address | พอร์ต (cost) |
|---|---|---|---|
| Switch-1 | 100 | 0000.0001.1234 | I (10), J (10) |
| Switch-2 | 25 | 0001.0001.0001 | E (20), F (10) |
| Switch-3 | 150 | 0001.0000.AC1D | C (10), D (20) |
| Switch-4 | 50 | 0000.0001.1787 | G (40), H (20) |
| Switch-5 | 100 | 0000.0001.A134 | A (10), B (10) |
| LAN Segment | พอร์ตที่ต่ออยู่ |
|---|---|
| Segment-A | H (Switch-4), D (Switch-3) |
| Segment-B | A (Switch-5), E (Switch-2), J (Switch-1) |
| Segment-C | C (Switch-3), F (Switch-2), I (Switch-1) |
| Segment-D | B (Switch-5), G (Switch-4) |
สังเกต: สวิตช์ทุกตัวมี 2 พอร์ต · รวม 10 พอร์ต (= 10 ลิงก์) · โหนดในกราฟ = 5 สวิตช์ + 4 เซกเมนต์ = 9 โหนด
- Segment-B มี 3 พอร์ต คือ A, E และ J — เพราะโจทย์ระบุเพิ่มว่า "J ต่อ Segment-B"
- path cost บวกที่พอร์ตขารับ ตามหัวข้อ 15.1.3 ของตำรา ผลคือ cost ของพอร์ต E (20) และ F (10) ซึ่งอยู่บน root bridge ไม่ถูกนำไปบวกในเส้นทางของสวิตช์ใดเลย
- port priority ของทุกพอร์ตเท่ากัน (ค่าปกติ 32) จึงต้องตัดสินด้วยหมายเลขพอร์ต โดยเรียงตามตัวอักษร A < B < … < J
- โจทย์นี้เกิดเสมอกันหนึ่งจุดที่ 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)
ขั้นที่ 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-A | D → SW3 = 10 · H → SW4 = 30 | D | H เป็น RP ของ SW4 อยู่แล้ว |
| Segment-B | E → SW2 = 0 · A → SW5 = 10 · J → SW1 = 10 | E | A เป็น RP ของ SW5 · J ไม่ใช่ทั้ง RP และ DP → Block |
| Segment-C | F → SW2 = 0 · C → SW3 = 10 · I → SW1 = 10 | F | C เป็น RP ของ SW3 · I เป็น RP ของ SW1 → ไม่มีพอร์ตถูก block |
| Segment-D | B → SW5 = 10 · G → SW4 = 30 | B | G ไม่ใช่ทั้ง RP และ DP → Block |
คำตอบสุดท้าย
| สวิตช์ | Bridge ID (priority : MAC) | cost ไป root | Root Port | Designated Port | Blocked |
|---|---|---|---|---|---|
| Switch-2 ★ | 25 : 0001.0001.0001 | 0 | — (เป็น root) | E, F | — |
| Switch-1 | 100 : 0000.0001.1234 | 10 | I | — | J |
| Switch-3 | 150 : 0001.0000.AC1D | 10 | C | D | — |
| Switch-4 | 50 : 0000.0001.1787 | 30 | H | — | G |
| Switch-5 | 100 : 0000.0001.A134 | 10 | A | B | — |
Spanning tree ที่ถูกต้องต้องเป็นต้นไม้ — โหนด n ตัวต้องเหลือกิ่ง n − 1 กิ่ง โจทย์นี้มี
ได้ 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 พอร์ต 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 — เสียบสายปุ๊บ พอร์ตเริ่มที่ Blocked เสมอ ไม่ว่าสุดท้ายมันจะได้เป็น RP, DP หรือถูก block ก็ตาม
- Blocked → Listening → Learning → Forwarding — เส้นทึบเรียงลงมาเป็นทางเดียว ห้ามข้าม · รวมเวลา 20 + 15 + 15 = 50 วินาที
- ทุกสถานะ → Disabled (เส้นประ) — พอร์ตถูกปิดโดยผู้ดูแล ถูก disable เพราะปัญหาความมั่นคง หรือไม่ทำงานเพราะความไม่สมบูรณ์ ⇒ หลุดออกจากกระบวนการ STP ได้จากทุกจุด
- Disabled → Blocked (เส้นทึบ) — พอเปิดพอร์ตกลับมา ต้องเริ่มไต่ใหม่ตั้งแต่ Blocked ⇒ กว่าจะ forward ได้อีกครั้งก็ต้องรออีก 50 วินาทีเต็ม ไม่ใช่กลับไปเป็น Forwarding ทันที
| สถานะ | เวลา | รับ/ประมวลผล BPDU | เรียน MAC address | ส่งต่อเฟรมข้อมูล |
|---|---|---|---|---|
| Blocking | 20 วินาที (max age) | ✓ เฉพาะ BPDU | ✕ | ✕ ทิ้งเฟรมอื่นทั้งหมด |
| Listening | 15 วินาที (forward delay) | ✓ เฉพาะ BPDU | ✕ | ✕ ข้อมูลอื่นถูกกำจัด |
| Learning | 15 วินาที (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 เนื่องจากปัญหาความมั่นคง หรือไม่ทำงานเนื่องจากความไม่สมบูรณ์
สับสนระหว่าง Listening กับ Learning — จำจากชื่อ: Listening = ฟังอย่างเดียว (ฟัง BPDU เพื่อจัดโครงสร้าง ยังไม่เรียน MAC) ส่วน Learning = เริ่มเรียน MAC แล้ว แต่ยังไม่ส่งต่อ · ทั้งสองสถานะใช้เวลาเท่ากันคือ forward delay = 15 วินาที และทั้งคู่ยัง forward ข้อมูลไม่ได้
เช็คความเข้าใจ
00-00-0C-00-00-01 · B: priority 4096, MAC 00-00-0C-FF-FF-FF ตัวไหนเป็น Root Bridge?32768.1.bbbb.bbbb.bbbb) และ C (32768.1.cccc.cccc.cccc) อยู่คนละปลายของลิงก์เดียวกัน ทั้งคู่ห่างจาก root เท่ากัน พอร์ตไหนถูก block และเพราะกฎข้อไหนbbbb… < cccc… ⇒ B ชนะ ได้ e1/5 เป็น DP ⇒ พอร์ตที่เหลือบนเซกเมนต์นี้คือ e1/6 ของ C ซึ่งไม่ใช่ทั้ง RP และ DP จึงถูก block · ข้อ "ทั้งสองถูก block" ผิดเพราะทุกเซกเมนต์ต้องมี DP หนึ่งพอร์ตเสมอ ไม่งั้นเซกเมนต์นั้นจะถูกตัดขาด- 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)