Implementing Spanning Tree Protocol on Cisco Switches
ต่อสวิตช์สามตัวเป็นสามเหลี่ยม (มีลูปเต็ม ๆ) แล้วดูว่า STP เลือก Root Bridge อย่างไร บล็อกพอร์ตไหน · บังคับ Root ด้วย priority 4096 · ดึงสายแล้วจับเวลาที่พอร์ตสำรองไต่ Listening → Learning → Forwarding · ปิด STP แล้วดูเน็ตล่มด้วยตาตัวเอง
ทำอะไร — เตรียม FTP Server + iperf3 + Wireshark I/O Graph มาก่อนเข้าห้อง แล้วในห้อง: ต่อสวิตช์ 3 ตัวเป็นวงสามเหลี่ยม (รูปที่ 13) ให้ทุกตัวอยู่บน VLAN 9 → show spanning-tree ดูว่าใครเป็น root และพอร์ตไหนถูกบล็อก → ปรับ priority ให้ root ย้ายตัว → โอนไฟล์ ≥30 MB ผ่าน FTP พร้อมดู I/O Graph → ดึงสายระหว่างโอน → ปิด STP แล้วโอนอีกครั้ง (เน็ตจะล่ม) → วัดความเร็วด้วย iperf3 10 รอบหาค่าเฉลี่ย
ได้อะไร — อ่านผล show spanning-tree ออกทุกบรรทัด รู้ว่า Root ID / Bridge ID / Cost / Role / State อยู่ตรงไหน และเห็นด้วยตาว่าลูปเลเยอร์ 2 ทำให้เน็ตตายได้จริง เพราะเฟรมเลเยอร์ 2 ไม่มี TTL
ออกสอบตรงไหน — ทฤษฎีทั้งก้อนคือ บทที่ 15 ซึ่งออกข้อเขียนแน่ (คำนวณ Root Bridge / Root Port / Designated Port) · ส่วนแลปปีที่แล้วไม่มีข้อ STP ตรง ๆ แต่คำสั่ง VLAN ในแลปนี้คือข้อ 3 และ Wireshark filter คือข้อ 2 → §5.16
5.1เป้าหมายและสิ่งที่ต้องส่ง
| # | สิ่งที่ใบแลปสั่ง | อยู่ที่ไหน |
|---|---|---|
| 1 | เตรียมก่อนเข้าห้อง — ติดตั้งและตั้งค่า FTP Server (ใบแลปใช้ FileZilla Server ของ Windows) ไม่เตรียม = โดนหักคะแนน | §5.2 |
| 2 | ติดตั้งและใช้งาน iperf3 เพื่อจำลองการส่ง packet ไปยังเซิร์ฟเวอร์ | §5.3 |
| 3 | ใช้ Wireshark ในการ Filter และดู I/O Graph | §5.4 |
| 4 | บทนำ — STP คืออะไร มาจากไหน (DEC → IEEE 802.1d) และหลักการเลือกเส้นทาง 3 ขั้น | §5.5 · §5.6 |
| 5 | BPDU คือเฟรมอะไร มีข้อมูลอะไรบ้าง | §5.7 |
| 6 | คำสั่งที่เกี่ยวข้อง Listing 1–8 — VLAN, STP, Priority, Mirror | §5.9 |
| 7 | ต่ออุปกรณ์ตามรูปที่ 13 กำหนด IP ให้เหมาะสม · ทุกสวิตช์อยู่บน VLAN 9 · เปิด Wireshark ดักจับตลอด | §5.10 |
| 8 | 4.1 สังเกตไฟบนสวิตช์ว่าเป็นสีส้มหรือไม่ เพราะเหตุใด | §5.11 |
| 9 | 4.2 กำหนด Priority ให้สวิตช์ · วาดรูปการเชื่อมต่อและระบุสถานะของพอร์ต ทั้งก่อนและหลัง | §5.11 |
| 10 | 4.3–4.4 โอนไฟล์ ≥ 30 MB ด้วย FTP + ดู I/O Graph · แล้วดึงสายระหว่างโอน | §5.11 |
| 11 | 4.5 โอนข้อมูลโดยยกเลิก STP (ระวังเครื่องค้าง) แล้วบันทึกเวลาและผลจากกราฟ | §5.11 |
| 12 | 4.6 หาความเร็ว transfer ด้วย iperf3 ซ้ำ 10 ครั้ง แล้วหาค่าเฉลี่ย | §5.11 |
| 13 | 5. อภิปราย — เปรียบเทียบผล show spanning-tree ตั้งแต่กำหนด Priority · ติดตั้ง · และยกเลิก STP | §5.15 |
| 14 | 6. คำถามท้ายการทดลอง — ดักจับ BPDU จาก Wireshark แล้วแสดงค่าที่เกี่ยวข้องกับ STP | §5.15 |
ใบแลปเขียนแค่ "พร้อมกำหนด IP ให้เหมาะสม" ไม่ได้ให้ตารางมา — ตารางนี้เป็นส่วนขยายที่แทนค่ารหัส 673040128-3 ลงไปแล้ว (x = 3 คือเลขหลังขีด · y = 128 คือสามตัวก่อนขีด mod 254) · ทุกเครื่องอยู่วงเดียวกันหมด เพราะ STP เป็นเรื่องของเลเยอร์ 2 ล้วน ๆ ไม่ต้องมี router
| อุปกรณ์ | บทบาท | IP | Subnet Mask | VLAN |
|---|---|---|---|---|
| MacBook Air M2 | FTP Client + iperf3 Client | 192.3.128.2 | 255.255.255.0 | 9 |
| เครื่อง Wireshark | ดักจับทราฟฟิก (เสียบที่ Root Bridge) | 192.3.128.3 | 255.255.255.0 | 9 |
| FTP / iperf3 Server | เครื่องที่รัน FTP server + iperf3 -s | 192.3.128.10 | 255.255.255.0 | 9 |
| SW1 (ตัวบน) | สวิตช์ · จัดการผ่าน interface vlan 9 | 192.3.128.101 | 255.255.255.0 | 9 |
| SW2 (ล่างซ้าย) | สวิตช์ · ฝั่ง FTP Client | 192.3.128.102 | 255.255.255.0 | 9 |
| SW3 (ล่างขวา) | สวิตช์ · ฝั่ง FTP Server | 192.3.128.103 | 255.255.255.0 | 9 |
ไม่ต้องมี default gateway เพราะไม่ได้ข้ามวง · IP ของสวิตช์มีไว้แค่ให้ ping ทดสอบและ telnet เข้าไปดูได้เท่านั้น ไม่ได้จำเป็นต่อการทำงานของ STP (STP ทำงานที่เลเยอร์ 2 ไม่สนใจ IP เลย)
5.2เตรียม FTP Server — ทางของ Mac แทน FileZilla
ใบแลปหน้า 1–6 (รูปที่ 1–11) เป็นขั้นตอนติดตั้ง FileZilla Server สำหรับ Windows ทั้งหมด — MacBook Air M2 ทำตามไม่ได้ เพราะ FileZilla Server ไม่มีรุ่น macOS (มีแต่ FileZilla Client) หัวข้อนี้จึงแปลงเป้าหมายของใบแลปมาเป็นเส้นทางของ Mac ให้ครบ
- มี FTP server ฟังอยู่ที่พอร์ต 21 ของเครื่องหนึ่งในวง
- ยอมให้ต่อแบบ plain FTP ไม่เข้ารหัส (ในรูปที่ 8 คือเปลี่ยน Protocol จาก Require explicit FTP over TLS เป็น Explicit FTP over TLS and insecure plain FTP) — เพราะต้องให้ Wireshark อ่านออก
- มี user + password อย่างน้อยหนึ่งชุด (รูปที่ 9–10)
- ชี้ path ว่าจะให้เครื่องอื่นเข้าถึงโฟลเดอร์ไหน — Virtual path
/→ Native path = โฟลเดอร์จริง (รูปที่ 11) และในโฟลเดอร์นั้นต้องมีไฟล์ขนาดอย่างน้อย 30 MB
วิธีที่ง่ายที่สุดบน Mac — pyftpdlib (คำสั่งเดียวจบ)
- ติดตั้งไลบรารี — ทำครั้งเดียว ตอนที่ยังมีเน็ต (ที่บ้าน) อย่ารอไปทำในห้องแลป
[macOS Terminal] — ทำที่บ้าน ก่อนเข้าห้อง
$ pip3 install pyftpdlib # ถ้าขึ้น error: externally-managed-environment (Python 3.12+ / Homebrew) # ให้ใช้บรรทัดใดบรรทัดหนึ่งข้างล่างแทน $ pip3 install --user pyftpdlib $ pip3 install --break-system-packages pyftpdlib - สร้างโฟลเดอร์แชร์ + ไฟล์ทดสอบ ≥ 30 MB (ใบแลปบังคับว่าไฟล์ต้องไม่ต่ำกว่า 30 Mbytes)
[macOS Terminal]
$ mkdir -p ~/ftpshare && cd ~/ftpshare $ mkfile 50m test50m.bin # mkfile มีเฉพาะบน macOS · เร็วมาก $ ls -lh test50m.bin # -rw------- 1 pisit staff 50M ... test50m.bin # ถ้าไม่มี mkfile (เช่นทำใน Ubuntu VM) ใช้ dd แทน $ dd if=/dev/urandom of=test50m.bin bs=1m count=50 - สั่งเซิร์ฟเวอร์ขึ้น — พอร์ต 21 เป็นพอร์ตต่ำกว่า 1024 จึงต้องมี
sudo[macOS Terminal] — หน้าต่างนี้ปล่อยค้างไว้ ห้ามปิด$ sudo python3 -m pyftpdlib -p 21 -w -d ~/ftpshare # [I] concurrency model: async # [I] masquerade (NAT) address: None # [I] passive ports: None # [I] >>> starting FTP server on 0.0.0.0:21, pid=… <<<ตัวเลือก ทำอะไร -p 21พอร์ตที่ฟัง — ต้องเป็น 21 ให้ตรงกับรูปที่ 8 ของใบแลป ไม่งั้น Wireshark filter tcp.port == 21จะไม่เจอ-wอนุญาตให้เขียนได้ด้วย (write) — ถ้าจะให้อ่านอย่างเดียวก็ตัดออกได้ -d ~/ftpshareโฟลเดอร์ที่จะแชร์ = Native path ในรูปที่ 11 -u lab -P lab123ส่วนขยายตั้ง username / password แทนการล็อกอินแบบ anonymous— ตรงกับรูปที่ 9–10 ที่ใบแลปให้ Add User - ตรวจว่าเซิร์ฟเวอร์ขึ้นจริง — เปิด Terminal หน้าต่างที่สอง (อย่าปิดหน้าต่างแรก)
[macOS Terminal — หน้าต่างที่ 2]
# ① พอร์ต 21 เปิดจริงไหม $ nc -vz 127.0.0.1 21 # Connection to 127.0.0.1 port 21 [tcp/ftp] succeeded! # ② ใครถือพอร์ต 21 อยู่ $ sudo lsof -nP -iTCP:21 -sTCP:LISTEN # Python 4821 root ... TCP *:21 (LISTEN) # ③ คุยกับมันตรง ๆ ด้วยมือ — ต้องตอบ 220 กลับมา $ nc 127.0.0.1 21 # 220 pyftpdlib 2.x.x ready. # พิมพ์ QUIT แล้ว Enter เพื่อออก # ④ ล็อกอินจริงด้วย ftp client (ดู §5.2 หัวข้อถัดไปก่อน — Mac ไม่มี ftp มาให้) $ ftp 127.0.0.1 - เปิดให้เครื่องอื่นเข้าถึงได้ — ปิด Firewall ของ macOS (System Settings → Network → Firewall) แล้วให้เพื่อนลองจากเครื่องเขา
[เครื่องเพื่อน / Windows]
> ftp 192.3.128.2 # IP ของ MacBook เรา
ftp มาให้แล้ว
ใบแลปข้อ 4.3 สั่งให้พิมพ์ ftp <ip address> แต่ Apple ถอดโปรแกรม ftp และ telnet ออกจาก macOS ตั้งแต่ Big Sur (macOS 11) — บน MacBook Air M2 พิมพ์ ftp จะได้ zsh: command not found: ftp ทันที · แก้ได้ 2 ทาง
# ทาง A — เอาคำสั่ง ftp ตัวจริงกลับมา (ตรงกับใบแลปที่สุด)
$ brew install inetutils
$ ftp 192.3.128.10
# ทาง B — ใช้ curl ที่ติดมากับเครื่องอยู่แล้ว (ไม่ต้องลงอะไร)
$ curl -u lab:lab123 ftp://192.3.128.10/ # = ls
$ curl -O -u lab:lab123 ftp://192.3.128.10/test50m.bin # = getทาง B ปลอดภัยกว่าเวลาสอบ เพราะ curl มีอยู่แล้วทุกเครื่อง ไม่ต้องพึ่งเน็ตในห้อง · แต่ถ้าอาจารย์ขอสกรีนช็อตหน้าจอ ftp> ตามใบแลป ให้ใช้ทาง A
ทางเลือกที่ 2 — vsftpd ใน Ubuntu ARM บน Parallels
ถ้าอยากได้ FTP server ที่หน้าตาเหมือนของจริงในห้องเซิร์ฟเวอร์ และเรามี Ubuntu ARM VM อยู่แล้วจาก Lab 3 ใช้ทางนี้ได้ — แต่ต้องทำ USB passthrough การ์ด Ethernet เข้า VM ก่อน (Devices → USB & Bluetooth → เลือกการ์ด) ไม่งั้น VM จะมองไม่เห็นวง 192.3.128.0/24
$ sudo apt update && sudo apt install -y vsftpd
$ sudo nano /etc/vsftpd.conf
# local_enable=YES ← ให้ user ของเครื่องล็อกอินได้
# write_enable=YES ← เขียนไฟล์ได้
$ sudo systemctl restart vsftpd
$ sudo systemctl status vsftpd --no-pager # ต้องเห็น active (running)
$ ss -lntp | grep :21 # ต้องเห็น LISTEN 0.0.0.0:21ทางเลือกที่ 3 — Docker (ถ้าถนัด Docker อยู่แล้ว)
Docker Desktop รุ่น Apple Silicon รัน image FTP server เล็ก ๆ ได้ในบรรทัดเดียว โดย map -p 21:21 และ map พอร์ตช่วง passive ด้วย · แต่ไม่แนะนำสำหรับแลปนี้ เพราะ Docker บน Mac รันใน VM ของตัวเอง ทำให้ FTP โหมด passive ต้องตั้ง NAT address เพิ่ม และเรากำลังจะดึงสายกันไปมา — ยิ่งซับซ้อนยิ่งเสียเวลาในห้อง ให้ใช้ pyftpdlib ตามหัวข้อแรก
รูปที่ 1–11 จากใบแลป — หน้าจอ FileZilla Server ฝั่ง Windows (ไว้เทียบตอนเพื่อนทำ)
ทั้งหมดนี้คือหน้าจอของ Windows ในใบแลป — บน Mac จะไม่เห็นหน้าตาแบบนี้เลย เพราะ FileZilla ไม่มี Server รุ่น macOS · ให้ทำตามขั้นตอน Mac ด้านบนแทน · เก็บรูปพวกนี้ไว้เพื่อ ① เข้าใจว่าเพื่อนกำลังทำอะไรอยู่ตอนทำแลปคู่กัน และ ② ตอบคำถามอาจารย์ได้ว่าค่าที่ต้องตั้งคืออะไร
0.0.0.0 พอร์ต 21 ต้องเปลี่ยน Protocol จาก Require explicit FTP over TLS เป็น Explicit FTP over TLS and insecure plain FTP ไม่งั้นทราฟฟิกจะถูกเข้ารหัสหมดและ Wireshark อ่านอะไรไม่ออก · เทียบกับฝั่ง Mac — pyftpdlib เป็น plain FTP อยู่แล้วโดยปริยาย จึงไม่ต้องตั้งอะไรตรงนี้
New User มา แล้วตั้ง Password กด Apply · พอตั้งเสร็จช่อง Password จะขึ้นว่า Leave empty to keep existing · เปลี่ยนชื่อได้ด้วยปุ่ม Rename · เทียบกับฝั่ง Mac — คือตัวเลือก -u lab -P lab123 ของ pyftpdlib
/ ส่วน Native path ใส่ path จริงของโฟลเดอร์ที่จะแชร์ (ใบแลปแนะให้เอามาจาก File Explorer → คลิกขวาที่แถบด้านบน → Copy as path) เสร็จแล้วกด Apply แล้ว OK · เทียบกับฝั่ง Mac — คือตัวเลือก -d ~/ftpshare ของ pyftpdlib บรรทัดเดียวจบ5.3ติดตั้งและใช้งาน iperf3
ใบแลปให้เข้า https://iperf.fr/iperf-doc.php → เมนู Download iPerf binaries → เลือกตาม OS → แตกไฟล์ → cd เข้าโฟลเดอร์ → เรียกใช้ด้วย ./iperf3.exe <command> · ทั้งหมดนี้เป็นขั้นตอนของ Windows (สังเกตนามสกุล .exe) — บน Mac ใช้ Homebrew บรรทัดเดียวจบ ไม่ต้องแตกไฟล์ ไม่ต้อง cd เข้าโฟลเดอร์ และไม่ต้องมี ./ นำหน้า เพราะมันอยู่ใน PATH แล้ว
$ brew install iperf3
$ iperf3 --version
# iperf 3.x (cJSON 1.7.x)
# Darwin … arm64
$ which iperf3
# /opt/homebrew/bin/iperf3 ← /opt/homebrew คือที่อยู่ของ brew บน Apple Siliconฝั่ง Server — ใบแลปข้อ 4.6.2
$ iperf3 -s
# -----------------------------------------
# Server listening on 5201
# -----------------------------------------ฝั่ง Client — ใบแลปข้อ 4.6.3
$ iperf3 -c 192.3.128.10
# [ ID] Interval Transfer Bitrate
# [ 5] 0.00-10.00 112 MBytes 94.1 Mbits/sec sender
# [ 5] 0.00-10.00 112 MBytes 94.0 Mbits/sec receiver- ข้อ 4.6.3 เขียนว่า
./ipref3 -c <server_ip>— สะกดผิด ตัวจริงคือiperf3(p-e-r-f) ถ้าพิมพ์ipref3จะได้command not foundแล้วนั่งงงว่าลงไม่สำเร็จ ./นำหน้าใช้เฉพาะกรณีที่โปรแกรมอยู่ในโฟลเดอร์ปัจจุบัน (แบบที่ Windows แตกไฟล์ zip ออกมา) — บน Mac ที่ลงด้วยbrewให้พิมพ์iperf3เฉย ๆ ถ้าใส่./จะได้no such file or directory- ต้องเปิดฝั่ง
-sก่อนเสมอ ไม่งั้นฝั่ง client จะได้Connection refused· และ iperf3 ใช้พอร์ต 5201 ไม่ใช่ 21 — ถ้าจะดักด้วย Wireshark ต้อง filtertcp.port == 5201
ทำซ้ำ 10 ครั้งแล้วหาค่าเฉลี่ย (ใบแลปข้อ 4.6.5)
ใบแลปสั่งให้ทำขั้นตอนที่ 3 และ 4 ซ้ำอีก 9 ครั้ง (รวมเป็น 10 ครั้ง) แล้วหาค่าเฉลี่ย — นั่งกด 10 รอบก็ได้ แต่บน Mac เขียนเป็นลูปบรรทัดเดียวจบและได้ตัวเลขเรียงสวย ๆ ไปแปะรายงานเลย
$ for i in $(seq 1 10); do \
echo -n "รอบ $i: "; \
iperf3 -c 192.3.128.10 -t 10 -f m | grep receiver; \
done | tee iperf_10rounds.txt
# รอบ 1: [ 5] 0.00-10.00 sec 112 MBytes 94.1 Mbits/sec receiver
# รอบ 2: [ 5] 0.00-10.00 sec 112 MBytes 93.8 Mbits/sec receiver
# …
# หาค่าเฉลี่ยจากไฟล์ที่เพิ่งเก็บไว้
$ awk '/receiver/ {s+=$(NF-2); n++} END {printf "เฉลี่ย %.2f Mbits/sec จาก %d รอบ\n", s/n, n}' iperf_10rounds.txt-t 10 = ยิง 10 วินาทีต่อรอบ (ค่าปริยายอยู่แล้ว) · -f m = บังคับหน่วยเป็น Mbits/sec ทุกรอบ ไม่งั้นบางรอบอาจโชว์เป็น Kbits แล้วเฉลี่ยเพี้ยน · tee = เห็นบนจอไปด้วยและเก็บลงไฟล์ไปด้วย
cd เข้าไปยังโฟลเดอร์ iperf3 ก่อน จึงจะเรียก ./iperf3.exe ได้ — ขั้นตอน cd เข้าโฟลเดอร์นี้มีเฉพาะบน Windows เพราะไฟล์ถูกแตกมาจาก zip และไม่ได้อยู่ใน PATH · บน Mac ที่ลงด้วย brew install iperf3 พิมพ์ iperf3 จากที่ไหนก็ได้)5.4Wireshark — Filter และ I/O Graph
บน MacBook Air M2 ต้องเป็น Wireshark รุ่น Arm และต้องติดตั้ง ChmodBPF.pkg ด้วย ไม่งั้นเปิดโปรแกรมได้แต่ไม่เห็น interface สักอัน → วิธีลงละเอียดอยู่ที่ หน้า Setup · เช็กว่าติดตั้งครบด้วย id -Gn | grep access_bpf
Display filter ที่ต้องใช้ในแลปนี้
| พิมพ์ในช่อง filter | ได้อะไร | ใช้ตอนไหน |
|---|---|---|
stp | เห็นเฉพาะ BPDU ของ STP — ตัวที่คำถามท้ายการทดลองสั่งให้ดักจับ · ปกติจะไหลมาทุก 2 วินาที (hello time) | ข้อ 4.5.2 และคำถามท้าย |
eth.dst == 01:80:c2:00:00:00 | เหมือนบรรทัดบน แต่กรองจาก MAC ปลายทางแบบ multicast ที่ STP ใช้ โดยตรง — ใช้ยืนยันว่าเฟรมที่เห็นคือ BPDU จริง | คำถามท้าย |
ftp | เห็นเฉพาะคำสั่ง FTP (USER, PASS, RETR, …) บนพอร์ต 21 — ไม่รวมตัวข้อมูล | ข้อ 4.3 |
ftp-data | เห็นตัวไฟล์ที่กำลังไหล — อันนี้แหละที่ทำให้ I/O Graph พุ่ง | ข้อ 4.3–4.5 |
ip.addr == 192.3.128.10 | ทุกอย่างที่เกี่ยวกับเครื่อง server ทั้งขาไปและขากลับ (ip.addr จับทั้ง src และ dst — ต่างจาก ip.src ที่จับขาเดียว) | ข้อสอบข้อ 2 |
ip.src == 192.3.128.2 && icmp | ping ที่ออกจากเครื่องเราเท่านั้น — ตรงกับที่ข้อสอบข้อ 2 สั่งเป๊ะ ๆ ("filter จาก source address ของ ping") | ข้อสอบข้อ 2 |
tcp.port == 5201 | ทราฟฟิกของ iperf3 | ข้อ 4.6 |
arp | เฟรม ARP — ในสภาวะลูป คุณจะเห็น ARP ตัวเดิมซ้ำหลายพันแถวติดกัน นั่นคือหลักฐานของ broadcast storm | ข้อ 4.5 |
I/O Graph — หัวใจของข้อ 4.3, 4.4 และ 4.5
ใบแลปสั่งให้ดูทราฟฟิก "ในรูปแบบ I/O Graph" ทั้งสามข้อ เพราะกราฟนี้ตอบคำถามได้ในภาพเดียวว่า ตอนไหนทราฟฟิกไหลลื่น ตอนไหนสะดุด และสะดุดนานกี่วินาที
- เปิดกราฟ — เมนู Statistics → I/O Graphs
- ตั้งแกน X ให้ละเอียดพอ — ช่อง Interval ตั้งเป็น
100 msหรือ1 sec· ถ้าปล่อยไว้หยาบเกินจะมองไม่เห็นช่วงที่หายไป 30 วินาที - เพิ่มเส้นของ FTP โดยเฉพาะ — กด + ที่มุมล่างซ้าย แล้วใส่ Display filter
ftp-dataตั้ง Y Axis เป็น Bytes หรือ Bits - เพิ่มเส้นของ BPDU — กด + อีกเส้น ใส่ filter
stpตั้ง Y Axis เป็น Packets · เส้นนี้จะราบเรียบตอนปกติ แต่พุ่งขึ้นตอนโทโพโลยีเปลี่ยน (ตอนดึงสาย) - บันทึกภาพส่งอาจารย์ — ปุ่ม Save As… ในหน้าต่างกราฟ หรือ ⌘+⇧+4 แล้วลากครอบ (สกรีนช็อตของ macOS)
สวิตช์ส่งเฟรมเฉพาะไปพอร์ตปลายทาง เสียบเครื่องเข้าพอร์ตว่างแล้วจะไม่เห็นทราฟฟิกของคนอื่นเลย · ใบแลปจึงกำกับไว้ว่า "Wireshark ควรเป็น Monitor บน Switch Root Bridge" → ต้องตั้ง port mirroring ด้วย monitor session ที่ตัวที่เป็น root ก่อน → Listing 7–8 ใน §5.9 · แต่ BPDU เป็นข้อยกเว้น — สวิตช์ส่ง BPDU ออกทุกพอร์ตอยู่แล้ว รวมพอร์ตที่เราเสียบอยู่ ดังนั้น filter stp จะเห็นได้โดยไม่ต้อง mirror
5.5บทนำ — ทำไมต้องมี STP
Spanning Tree Protocol (STP) เป็นโปรโตคอลที่พัฒนาขึ้นเพื่อกำจัดลูป (loop) ที่เกิดขึ้น โดยบริษัท Digital Equipment Corporation (DEC) ภายหลังได้รับการปรับปรุงโดยสถาบันวิศวกรรมไฟฟ้าและวิศวกรรมอิเล็กทรอนิกส์นานาชาติของประเทศสหรัฐอเมริกา ให้เป็นมาตรฐาน IEEE 802.1d
"เนื่องจากผู้ผลิตสวิตช์ทุกรายมิได้ใช้มาตรฐานของ IEEE 802.1d ทั้งหมด ดังนั้นหากมีการใช้สวิตช์มากกว่าหนึ่งผู้ผลิตในเครือข่าย LAN เดียวกัน ผู้ดูแลระบบต้องระวังลูปที่อาจเกิดขึ้น เช่นการใช้งานสวิตช์ของ CISCO ร่วมกับบริษัทอื่น โดยที่ CISCO ใช้มาตรฐานของ IEEE 802.1d โดยปริยาย" — ใจความคือ ① STP เปิดมาให้อยู่แล้วบนสวิตช์ Cisco ไม่ต้องสั่งเปิด และ ② พอเอาไปผสมยี่ห้ออื่นที่คิด BPDU คนละแบบ ลูปกลับมาได้
ลูปที่ว่านี้ร้ายแรงกว่าที่คนส่วนใหญ่คิด เพราะเฟรมเลเยอร์ 2 ไม่มีฟิลด์ TTL เหมือนแพ็กเก็ต IP — เฟรมที่วนอยู่จึงไม่มีวันหมดอายุ มันจะวนไปเรื่อย ๆ จนกว่าจะมีคนถอดสาย กดดูภาพข้างล่างทีละสเต็ป
| อาการของลูปเลเยอร์ 2 | เกิดอะไรขึ้น |
|---|---|
| Broadcast storm | เฟรมบรอดคาสท์ (ARP, DHCP Discover) ทวีคูณทุกรอบที่วน — 1 → 2 → 4 → 8 → … จนกินแบนด์วิดท์เต็มสาย 100% |
| MAC table flapping | สวิตช์เห็น MAC ต้นทางตัวเดียวกันวิ่งเข้ามาสองพอร์ตสลับไปมา จึงเขียนทับตาราง MAC ตลอดเวลา · บน IOS จะขึ้นข้อความเตือน %SW_MATM-4-MACFLAP_NOTIF |
| เฟรมซ้ำถึงปลายทาง | ปลายทางได้เฟรมเดียวกันหลายชุด ทำให้โปรโตคอลชั้นบน (เช่น TCP) ต้องมาไล่ทิ้งเอง |
| CPU ของสวิตช์เต็ม | ไม่ใช่แค่เน็ตช้า แต่ตัวสวิตช์เองค้าง จน console ก็แทบพิมพ์ไม่ได้ — นี่คือเหตุผลที่ใบแลปข้อ 4.5 วงเล็บกำกับว่า "ระวังเครื่องค้าง" |
5.6หลักการทำงานของ STP — กติกา 3 ขั้น
ใบแลปเขียนขั้นตอนการพิจารณาไว้ 3 ข้อ ต้องทำตามลำดับ ห้ามสลับ:
① เลือก Root Bridge
ใน 1 Network จะมี Switch เพียง 1 ตัวที่เป็น Root Bridge พิจารณาจาก Switch ที่มี Bridge ID น้อยที่สุด และขาของ Root Bridge เป็น Designated Port ทั้งหมด
② เลือก Root Port
พิจารณาจาก Port ที่มีค่า Path Cost ไปหา Root Bridge ต่ำสุด ถ้า Path Cost เท่ากันให้พิจารณาจาก Bridge ID · Switch หนึ่งตัวมี Root Port ได้เพียง 1 พอร์ตเท่านั้น
③ เลือก Designated Port
ใน Link ระหว่าง Switch กับ Switch (เรียกว่า Segment) ต้องมี 1 Designated Port พิจารณาจาก Path Cost ต่ำสุด → เท่ากันดู Bridge ID ต่ำสุด → เท่ากันอีกดู Port ID ต่ำสุด
กดดูภาพข้างล่างเพื่อเห็นกติกาทั้งสามข้อทำงานจริงบนสามเหลี่ยมของแลปนี้ และเห็นว่าพอสั่ง priority 4096 แล้วพอร์ตที่ถูกบล็อกย้ายที่ไปเลย
Cisco ใช้ PVST+ คือรัน STP แยกต้นละ VLAN จึงต้องยัดเลข VLAN ลงไปในฟิลด์ Priority ด้วย เรียกว่า sys-id-ext — ผลคือเลขที่โผล่ในหน้าจอไม่ตรงกับที่เราพิมพ์:
| สิ่งที่พิมพ์ | VLAN | สิ่งที่ show spanning-tree แสดง |
|---|---|---|
| (ไม่พิมพ์อะไร = ค่าปริยาย 32768) | 1 | 32769 = 32768 + 1 |
| (ไม่พิมพ์อะไร = ค่าปริยาย 32768) | 9 | 32777 = 32768 + 9 |
spanning-tree vlan 9 priority 4096 | 9 | 4105 = 4096 + 9 |
spanning-tree vlan 1 priority 4096 | 1 | 4097 = 4096 + 1 |
เห็น 32777 แล้วอย่าตกใจว่าตั้งผิด — บรรทัดในวงเล็บ (priority 32768 sys-id-ext 9) บอกที่มาไว้ให้แล้ว · และเพราะทุกตัวบวก 9 เท่ากันหมด การเปรียบเทียบจึงไม่เปลี่ยน ใครพิมพ์ priority ต่ำกว่าก็ยังชนะอยู่ดี
โจทย์ข้อเขียนจะให้ผังสวิตช์ + Bridge ID + cost ของแต่ละลิงก์ มา แล้วสั่งให้หา root bridge, root port ของทุกตัว, designated port ของทุก segment และพอร์ตที่ถูกบล็อก · วิธีทำทีละขั้นพร้อมตัวอย่างเต็มรูปแบบอยู่ที่ บทที่ 15 หัวข้อ "ตัวอย่างเต็มรูปแบบ — โจทย์ข้อสอบเก่า" · ตารางค่า cost ที่ต้องจำ (100 Mbps → 19) อยู่ที่ §15.1.2
5.7BPDU — เฟรมที่สวิตช์ใช้คุยกัน
BPDU คือเฟรมที่แลกเปลี่ยนระหว่างสวิตช์ที่เข้าร่วมใน STP เพื่อแลกเปลี่ยนข้อมูลเกี่ยวกับ ID bridge, ต้นทุนพอร์ต และพารามิเตอร์อื่น ๆ ที่จำเป็นสำหรับการป้องกันลูปและการบรรจบกัน (convergence) ของเครือข่าย เฟรมเหล่านี้จำเป็นสำหรับสวิตช์ในการเลือก Root Bridge · กำหนดเส้นทางที่ดีที่สุดไปยัง Root Bridge · และคำนวณบทบาทของพอร์ต (พอร์ต root, พอร์ตที่กำหนด หรือพอร์ตที่บล็อก) เพื่อสร้างทอพอโลยีที่ไม่มีการวนซ้ำ — ด้วยการแลกเปลี่ยน BPDU สวิตช์จะสามารถสร้างและรักษาทอพอโลยีเครือข่ายที่ไม่มีการวนซ้ำร่วมกัน ทำให้มั่นใจได้ถึงการส่งข้อมูลที่มีประสิทธิภาพและความทนทานต่อข้อผิดพลาด
| สิ่งที่ต้องจำไปห้องแลป | ค่า |
|---|---|
| MAC ปลายทางของ BPDU | 01:80:C2:00:00:00 — เป็น multicast ไม่ใช่ broadcast · ใช้เป็น Wireshark filter ได้เลย |
| ส่งบ่อยแค่ไหน | ทุก Hello Time = 2 วินาที จาก root bridge |
| ไม่ได้รับนานแค่ไหนถึงถือว่าเส้นตาย | Max Age = 20 วินาที |
| ฟิลด์ที่ตัดสินทุกอย่าง | Root ID (ใช้ขั้น ①) · Root Path Cost (ใช้ขั้น ② และ ③) · Bridge ID + Port ID (ใช้ตัดสินเมื่อเท่ากัน) |
| ขนาดรวมของ Configuration BPDU | 35 ไบต์ (2+1+1+1+8+4+8+2+2+2+2+2) |
บทที่ 15 §15.1 มีตารางฟิลด์ครบทั้ง 12 ช่องพร้อมขนาดไบต์ · ภาพเคลื่อนไหวกาง BPDU ให้ดูทีละฟิลด์ · เรื่อง TC-BPDU และไบต์ Flags (บิต 7 = TC, บิต 0 = TCA) · เปิดหน้านั้นคู่กับหน้านี้ตอนตอบคำถามท้ายการทดลอง → §5.15
5.8อ่านผล show spanning-tree ให้ออกทุกบรรทัด
ใบแลปข้อ 4.2.2 สั่งว่า "ให้นักศึกษาตรวจสอบรายละเอียดของ Spanning Tree ว่าเครื่องใดเป็น root และพอร์ตที่เชื่อมต่ออยู่มีสถานะเป็นอะไรบ้าง" — คำตอบทั้งหมดอยู่ในผลของคำสั่งเดียว กดดูทีละบรรทัดข้างล่าง
SW3#show spanning-tree vlan 9
VLAN0009
Spanning tree enabled protocol ieee
Root ID Priority 32777
Address aabb.cc00.0100 <-- ใครเป็น root
Cost 100 <-- ฉันอยู่ห่างจาก root เท่าไร
Port 1 (Ethernet0/0) <-- ออกทางพอร์ตไหนถึงจะไปถึง root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32777 (priority 32768 sys-id-ext 9)
Address aabb.cc00.0300 <-- ฉันคือใคร
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------
Et0/0 Root FWD 100 128.1 P2p
Et0/1 Altn BLK 100 128.2 P2p <-- พอร์ตที่ตัดลูป
Et0/2 Desg FWD 100 128.3 P2p Edgeคอลัมน์ Role — บทบาท (ใครเป็นอะไร)
Root | Root Port — ทางไปหา root · มีได้ตัวละ 1 พอร์ต |
Desg | Designated Port — พอร์ตที่คุม segment นั้น · ทุกพอร์ตของ root bridge เป็นแบบนี้หมด |
Altn | Alternate — พอร์ตสำรองที่ถูกบล็อกไว้ เพราะมีทางไป root ที่ดีกว่าอยู่แล้ว |
Back | Backup — สำรองของ segment เดียวกัน (เจอเฉพาะตอนต่อสองเส้นเข้าฮับ/สวิตช์ตัวเดียวกัน) |
คอลัมน์ Sts — สถานะ (ตอนนี้ทำอะไรอยู่)
BLK | Blocking — รับแต่ BPDU · ทิ้งข้อมูลทั้งหมด · ไม่เรียน MAC |
LIS | Listening — 15 วิ · ฟัง BPDU จัดโครงสร้าง · ยังไม่เรียน MAC |
LRN | Learning — 15 วิ · เริ่มเรียน MAC แล้ว แต่ยังไม่ส่งต่อ |
FWD | Forwarding — ส่งข้อมูลได้เต็มที่ |
Role คือ "ตำแหน่งงาน" · Sts คือ "ตอนนี้ทำอะไรอยู่" — พอร์ตที่ Role เป็น Root หรือ Desg ก็ยังไต่ผ่าน LIS และ LRN อยู่ 30 วินาทีก่อนจะเป็น FWD ได้ · ตอนเพิ่งเสียบสายแล้วรีบพิมพ์ show spanning-tree คุณจะเห็น Desg LIS หรือ Root LRN ซึ่งปกติมาก ไม่ได้พัง — รอให้ครบ แล้วพิมพ์ซ้ำ
show อีกสามตัวที่ประหยัดเวลามาก
SW3#show spanning-tree summary
# สรุปทั้งเครื่องบรรทัดเดียวต่อ VLAN: มีกี่พอร์ต blocking / listening / learning / forwarding
SW3#show spanning-tree root
# ตารางแถวเดียวต่อ VLAN บอกว่า root คือใคร cost เท่าไร ออกพอร์ตไหน — ตอบข้อ 4.2.2 ได้เร็วที่สุด
SW3#show spanning-tree interface Ethernet0/1 detail
# เจาะพอร์ตเดียว บอกว่ารับ BPDU จากใคร นับได้กี่ใบ และทำไมถึงโดนบล็อก5.9คำสั่งที่เกี่ยวข้อง (Listing 1–8)
ใบแลปให้คำสั่งมา 8 ชุด — ข้างล่างคือของจริงที่แทนค่า VLAN 9 และชื่อพอร์ตให้แล้ว คัดลอกไปวางได้ทันที พร้อมกำกับว่าแต่ละบรรทัดทำอะไร
Listing 1–2 — สร้าง VLAN และเอาพอร์ตเข้า VLAN
Switch>enable
Switch#configure terminal
Switch(config)#hostname SW1 # ส่วนขยาย — ตั้งชื่อไว้จะได้ไม่สับสนว่ากำลัง config ตัวไหน
SW1(config)#vlan 9 # <vlan_id> ของแลปนี้คือ 9
SW1(config-vlan)#name STP-LAB # <vlan_name> ตั้งเป็นอะไรก็ได้
SW1(config-vlan)#exitSW1(config)#interface range Ethernet0/0 - 3 # ทำทีเดียวหลายพอร์ต · ใบแลปเขียน fastethernet 0/A-B
SW1(config-if-range)#switchport mode access
SW1(config-if-range)#switchport access vlan 9
SW1(config-if-range)#exit
# ทำซ้ำแบบเดียวกันที่ SW2 และ SW3 — "กำหนดให้สวิตช์ทั้งหมดทำงานอยู่บน VLAN 9"ใบแลปเขียน fastethernet 0/A−B เพราะเขียนสำหรับสวิตช์เครื่องจริงในห้อง · ถ้าซ้อมที่บ้านด้วย image L2 (IOU) ใน GNS3 พอร์ตจะชื่อ Ethernet0/0 ถึง Ethernet0/3 · ส่วนสวิตช์ Gigabit จะเป็น GigabitEthernet1/0/1 — ห้ามเดา ให้พิมพ์ show ip interface brief ดูชื่อจริงก่อนเสมอ · และสังเกตว่า interface range ของ IOS ต้องมีเว้นวรรครอบขีดกลาง (0/0 - 3)
Listing 3 — ตรวจสอบการติดตั้ง VLAN
SW1#show vlan
SW1#show vlan brief
# VLAN Name Status Ports
# ---- --------- --------- -------------------------------
# 1 default active
# 9 STP-LAB active Et0/0, Et0/1, Et0/2, Et0/3 <-- ทุกพอร์ตต้องมาอยู่แถวนี้ใบแลปวางรูปนี้ไว้ตรง Listing 3 เพื่อให้เห็นภาพว่า VLAN แยกโดเมนกันอย่างไร และถ้าจะให้คุยข้ามกันต้องมี router:
F0/0 และ F0/1 · แต่ในแลปนี้เราไม่ต้องใช้ router เลย เพราะใบแลปกำหนดให้ทุกสวิตช์อยู่บน VLAN 9 เดียวกันหมด → STP เป็นเรื่องเลเยอร์ 2 ล้วน ๆ · วิธีทำ inter-VLAN routing แบบเต็ม ๆ อยู่ที่ Lab 4)Listing 4–6 — ติดตั้ง STP · ตั้ง Priority · ตรวจสอบ
SW1#configure terminal
SW1(config)#spanning-tree vlan 9
# ถ้าโจทย์ไม่ได้ระบุ VLAN ให้ใช้ VLAN 1 ซึ่งเป็น VLAN ปริยาย:
# SW1(config)#spanning-tree vlan 1SW2#configure terminal
SW2(config)#spanning-tree vlan 9 priority 4096
# ค่าที่ใส่ได้: 0, 4096, 8192, 12288, ..., 61440 (พหุคูณของ 4096 เท่านั้น)
# ยิ่งเลขน้อย ยิ่งมีสิทธิ์เป็น root · ค่าปริยายคือ 32768
# ทางลัด (ส่วนขยาย) — ให้ IOS คิดเลขให้เอง ไม่ต้องจำพหุคูณ
SW2(config)#spanning-tree vlan 9 root primary # ตั้งให้ต่ำพอที่จะชนะทุกตัวในวง
SW2(config)#no spanning-tree vlan 9 priority # คืนค่าเดิม 32768SW1#show spanning-tree # ทุก VLAN ที่มีอยู่บนเครื่อง
SW1#show spanning-tree vlan 9 # เจาะเฉพาะ VLAN 9 ของแลปนี้ — อ่านง่ายกว่ามาก
SW1#show spanning-tree vlan 1 # กรณีโจทย์ใช้ VLAN ปริยายspanning-tree เกินตัว n ไปหนึ่งตัว
Listing 5 ในใบแลปเขียนว่า (n สามตัว) — พิมพ์ตามเป๊ะ ๆ จะได้ spannning-tree% Invalid input detected at '^' marker. · คำสั่งจริงคือ spanning-tree (n สองตัว) · ทริกที่ปลอดภัยที่สุดในห้องสอบคือพิมพ์ครึ่งคำแล้วกด Tab ให้ IOS เติมให้ หรือกด ? ดูตัวเลือก
Listing 7–8 — Port Mirroring (เอา Wireshark ไปแปะบน Root Bridge)
ใบแลปหมายเหตุไว้ว่า "Wireshark ควรเป็น Monitor บน Switch Root Bridge" — สวิตช์ส่งเฟรมเฉพาะไปพอร์ตปลายทาง ถ้าไม่สั่ง mirror เครื่องที่รัน Wireshark จะไม่เห็นทราฟฟิก FTP ของคนอื่นเลย
SW1#configure terminal
# แหล่งที่จะก๊อป: พอร์ตที่ต่อไป SW2 และ SW3 · both = ทั้งขาเข้าและขาออก
SW1(config)#monitor session 1 source interface Ethernet0/0 both
SW1(config)#monitor session 1 source interface Ethernet0/1 both
# ปลายทาง: พอร์ตที่เสียบเครื่อง Wireshark ไว้
SW1(config)#monitor session 1 destination interface Ethernet0/2SW1#show monitor session 1
# Session 1
# ---------
# Type : Local Session
# Source Ports :
# Both : Et0/0, Et0/1
# Destination Ports : Et0/2คลิกขวาที่เส้นสายในผัง → Start capture GNS3 จะเปิด Wireshark ให้ทันทีและเห็นทุกเฟรมที่วิ่งบนสายเส้นนั้นจริง ๆ ไม่ต้องตั้ง monitor session ไม่ต้องมีพอร์ตว่าง · เหมาะที่สุดสำหรับดู BPDU เพราะเลือกได้ว่าจะดูสายเส้นไหน · บน macOS ต้องลง ChmodBPF แล้วเท่านั้น GNS3 ถึงจะเรียก Wireshark ขึ้นได้ · ส่วนพอร์ตปลายทางของ SPAN ต้องเป็นพอร์ตที่ไม่ได้ใช้ส่งข้อมูลปกติ — พอตั้งเป็น destination แล้วมันจะกลายเป็นพอร์ตอ่านอย่างเดียว ping ผ่านพอร์ตนั้นไม่ได้อีก อย่าเผลอไปตั้งที่พอร์ตที่ต่อ FTP Server
5.10โทโพโลยีที่ต้องต่อ (รูปที่ 13)
ใบแลปข้อ 4 สั่งว่า "ให้นักศึกษาต่ออุปกรณ์เน็ตเวิร์คดังที่แสดงในรูป พร้อมกำหนด IP ให้เหมาะสม พร้อมเปิดโปรแกรม Wireshark เพื่อทำการตรวจจับ traffic ที่เกิดขึ้น และทำการตรวจสอบ Spanning Tree ทุกครั้งที่มีการ config" · หมายเหตุ: กำหนดให้สวิตช์ทั้งหมดทำงานอยู่บน VLAN 9
ผังการต่อสาย — แทนชื่อพอร์ตให้แล้ว
| สาย | ปลาย A | ปลาย B | หมายเหตุ |
|---|---|---|---|
| สายวงสามเหลี่ยม 1 | SW1 Et0/0 | SW2 Et0/0 | สามเส้นนี้คือลูป · เสียบให้ครบก่อนแล้วค่อยดูว่า STP บล็อกเส้นไหน |
| สายวงสามเหลี่ยม 2 | SW1 Et0/1 | SW3 Et0/0 | |
| สายวงสามเหลี่ยม 3 | SW2 Et0/1 | SW3 Et0/1 | |
| เครื่อง Wireshark | SW1 Et0/2 | MacBook / PC (192.3.128.3) | เสียบที่ตัวที่เป็น Root Bridge |
| FTP Client | SW2 Et0/2 | MacBook (192.3.128.2) | เครื่องที่สั่ง get |
| FTP Server | SW3 Et0/2 | เครื่อง server (192.3.128.10) | เครื่องที่รัน pyftpdlib + iperf3 -s |
ซ้อมที่บ้านด้วย GNS3 2.2.53 บน Mac
ถ้าลาก Ethernet switch จากแถบ Node Type มาต่อเป็นสามเหลี่ยม จะไม่มีอะไรให้ดูเลย เพราะมันเป็นสวิตช์จำลองแบบไม่มี CLI — console เข้าไม่ได้ ไม่มี show spanning-tree และไม่รัน STP ต่อเป็นวงเมื่อไหร่ก็ลูปทันที · ต้องใช้ image ที่เป็นสวิตช์เลเยอร์ 2 จริง
| ใช้อะไรเป็นสวิตช์ | ได้ / เสีย |
|---|---|
| L2-ADVENTERPRISE (IOU) มีในโฟลเดอร์ 1_network_2026/GNS3 image | ดีที่สุดสำหรับแลปนี้ — เป็นสวิตช์เลเยอร์ 2 เต็มรูปแบบ มี show spanning-tree, show vlan, show mac-address-table ครบ · พอร์ตชื่อ Ethernet0/0–0/3 ความเร็ว 10 Mbps → STP cost = 100 · กินแรมน้อย เปิดสามตัวพร้อมกันบน M2 สบาย |
| c3725 / c3745 + การ์ด NM-16ESW ส่วนขยาย | เป็น router ที่เสียบการ์ดสวิตช์เพิ่ม ให้กลายเป็นสวิตช์ได้ · พอร์ตจะชื่อ FastEthernet1/0 ขึ้นไป ความเร็ว 100 Mbps → cost = 19 ตรงกับตำราและกับสวิตช์จริงในห้องมากกว่า · แลกกับกินแรมมากกว่าและบูตช้ากว่า |
| Ethernet switch (ติดมากับ GNS3) | ใช้ไม่ได้กับแลปนี้ — ไม่มี CLI ไม่มี STP |
- เปิด GNS3 2.2.53 สร้างโปรเจกต์ใหม่ชื่อ
lab5-stp— ถ้าใช้ server ของ KKU ต้องต่อ VPN KKU ก่อนเปิด GNS3 ไม่งั้นจะขึ้น server error → วิธีตั้งค่า - ลากสวิตช์ 3 ตัว ลงมาวางเป็นสามเหลี่ยม เปลี่ยนชื่อเป็น
SW1(บน)SW2(ล่างซ้าย)SW3(ล่างขวา) - ลากสายให้ครบทั้ง 3 เส้น ตามตารางด้านบน — อย่าเพิ่งกด Start จนกว่าจะต่อครบ
- เพิ่ม VPCS 2 ตัว แทน FTP Client และ FTP Server เพื่อสร้างทราฟฟิกด้วย
ping(VPCS ทำ FTP ไม่ได้ — ส่วน FTP จริงต้องทำในห้องแลปกับเครื่องจริง)[VPCS]PC1> ip 192.3.128.2 255.255.255.0 PC2> ip 192.3.128.10 255.255.255.0 PC1> ping 192.3.128.10 -t # -t = ping ไม่หยุด · ใช้ดูตอนดึงสายว่าขาดไปกี่วินาที - กด Start ทั้งหมด แล้วรอ 30–50 วินาที ให้ STP บรรจบก่อนค่อยเริ่มดู — กดเร็วเกินจะเห็นแต่
LIS/LRNแล้วเข้าใจผิดว่าพัง - เข้า console ทุกตัว — คลิกขวาที่อุปกรณ์ → Console · อันนี้เปิดในเทอร์มินัลของ GNS3 เอง ไม่ต้องใช้
screenเพราะไม่ได้ต่อสาย USB จริง ·screen /dev/tty.usbmodemXXXX 9600ใช้เฉพาะตอนทำกับสวิตช์เครื่องจริงในห้อง → Lab 2 §2.4 - คลิกขวาที่สายเส้นที่สนใจ → Start capture เพื่อดู BPDU ด้วย Wireshark filter
stp
5.11การทดลอง — ทำตามใบแลปข้อ 4.1 ถึง 4.6
"ทำการตรวจสอบ Spanning Tree ทุกครั้งที่มีการ config" → หลังทุกขั้นตอนข้างล่างนี้ ให้พิมพ์ show spanning-tree vlan 9 ที่ทั้งสามตัว แล้วก็อปผลเก็บไว้ ก่อนทำขั้นถัดไป — เพราะข้อ 5 (อภิปราย) สั่งให้เอาผลทั้งสามช่วงมาเทียบกัน ถ้าไม่เก็บระหว่างทางจะย้อนกลับไปเก็บไม่ได้
4.1สังเกตไฟบนสวิตช์ — ทำไมเป็นสีส้ม
"สังเกตไฟบนสวิตช์ เมื่อเสียบครบแล้วมีไฟเป็นสีส้มหรือไม่ เพราะเหตุใด"
แนวคำตอบ — มีสีส้ม และมีได้สองความหมายที่ต่างกันมาก
| สีไฟ | แปลว่า | อยู่นานแค่ไหน |
|---|---|---|
| ส้ม/เหลืองอำพัน (ช่วงแรก) | พอร์ตกำลังไต่สถานะของ STP อยู่ — Blocking → Listening → Learning · ทุกพอร์ตที่เพิ่งเสียบสายจะเป็นแบบนี้หมด รวมพอร์ตที่ต่อ PC ด้วย | ชั่วคราว 30–50 วินาที แล้วเปลี่ยนเป็นเขียว |
| ส้ม (ค้างถาวร) | พอร์ตนั้นถูก STP บล็อกไว้ เพราะเป็นเส้นที่ทำให้เกิดลูป — สายเสียบดี ลิงก์ขึ้น แต่ไม่ส่งข้อมูล รับแต่ BPDU | ค้างตลอด จนกว่าโทโพโลยีจะเปลี่ยน |
| เขียว | พอร์ต Forwarding — ส่งข้อมูลได้เต็มที่ | สถานะปกติ |
เขียนตอบแบบนี้ได้เต็ม: "มี — ตอนเสียบสายครบทั้งสามเส้น ไฟทุกพอร์ตจะเป็นสีส้มพร้อมกันประมาณ 30–50 วินาที เพราะ STP ให้ทุกพอร์ตเริ่มที่สถานะ Blocking แล้วไต่ผ่าน Listening (15 วินาที) และ Learning (15 วินาที) ก่อนจึงจะ Forwarding ได้ ระหว่างนี้สวิตช์กำลังแลกเปลี่ยน BPDU เพื่อเลือก Root Bridge · หลังจากนั้นไฟส่วนใหญ่จะเปลี่ยนเป็นเขียว ยกเว้นพอร์ตหนึ่งที่ยังส้มค้างอยู่ ซึ่งคือพอร์ตที่ถูก STP บล็อกเพื่อตัดลูปของสามเหลี่ยม ตรวจสอบได้จาก show spanning-tree vlan 9 ที่จะแสดงว่าพอร์ตนั้นมี Role = Altn และ Sts = BLK"
GNS3 ไม่ได้จำลอง LED ของตัวเครื่อง — จุดสีที่หน้าชื่ออุปกรณ์บอกแค่ว่าเปิด/ปิด (เขียว = ทำงาน · แดง = หยุด) ไม่ได้บอกสถานะ STP · ให้ใช้ show spanning-tree vlan 9 แทน แล้วดูคอลัมน์ Sts ซึ่งให้ข้อมูลละเอียดกว่าไฟจริงเสียอีก (แยก LIS กับ LRN ออกจากกันได้ ในขณะที่ไฟจริงส้มเหมือนกันหมด)
4.2กำหนด Priority ให้กับสวิตช์
- ตรวจสอบหรือติดตั้ง Spanning Tree (ข้อ 4.2.1)
[SW1#] [SW2#] [SW3#] — ทำที่ทั้งสามตัว
SW1#configure terminal SW1(config)#spanning-tree vlan 9 SW1(config)#end - ตรวจสอบว่าเครื่องใดเป็น root และพอร์ตมีสถานะอะไรบ้าง (ข้อ 4.2.2) — แล้ววาดรูปการเชื่อมต่อพร้อมระบุสถานะของพอร์ตให้ชัดเจน
[SW1#] [SW2#] [SW3#] — เก็บผลทั้งสามตัวไว้ นี่คือ "ก่อน" ของข้อ 5
SW1#show spanning-tree vlan 9 SW1#show spanning-tree root # ส่วนขยาย — สรุปแถวเดียว หา root ได้เร็วสุดสวิตช์ พอร์ต ต่อไปหา Role / Sts ที่ควรเห็น SW1
rootEt0/0SW2 Desg FWD— ทุกพอร์ตของ root เป็น Designated เสมอEt0/1SW3 Desg FWDSW2 Et0/0SW1 Root FWD— ทางตรงไป root cost 100Et0/1SW3 Desg FWD— ชนะเพราะ BID ต่ำกว่า SW3SW3 Et0/0SW1 Root FWDEt0/1SW2 Altn BLK— พอร์ตที่ถูกบล็อกตารางนี้คือผลที่ควรได้ถ้า MAC ของ SW1 ต่ำสุด — ของจริงในห้องอาจได้ตัวอื่นเป็น root เพราะ MAC ของเครื่องจริงไม่ได้เรียงสวยแบบนี้ · ให้ดูจากหน้าจอจริงเสมอ อย่าลอกตาราง วิธีอ่านอยู่ที่ §5.8
- ปรับค่า Priority ของ Switch ที่ไม่ได้เป็น root (ข้อ 4.2.3) — สมมติ SW1 เป็น root อยู่ ให้ไปตั้งที่ SW2
[SW2#] — ตัวที่ไม่ได้เป็น root
SW2#configure terminal SW2(config)#spanning-tree vlan 9 priority 4096 SW2(config)#end SW2#show spanning-tree vlan 9 | include "Priority|root" # Bridge ID Priority 4105 (priority 4096 sys-id-ext 9) # This bridge is the root <-- ย้ายมาเป็น root แล้ว - สังเกตการเปลี่ยนแปลงสถานะของพอร์ต แล้ววาดรูปอีกครั้ง (ข้อ 4.2.4)
สวิตช์ พอร์ต ก่อนตั้ง priority หลังตั้ง priority 4096ที่ SW2SW1 Et0/0→ SW2Desg FWDRoot FWDเปลี่ยนEt0/1→ SW3Desg FWDDesg FWDSW2
root ตัวใหม่Et0/0→ SW1Root FWDDesg FWDเปลี่ยนEt0/1→ SW3Desg FWDDesg FWDSW3 Et0/0→ SW1Root FWDAltn BLKถูกบล็อกแทนEt0/1→ SW2Altn BLKRoot FWDปลดบล็อกประเด็นที่ควรเขียนในรายงาน — พอร์ตที่ถูกบล็อกยังอยู่ที่ SW3 เหมือนเดิม แต่ย้ายข้างจาก
Et0/1ไปเป็นEt0/0เพราะเมื่อ root ย้ายไปอยู่ที่ SW2 เส้นที่สั้นที่สุดจาก SW3 ไป root ก็เปลี่ยนเป็นเส้นตรง SW3–SW2 · ส่วน segment ที่เหลือ (SW1–SW3) ตัดสินด้วย BID → SW1 ต่ำกว่า SW3 จึงได้เป็น Designated และฝั่ง SW3 ถูกบล็อก · ระหว่างที่คำนวณใหม่ พอร์ตจะไต่ผ่านLISและLRNอีกรอบ ใช้เวลาราว 30 วินาที ถ้ารีบพิมพ์showทันทีจะเห็นสถานะกลางทาง
4.3โอนข้อมูลด้วย FTP พร้อมดู I/O Graph
"ทำการโอนข้อมูลด้วย FTP จากเซิร์ฟเวอร์มาเครื่องตนเอง (FTP Client) โดยใช้คำสั่งข้างล่างผ่าน Command Prompt หรือ Powershell ให้ใช้ file ที่มีขนาดขั้นต่ำ 30 Mbytes โดยระหว่างการโอนถ่ายข้อมูลให้เปิดโปรแกรม Wireshark เพื่อตรวจจับทราฟฟิกที่เกิดขึ้นในเน็ตเวิร์คในรูปแบบ I/O Graph" · หมายเหตุ: Wireshark ควรเป็น Monitor บน Switch Root Bridge
# ใบแลปเขียน: PC> FTP <ip address server> แล้ว ftp ls / get <filename>
$ cd ~/Downloads # ไฟล์ที่ get มาจะลงที่นี่ (Windows คือ C:\Users\<username>)
$ ftp 192.3.128.10
# Connected to 192.3.128.10.
# 220 pyftpdlib ready.
# Name: lab <-- username ที่ตั้งไว้
# Password: ******
# 230 Login successful.
ftp> ls # ดูรายชื่อไฟล์
ftp> binary # ส่วนขยาย — บังคับโหมด binary กันไฟล์เพี้ยน
ftp> get test50m.bin # เริ่มโอน — กด Wireshark ให้จับก่อนบรรทัดนี้
ftp> byeftp ls ติดกัน
ใบแลปเขียนว่า FTPClient#ftp ls — ไม่มีคำสั่งนี้ · ที่ถูกคือพิมพ์ ftp <ip> เข้าไปก่อนจนได้ prompt ftp> แล้วค่อยพิมพ์ ls เฉย ๆ ข้างใน · ถ้าพิมพ์ ftp ls ที่ shell มันจะคิดว่า ls คือชื่อโฮสต์แล้วขึ้น unknown host · และบน MacBook Air M2 ยังไม่มีคำสั่ง ftp มาให้ตั้งแต่แรก ต้อง brew install inetutils ก่อน หรือใช้ curl → §5.2
- ตั้ง port mirroring ที่ตัวที่เป็น Root Bridge ก่อน แล้วเสียบเครื่อง Wireshark ที่พอร์ต destination → Listing 7 ใน §5.9
- เปิด Wireshark กด Start capture ที่ interface ของการ์ด USB-C Ethernet · ใส่ display filter
ftp-data - เปิด Statistics → I/O Graphs ทิ้งไว้ ตั้ง Interval =
100 ms - สั่ง
get test50m.binแล้วดูกราฟพุ่งขึ้นเป็นแท่งสูงราบยาว — นั่นคือลิงก์เต็มความเร็ว - บันทึกเวลาที่ใช้ — เมื่อเสร็จ ftp จะบอกเองว่า
… bytes received in … seconds (… Kbytes/s)จดไว้เทียบกับข้อ 4.5
4.4โอนอีกครั้ง แล้วดึงสายระหว่างส่ง
"ทำการทดสอบโอนข้อมูลอีกครั้ง โดยครั้งนี้ดึงสายระหว่างส่งข้อมูลเพื่อให้หาเส้นทางใหม่"
ดึงเส้นไหน? — ดึงสายที่ทราฟฟิกกำลังวิ่งอยู่จริง ไม่ใช่เส้นที่ถูกบล็อก (ดึงเส้นที่บล็อกอยู่แล้วจะไม่มีอะไรเกิดขึ้นเลย) · จากตารางในข้อ 4.2 ถ้า SW2 เป็น root ทราฟฟิก Client→Server จะวิ่ง SW2 → SW3 ตรง ๆ ให้ดึงสาย SW2–SW3 แล้วดูพอร์ต Et0/0 ของ SW3 (ที่ถูกบล็อกอยู่) ค่อย ๆ กลับมาทำงาน
SW3#show spanning-tree vlan 9
# วินาทีที่ 0–15 → Et0/0 Root LIS 100 128.1 P2p (Listening)
# วินาทีที่ 15–30 → Et0/0 Root LRN 100 128.1 P2p (Learning)
# วินาทีที่ 30+ → Et0/0 Root FWD 100 128.1 P2p (Forwarding — ทราฟฟิกกลับมา)spanning-tree portfast ตัด 30 วินาทีนี้ทิ้ง (เฉพาะพอร์ตที่ต่อ PC)
SW2(config)#interface Ethernet0/2
SW2(config-if)#spanning-tree portfast
# %Warning: portfast should only be enabled on ports connected to a single
# host. Connecting hubs, concentrators, switches, bridges, etc... to this
# interface when portfast is enabled, can cause temporary bridging loops.
# IOS รุ่นใหม่บางตัวใช้คำว่า edge ต่อท้าย:
SW2(config-if)#spanning-tree portfast edge
# ตั้งทีเดียวให้ทุกพอร์ตแบบ access (ส่วนขยาย)
SW2(config)#spanning-tree portfast defaultportfast ทำให้พอร์ตกระโดดจาก Blocking ไป Forwarding ทันที ข้าม Listening และ Learning — เพราะพอร์ตที่ต่อ PC ตัวเดียวสร้างลูปไม่ได้อยู่แล้ว · อาการที่แก้ได้จริง: เสียบสายแล้ว PC ขอ DHCP ไม่ทันเพราะพอร์ตยังไม่ forward · ห้ามใส่ที่พอร์ตระหว่างสวิตช์เด็ดขาด — จะเกิดลูปชั่วคราวตามที่ IOS เตือนไว้ · ในผล show spanning-tree พอร์ตที่ตั้ง portfast จะขึ้น Type ว่า P2p Edge
4.5โอนข้อมูลโดยยกเลิก Spanning Tree ระวังเครื่องค้าง
ถ้าปิด STP ทั้งที่สายสามเหลี่ยมยังเสียบครบ เครือข่ายจะล่มทันทีภายในไม่กี่วินาที และคุณจะพิมพ์คำสั่งเข้าไปแก้ไม่ได้อีกเลย เพราะ CPU ของสวิตช์เต็ม · ใบแลปจึงบังคับให้ถอดสายออกให้หมดก่อน แล้วค่อยปิด STP แล้วค่อยเสียบสายกลับ พร้อมกับเริ่มโอนไฟล์
- แยกเน็ตเวิร์คออกจากกันให้หมด — ดึงสายแลนที่เชื่อมระหว่างสวิตช์ออกทั้ง 3 เส้น (ใน GNS3 = คลิกขวาที่สาย → Delete หรือ Suspend)
- เปิด Wireshark เพื่อรอตรวจจับ BPDU — ใส่ display filter
stpแล้วกด Start · ตอนนี้จะเห็น BPDU ไหลมาทุก 2 วินาที เก็บภาพไว้ตอบคำถามท้ายการทดลอง → §5.15 - ยกเลิก Spanning Tree ของทุกสวิตช์
[SW1#] [SW2#] [SW3#] — ต้องทำครบทั้งสามตัว
SW1#configure terminal SW1(config)#no spanning-tree vlan 9 SW1(config)#end SW1#show spanning-tree vlan 9 # No spanning tree instance exists. <-- ยืนยันว่าปิดแล้ว # และใน Wireshark: BPDU จะหยุดไหลทันที - เสียบสายกลับเข้าเหมือนเดิม — ใบแลปกำกับว่า "ขั้นตอนที่ 4–5 ทำพร้อมกัน"
- โอนไฟล์ ≥ 30 MB ด้วย FTP อีกครั้ง พร้อมเปิด I/O Graph ค้างไว้
- บันทึกเวลาและผลลัพธ์ที่ได้จากกราฟ
| สิ่งที่จะเห็น | ข้อ 4.3 (มี STP) | ข้อ 4.5 (ไม่มี STP + มีลูป) |
|---|---|---|
| I/O Graph | แท่งสูงราบสม่ำเสมอ แล้วจบลงตอนไฟล์หมด | พุ่งชนเพดานแล้วค้างอยู่อย่างนั้น ไม่ลงเลย แม้ไฟล์ยังโอนไม่เสร็จ |
| เวลาโอนไฟล์ | ไม่กี่วินาทีถึงหลักสิบวินาที | ค้าง / ช้ามาก / หลุดกลางคัน |
filter arp | เห็นไม่กี่แถว | เห็นแพ็กเก็ตเดิมซ้ำเป็นพัน ๆ แถวรัว ๆ = หลักฐานของ broadcast storm |
filter stp | BPDU ไหลสม่ำเสมอทุก 2 วินาที | ไม่มี BPDU เลย เพราะปิด STP ไปแล้ว |
| console ของสวิตช์ | ตอบสนองปกติ | พิมพ์แล้วไม่ขึ้น / ขึ้นช้ามาก · มีข้อความ %SW_MATM-4-MACFLAP_NOTIF วิ่งรัว |
| ไฟบนสวิตช์ | เขียวนิ่ง มีส้มค้างหนึ่งพอร์ต | กะพริบรัวทุกพอร์ตพร้อมกัน |
① ถอดสายระหว่างสวิตช์ออกก่อนหนึ่งเส้น ให้เหลือแค่สองเส้น (ไม่เป็นวง) — ทำแค่นี้ storm จะหยุดทันทีและ console กลับมาพิมพ์ได้ ② เปิด STP กลับ spanning-tree vlan 9 ที่ทุกตัว ③ เสียบสายเส้นที่สามกลับ แล้วรอ 30–50 วินาที · อย่าเริ่มด้วยการรีบูตสวิตช์ เพราะพอบูตเสร็จ STP ก็ยังปิดอยู่ (ถ้ายังไม่ได้ copy run start ก็จะกลับมาเปิด แต่จะเสียเวลาบูต 1–2 นาที)
4.6หาความเร็ว transfer ด้วย iperf3
- เปิด terminal แล้วเข้าไปยัง directory ที่มีโปรแกรม iperf3 — ขั้นตอนนี้ข้ามได้บน Mac เพราะ
brewติดตั้งไว้ในPATHแล้ว → §5.3 - ฝั่ง Server —
iperf3 -s(ใบแลปเขียน./iperf3 -sซึ่งเป็นรูปแบบของ Windows ที่แตกไฟล์ zip มา) - ฝั่ง Client —
iperf3 -c 192.3.128.10(ใบแลปสะกดipref3ผิด) - บันทึกผลจากทั้งเครื่อง Server และ Client — สองฝั่งรายงานตัวเลขคนละบรรทัด (
senderกับreceiver) ให้จดทั้งคู่ - ทำขั้นที่ 3 และ 4 ซ้ำอีก 9 ครั้ง แล้วหาค่าเฉลี่ย — ใช้ลูปในกล่องส่วนขยายที่ §5.3 จะจบใน 100 วินาที
ตัวเลข 10 รอบจะแกว่งเล็กน้อยเสมอ เพราะ ① TCP ต้องไต่ความเร็วขึ้นใหม่ทุกรอบ (slow start) รอบ 10 วินาทีจึงมีช่วงต้นที่ยังไม่เต็มความเร็ว ② มีทราฟฟิกอื่นในวงเดียวกัน เช่น BPDU ทุก 2 วินาที และ ARP ③ ถ้าเป็นพอร์ต 100 Mbps เพดานจริงจะอยู่ราว 94 Mbits/sec ไม่ใช่ 100 พอดี เพราะมี header ของ Ethernet/IP/TCP กินไป · ค่าเฉลี่ยจึงมีความหมายมากกว่าค่าที่ดีที่สุดรอบเดียว — และนี่คือเหตุผลที่ใบแลปสั่งให้ทำ 10 รอบ
5.12จุดที่ Mac ต่างจากที่ใบแลปเขียนไว้
| เรื่อง | ใบแลปเขียนไว้ (Windows) | ของ Mac ต้องทำแบบนี้ |
|---|---|---|
| FTP Server | ลง FileZilla Server → Connect to Server → Server → Configure → Server Listeners → เปลี่ยน Protocol เป็น Explicit FTP over TLS and insecure plain FTP → Add User → ตั้ง Virtual/Native path (รูปที่ 1–11) | FileZilla ไม่มี Server รุ่น macOS → pip3 install pyftpdlib แล้ว sudo python3 -m pyftpdlib -p 21 -w -d ~/ftpshare · บรรทัดเดียวได้ครบทั้ง 4 เป้าหมาย → §5.2 |
| ตรวจว่า server ขึ้นจริง | ดูหน้าต่างโปรแกรมว่า connect ได้ | nc -vz 127.0.0.1 21 ต้องได้ succeeded! · sudo lsof -nP -iTCP:21 -sTCP:LISTEN · ftp 127.0.0.1 |
คำสั่ง ftp | มีมากับ Windows อยู่แล้ว พิมพ์ใน Command Prompt / PowerShell ได้เลย | Apple ถอดออกตั้งแต่ macOS 11 Big Sur → brew install inetutils หรือใช้ curl -O -u lab:lab123 ftp://192.3.128.10/test50m.bin |
| สร้างไฟล์ ≥30 MB | หาไฟล์ใหญ่ ๆ ในเครื่องเอามาวางในโฟลเดอร์แชร์ | mkfile 50m test50m.bin (คำสั่งนี้มีเฉพาะ macOS) หรือ dd if=/dev/urandom of=test50m.bin bs=1m count=50 |
| ที่อยู่ของไฟล์ที่ get มา | C:\Users\<username> | โฟลเดอร์ที่ยืนอยู่ตอนพิมพ์ ftp — cd ~/Downloads ก่อนเสมอ ไม่งั้นไฟล์ 50 MB จะไปโผล่ที่ ~ |
| iperf3 | ดาวน์โหลด zip จาก iperf.fr → extract → cd เข้าโฟลเดอร์ → ./iperf3.exe | brew install iperf3 แล้วพิมพ์ iperf3 จากที่ไหนก็ได้ ไม่ต้องมี ./ → §5.3 |
| Wireshark | โหลดจาก wireshark.org กด Next จนจบ | ต้องเลือกรุ่น Arm (M1 ขึ้นไป) และติดตั้ง ChmodBPF.pkg ด้วย ไม่งั้นไม่เห็น interface · เช็ก id -Gn | grep access_bpf |
| Console เข้าสวิตช์จริง | เปิด PuTTY → เลือก Serial → COM3 | ไม่มี PuTTY บน macOS → ls /dev/tty.* แล้ว screen /dev/tty.usbmodemXXXX 9600 · ถอย Ctrl+A Ctrl+\ · screen -ls / screen -X -S <id> quit → Lab 2 §2.4 |
| พอร์ต Ethernet | โน้ตบุ๊ก Windows ส่วนใหญ่มีช่อง RJ-45 ในตัว | MacBook Air M2 ไม่มีช่อง Ethernet → ต้องใช้ USB-C → Ethernet adapter · ชื่อการ์ดจะเป็น en5, en6 แล้วแต่เครื่อง |
| ตั้ง IP ของเครื่อง | Control Panel → Network and Sharing Center → Change adapter settings → IPv4 → Use the following IP address | System Settings → Network → คลิกการ์ด USB-C Ethernet → Details… → TCP/IP → Configure IPv4 = Manually → 192.3.128.2 / 255.255.255.0 |
| ปิด Firewall | Windows Defender Firewall → Turn off | System Settings → Network → Firewall → ปิดสวิตช์ จำเป็นมากในแลปนี้ เพราะเป็นฝั่งที่รัน FTP server (เปิดคืนหลังทำเสร็จ) |
| ปิด Wi-Fi | ปิดจากหน้า Network Connections | คลิกไอคอน Wi-Fi บนแถบเมนู → สลับปิด · ถ้าไม่ปิดจะมีสองเส้นทางออก แล้ว ftp/iperf3 อาจวิ่งออก Wi-Fi แทนที่จะผ่านสวิตช์ ผลที่วัดได้จะเพี้ยนหมด |
| สกรีนช็อตส่งงาน | ปุ่ม PrtSc / Snipping Tool | ⌘+⇧+4 ลากครอบ (ไฟล์ลง Desktop) · ⌘+⇧+5 ถ้าจะอัดวิดีโอตอนพอร์ตเปลี่ยนสถานะ |
| GNS3 | ตัวติดตั้ง .exe | ไฟล์ .dmg เวอร์ชัน 2.2.53 จาก GitHub release · ใช้ server ของ KKU ต้องต่อ VPN KKU ก่อนเปิดโปรแกรม → หน้า Setup |
5.13เช็คว่าทำถูกไหม
| คำสั่ง | ต้องได้ผลอะไร |
|---|---|
show vlan brief | ต้องมีแถว 9 STP-LAB active และพอร์ตที่ใช้ทั้งหมดต้องอยู่ในแถวนั้น — ถ้าพอร์ตยังค้างอยู่ VLAN 1 แปลว่าลืม switchport access vlan 9 |
show spanning-tree vlan 9 | ① ต้องมีบรรทัด Spanning tree enabled protocol ieee ② Root ID ของทั้งสามตัวต้องตรงกันหมด ③ ต้องมีพอร์ตเดียวในวงที่เป็น Altn BLK ไม่มากไม่น้อยกว่านี้ |
show spanning-tree root ส่วนขยาย | สรุปแถวเดียวต่อ VLAN บอกว่า root คือใคร cost เท่าไร ออกพอร์ตไหน — ใช้ตอบข้อ 4.2.2 ได้เร็วที่สุด |
show spanning-tree summary ส่วนขยาย | นับให้เลยว่ามีกี่พอร์ตในแต่ละสถานะ — ถ้ายังมีพอร์ตอยู่ใน Listening/Learning แปลว่ายังไม่บรรจบ ให้รอ |
show monitor session 1 | ต้องเห็น Source Ports … Both : Et0/0, Et0/1 และ Destination Ports : Et0/2 — ถ้าว่างเปล่าแปลว่ายังไม่ได้ตั้ง mirror แล้ว Wireshark จะไม่เห็นทราฟฟิก FTP |
ping 192.3.128.10 จาก client | ต้องผ่านทุกลูก · ถ้าลูกแรก ๆ หายไป 1–2 ลูกเป็นเรื่องปกติ (ARP + STP ยังไม่บรรจบ) แต่ถ้าหายเกิน 30 วินาทีแปลว่ามีอะไรผิด |
nc -vz 192.3.128.10 21 | succeeded! = FTP server พร้อมและวิ่งถึงกันได้ — เช็คอันนี้ก่อนเสมอก่อนจะไปงมที่ตัว ftp client |
Wireshark filter stp | ต้องเห็น BPDU ไหลมาทุก 2 วินาที · source MAC เป็นของสวิตช์ · destination 01:80:c2:00:00:00 · ถ้าไม่เห็นเลย = STP ถูกปิดอยู่ |
| Wireshark I/O Graph | ตอนโอนไฟล์ต้องเห็นแท่งสูงต่อเนื่อง · ตอนดึงสายต้องเห็นหลุมกว้างราว 30 วินาที |
SW1#show spanning-tree vlan 9
VLAN0009
Spanning tree enabled protocol ieee
Root ID Priority 32777
Address aabb.cc00.0100
This bridge is the root <-- ตัว root จะขึ้นบรรทัดนี้แทน Cost/Port
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32777 (priority 32768 sys-id-ext 9)
Address aabb.cc00.0100 <-- ตรงกับ Root ID ข้างบนเป๊ะ = ตัวเองคือ root
Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------
Et0/0 Desg FWD 100 128.1 P2p
Et0/1 Desg FWD 100 128.2 P2p
Et0/2 Desg FWD 100 128.3 P2p Edge
# ทุกพอร์ตของ root bridge เป็น Designated เสมอ · ไม่มี Root Port และไม่มีพอร์ตถูกบล็อก5.14ถ้าไม่ผ่าน ให้ไล่ตามนี้
| อาการ | สาเหตุ | คำสั่งแก้ |
|---|---|---|
pip3 install pyftpdlib ขึ้น externally-managed-environment | Python 3.12+ ห้ามลงแพ็กเกจลง system python ตรง ๆ | pip3 install --user pyftpdlib หรือ pip3 install --break-system-packages pyftpdlib |
สั่ง pyftpdlib แล้วขึ้น Permission denied หรือ bind: Permission denied | พอร์ต 21 เป็นพอร์ตต่ำกว่า 1024 ต้องเป็น root | ใส่ sudo นำหน้า · หรือทดสอบด้วยพอร์ตสูงก่อน -p 2121 แล้วต่อด้วย ftp 127.0.0.1 2121 |
zsh: command not found: ftp | macOS 11 ขึ้นไปไม่มีคำสั่ง ftp แล้ว | brew install inetutils · หรือใช้ curl -u lab:lab123 ftp://192.3.128.10/ แทน |
ftp ls ขึ้น unknown host ls | ใบแลปเขียนติดกัน — ls ต้องพิมพ์ข้างใน prompt ftp> | พิมพ์ ftp 192.3.128.10 ก่อน แล้วค่อยพิมพ์ ls |
ล็อกอิน FTP ได้ แต่ ls ค้าง / get ไม่เริ่ม | โหมด passive ต้องเปิดพอร์ตช่วงสูงเพิ่ม แต่ Firewall ปิดไว้ | ปิด Firewall ของ macOS · หรือพิมพ์ passive ที่ prompt ftp> เพื่อสลับโหมด · หรือรัน server ด้วย -r 60000-60010 แล้วเปิดช่วงนั้น |
| เพื่อน ping เครื่องเราได้ แต่ต่อ FTP ไม่ได้ | Firewall ของ macOS ยังเปิดอยู่ | System Settings → Network → Firewall → ปิด |
show spanning-tree ขึ้น No spanning tree instance exists | STP ถูกปิด (จากข้อ 4.5) หรือยังไม่ได้สร้าง VLAN 9 | spanning-tree vlan 9 · แล้วเช็ก show vlan brief ว่ามี VLAN 9 จริง |
| Root ID ที่เห็นบนแต่ละสวิตช์ไม่ตรงกัน | ยังไม่บรรจบ (converge) หรือมีสายไม่เข้าสัก VLAN | รอ 50 วินาที แล้วดูใหม่ · ถ้ายังไม่ตรง เช็ก show vlan brief ว่าพอร์ตที่เชื่อมสวิตช์อยู่ VLAN 9 ทั้งคู่ |
ตั้ง priority 4000 แล้วโดนปฏิเสธ | ค่าต้องเป็นพหุคูณของ 4096 | ใช้ 4096, 8192, 12288, … หรือใช้ spanning-tree vlan 9 root primary ให้ IOS คิดให้ |
| ตั้ง priority แล้ว root ไม่ย้าย | ตั้งผิด VLAN (ไปตั้ง vlan 1 ทั้งที่ทดลองบน vlan 9) | show spanning-tree vlan 9 | include Priority ต้องเห็น 4105 ไม่ใช่ 32777 |
% Invalid input detected ตอนพิมพ์ spanning-tree | ใบแลปสะกด spannning-tree เกินตัว n · หรืออยู่ผิดโหมด | พิมพ์ spanning-tree (n สองตัว) · ต้องอยู่ที่ (config)# ไม่ใช่ # |
| ดึงสายแล้วเน็ตกลับมาช้ากว่า 50 วินาที | พอร์ตอีกฝั่งก็ต้องไต่สถานะเหมือนกัน · หรือ MAC table เก่ายังไม่หมดอายุ | รอให้ครบ · clear mac address-table dynamic เร่งได้ · ถ้าเกิน 60 วินาทีให้เช็ก show spanning-tree ว่าค้างที่ LIS/LRN จริงไหม |
| เน็ตล่ม console พิมพ์ไม่ได้หลังปิด STP | Broadcast storm — CPU สวิตช์เต็ม | ถอดสายระหว่างสวิตช์ออกหนึ่งเส้นทันที ให้ไม่เป็นวง แล้วค่อยเปิด STP กลับ → §5.11 ข้อ 4.5 |
| Wireshark ไม่เห็นทราฟฟิก FTP ของคนอื่น | ยังไม่ได้ตั้ง port mirroring | monitor session 1 source … both + destination … แล้วเสียบเครื่องเราที่พอร์ต destination → Listing 7 |
| Wireshark ไม่มี interface ให้เลือกเลย | ยังไม่ได้ลง ChmodBPF.pkg | ลง ChmodBPF.pkg → logout/login → id -Gn | grep access_bpf |
| ผล iperf3 แกว่งมาก / ได้ความเร็วสูงผิดปกติ | ยังไม่ได้ปิด Wi-Fi ทราฟฟิกอาจวิ่งออก Wi-Fi แทนที่จะผ่านสวิตช์ | ปิด Wi-Fi ให้เหลือแต่การ์ด USB-C Ethernet · ยืนยันด้วย route get 192.3.128.10 ว่าออก en5 |
| ใน GNS3 ต่อสามเหลี่ยมแล้วไม่มีพอร์ตไหนถูกบล็อก | ใช้ "Ethernet switch" ที่ติดมากับ GNS3 ซึ่งไม่รัน STP | เปลี่ยนไปใช้ image L2-ADVENTERPRISE (IOU) หรือ c3725 + NM-16ESW → §5.10 |
5.15อภิปราย และคำถามท้ายการทดลอง
5. อภิปราย
"เปรียบเทียบผลการตรวจสอบ Spanning Tree ตั้งแต่กำหนด Priority ติดตั้ง และยกเลิก Spanning Tree"
| ช่วง | ผลของ show spanning-tree vlan 9 | สิ่งที่เห็นในเครือข่าย |
|---|---|---|
| ① ติดตั้ง STP (ค่าปริยาย) | Root ID = ตัวที่มี MAC ต่ำสุด · Bridge Priority = 32777 ทุกตัว · มี 1 พอร์ตเป็น Altn BLK | ping ผ่าน · โอนไฟล์เต็มความเร็ว · I/O Graph เป็นแท่งราบ · BPDU ไหลทุก 2 วินาที · ไฟส้มค้าง 1 พอร์ต |
| ② กำหนด Priority ( 4096 ที่ SW2) | Root ID ย้ายไปเป็น SW2 · Bridge Priority ของ SW2 = 4105 · พอร์ตที่ถูกบล็อกย้ายที่ (ในตัวอย่างนี้ย้ายจาก Et0/1 ไป Et0/0 ของ SW3) | ระหว่างคำนวณใหม่มีทราฟฟิกสะดุดราว 30 วินาที · หลังจากนั้นกลับมาปกติ · เส้นทางที่ข้อมูลวิ่งจริงเปลี่ยนไป แม้ผลลัพธ์ปลายทางเหมือนเดิม |
| ③ ยกเลิก STP ( no spanning-tree vlan 9) | No spanning tree instance exists. — ไม่มีตารางพอร์ตให้ดูเลย · ไม่มี Root ID ไม่มี Bridge ID | Broadcast storm — ทุกพอร์ตกะพริบรัว · CPU เต็ม · console แทบพิมพ์ไม่ได้ · I/O Graph พุ่งชนเพดานค้าง · โอนไฟล์ไม่จบ · MACFLAP_NOTIF วิ่งรัว |
"ผลการทดลองแสดงว่า STP ไม่ได้เพิ่มความเร็ว แต่เป็นตัวที่ทำให้เครือข่ายที่มีสายสำรองใช้งานได้เลย — เมื่อเปิด STP ด้วยค่าปริยาย ระบบเลือก root จาก MAC ที่ต่ำสุดโดยอัตโนมัติซึ่งผู้ดูแลควบคุมไม่ได้ การกำหนด priority จึงมีไว้เพื่อบังคับให้สวิตช์ที่เราต้องการเป็น root (ปกติเลือกตัวที่อยู่ตรงกลางหรือแรงที่สุด เพื่อให้เส้นทางของทุกคนสั้นที่สุดและเพื่อวาง Wireshark ได้ตรงจุด) · ส่วนการยกเลิก STP พิสูจน์ว่าลูปเลเยอร์ 2 ไม่มีกลไกป้องกันตัวเองใด ๆ เลย เพราะเฟรมไม่มี TTL — เครือข่ายจึงล่มภายในไม่กี่วินาที และกู้คืนได้ทางเดียวคือถอดสายให้ไม่เป็นวง"
6. คำถามท้ายการทดลอง
"จากการทดลองตรวจจับค่า BPDU (STP) จาก Wireshark ให้แสดงค่าที่ตรวจจับ และแสดงค่าที่เกี่ยวข้องกับ STP ว่ามีอะไรบ้าง"
แนวคำตอบ — วิธีดักจับ และตารางค่าที่ต้องแสดง
ขั้นตอนดักจับ
- เปิด Wireshark ที่ interface ของการ์ด USB-C Ethernet (ใน GNS3: คลิกขวาที่สายระหว่างสวิตช์ → Start capture)
- ใส่ display filter
stpแล้วกด Enter — ไม่ต้องตั้ง port mirroring เพราะสวิตช์ส่ง BPDU ออกทุกพอร์ตอยู่แล้ว - รอ 5–10 วินาที จะเห็นแถวโผล่มาเรื่อย ๆ ทุก 2 วินาที · คลิกแถวหนึ่ง แล้วกางกิ่ง Spanning Tree Protocol ในหน้าต่างกลาง
- สกรีนช็อตทั้งรายการแพ็กเก็ตและกิ่งที่กางออก แล้วกรอกลงตารางข้างล่าง
ค่าที่เห็นในกิ่ง Spanning Tree Protocol — และแปลว่าอะไร
| ฟิลด์ที่ Wireshark แสดง | ค่าตัวอย่าง | ความหมาย |
|---|---|---|
| Destination (ชั้น Ethernet) | 01:80:c2:00:00:00 | MAC multicast ที่สงวนไว้สำหรับ BPDU โดยเฉพาะ — ไม่ใช่ broadcast |
| LLC · DSAP / SSAP | 0x42 | บอกว่าเฟรมนี้เป็น Spanning Tree BPDU · BPDU ห่อด้วย 802.3 + LLC ไม่ใช่ Ethernet II |
| Protocol Identifier | 0x0000 | อัลกอริทึม spanning tree ตาม 802.1 — ศูนย์ทั้งหมด (2 ไบต์) |
| Protocol Version Identifier | 0 (Spanning Tree) | 0 = STP ดั้งเดิม (802.1D) · ถ้าเป็น 2 คือ RSTP (1 ไบต์) |
| BPDU Type | 0x00 Configuration | ศูนย์ = Configuration BPDU · 0x80 = TC-BPDU (1 ไบต์) |
| BPDU flags | 0x00 | บิต 7 = Topology Change · บิต 0 = Topology Change Ack · ที่เหลือไม่ได้ใช้ (1 ไบต์) |
| Root Identifier | 32777 / 9 / aabb.cc00.0100 | root bridge คือใคร — priority 2 ไบต์ + MAC 6 ไบต์ · Wireshark แยก sys-id-ext (9) ให้ด้วย |
| Root Path Cost | 100 | ต้นทุนจากผู้ส่ง BPDU ใบนี้ไปถึง root (4 ไบต์) · ตัว root เองส่งออกมาเป็น 0 |
| Bridge Identifier | 32777 / 9 / aabb.cc00.0300 | ใครเป็นคนส่ง BPDU ใบนี้ — priority + MAC ของผู้ส่ง (8 ไบต์) |
| Port identifier | 0x8002 | พอร์ตที่ส่งออกมา = port priority 0x80 (128) + หมายเลขพอร์ต (2 ไบต์) |
| Message Age | 1 sec (หรือ 0) | อายุของ configuration message นับจากที่ root สร้าง — 0 ถ้ามาจาก root ตรง ๆ และเพิ่มขึ้นทุก hop |
| Max Age | 20 sec | เกินนี้ให้ทิ้ง BPDU และถือว่าเส้นทางตาย |
| Hello Time | 2 sec | ช่วงเวลาที่ root ส่ง configuration message |
| Forward Delay | 15 sec | เวลาของ Listening และของ Learning อย่างละ 15 วินาที |
สังเกตเพิ่มเพื่อให้คำตอบสมบูรณ์
- ค่าที่เกี่ยวกับ STP โดยตรงมี 12 ฟิลด์ รวม 35 ไบต์ — แจกแจง 2+1+1+1+8+4+8+2+2+2+2+2 ให้ดูจะได้คะแนนเต็ม → ตารางเต็มในบทที่ 15
- สาม–สี่ฟิลด์ที่ตัดสินทุกอย่าง คือ Root Identifier (เลือก root) · Root Path Cost (เลือก root port และ designated port) · Bridge Identifier + Port Identifier (ตัดสินเมื่อค่าอื่นเท่ากัน)
- เทียบ BPDU จากสามสวิตช์ — ทุกใบต้องมี Root Identifier ตรงกัน แต่ Bridge Identifier ต่างกัน และ Root Path Cost ต่างกันตามระยะห่างจาก root · ถ้า Root Identifier ไม่ตรงกัน แปลว่ายังไม่บรรจบ
- ตอนดึงสาย (ข้อ 4.4) จะเห็น BPDU ที่
BPDU flags = 0x01หรือ0x81โผล่ขึ้นมา นั่นคือธง TC / TCA ที่ใช้บอกให้ทุกสวิตช์ล้างตาราง MAC เร็วขึ้น — เก็บภาพนี้ไว้ด้วยจะได้คะแนนเพิ่ม - ตอนปิด STP (ข้อ 4.5) BPDU จะหายไปทั้งหมด — ใช้เป็นหลักฐานยืนยันว่าปิดสำเร็จ
คลิกขวาที่แถว BPDU ใน Wireshark → Copy → All Visible Items จะได้ข้อความทั้งกิ่งเป็นตัวหนังสือ วางลงรายงานได้เลย ไม่ต้องพิมพ์ตามทีละบรรทัด · หรือ File → Export Packet Dissections → As Plain Text ถ้าจะเอาหลายแพ็กเก็ต
5.16ถ้าออกสอบ ต้องทำอะไรได้บ้าง
ข้อสอบแลปปีที่แล้วทั้ง 4 ข้อ ไม่มีข้อไหนสั่ง STP ตรง ๆ (① router + Serial ② Wireshark filter ③ VLAN ④ Mininet) — แต่แลปนี้ยังต้องอ่านด้วยสามเหตุผล:
- ทฤษฎี STP = บทที่ 15 ซึ่งออกข้อเขียนแน่ โจทย์ให้ผังกับ Bridge ID มาแล้วสั่งหา root / root port / designated port / blocked port — แลปนี้คือการเห็นของจริงที่ทำให้ทฤษฎีนั้นจำง่ายขึ้นมาก
- คำสั่ง VLAN ใน Listing 1–3 คือข้อ 3 ของข้อสอบแลป (10 คะแนน) —
vlan,name,switchport mode access,switchport access vlan,show vlan - Wireshark filter ในแลปนี้คือข้อ 2 (10 คะแนน) — โจทย์สั่ง filter จาก source address ของ ping และ filter
icmpกับarp
เช็กลิสต์สำหรับห้องสอบ — ทำตามลำดับนี้
- เตรียมล่วงหน้าที่บ้าน (ห้ามรอไปทำในห้อง) —
pip3 install pyftpdlib·brew install iperf3 inetutils· Wireshark Arm + ChmodBPF ·mkfile 50m test50m.bin - วาดผังลงกระดาษก่อนแตะอุปกรณ์ — สวิตช์ 3 ตัว สายสามเส้น IP ทุกเครื่องในวง
192.3.128.0/24· VLAN9 - สร้าง VLAN ให้ครบทุกตัวก่อน แล้วเอาพอร์ตเข้า VLAN → ยืนยันด้วย
show vlan briefก่อนเสียบสายวง - เสียบสายให้ครบสามเส้น แล้วรอ 50 วินาที — อย่ารีบพิมพ์
show - หา root ให้เจอ —
show spanning-tree vlan 9ทั้งสามตัว · ตัวที่ขึ้นThis bridge is the rootคือคำตอบ - จดตารางพอร์ตทั้งหมด — สวิตช์ / พอร์ต / ต่อไปหาใคร / Role / Sts · วาดรูปพร้อมระบายสีพอร์ตที่
BLK - บังคับ root ด้วย priority —
spanning-tree vlan 9 priority 4096ที่ตัวที่ยังไม่ใช่ root · ค่าต้องเป็นพหุคูณของ 4096 · รอ 30 วินาที แล้วจดตารางใหม่ - ตั้ง port mirroring ที่ root ก่อนเปิด Wireshark ดักทราฟฟิก FTP → Listing 7–8
- เก็บผลส่ง —
show spanning-tree vlan 9ทั้งสามช่วง (ปริยาย / หลังตั้ง priority / หลังปิด STP) ·show vlanของทุกสวิตช์ · สกรีนช็อต I/O Graph ทั้งสามรอบ · สกรีนช็อต BPDU ที่กางกิ่งแล้ว · ผล iperf3 10 รอบ + ค่าเฉลี่ย copy run startก่อนลุกจากเครื่อง (แต่อย่าเซฟตอนที่ STP ยังปิดอยู่ — เปิดกลับก่อน ไม่งั้นเครื่องถัดไปที่มาใช้จะเจอเน็ตล่มทันทีที่บูต)
เอา lab sheet และ lab report เข้าได้ · เปิด iPad / notebook ได้ · ต่อเน็ตได้ · ห้ามเปิด AI — เห็นหน้า AI เมื่อไหร่ อาจารย์ขอสิทธิ์ตรวจสอบทันที · หน้านี้เป็นเว็บธรรมดา เปิดอ่านได้ปกติ ให้เปิดค้างไว้ที่ §5.9 (คำสั่งทั้งหมด) กับ §5.14 (ตารางแก้ปัญหา)
5.17เช็คความเข้าใจ
show spanning-tree vlan 9 บน SW3 แสดงว่า Et0/1 เป็น Altn BLK ส่วน Et0/0 เป็น Root FWD · คุณดึงสายที่พอร์ต Et0/0 ของ SW3 ออก ระหว่างที่ไฟล์กำลังโอน — อีกนานแค่ไหน Et0/1 ถึงจะส่งข้อมูลได้300 วินาที คือ aging time ของตาราง MAC ไม่เกี่ยวกับสถานะพอร์ตspanning-tree vlan 9 priority 4096 ที่ SW2 แล้วพิมพ์ show spanning-tree vlan 9 ปรากฏว่าบรรทัด Bridge ID ขึ้นว่า Priority 4105 ไม่ใช่ 4096 — เกิดอะไรขึ้นpriority 4105 ให้ตรงกัน4096 + 9 = 4105sys-id-ext — ผลคือเลขที่แสดงจะเป็น priority ที่ตั้ง + เลข VLAN เสมอ · ค่าปริยาย 32768 บน VLAN 9 จึงแสดงเป็น 32777 และ 4096 แสดงเป็น 4105 · สังเกตว่า IOS พิมพ์ที่มาไว้ให้แล้วในวงเล็บ (priority 4096 sys-id-ext 9) · และเพราะทุกตัวบวกเลข VLAN เดียวกันหมด การเปรียบเทียบ BID จึงไม่เปลี่ยน ใครตั้ง priority ต่ำกว่าก็ยังชนะอยู่ดีno spanning-tree vlan 9no spanning-tree ใช้ไม่ได้ถ้ายังมีสายเสียบอยู่ IOS จะปฏิเสธno spanning-tree vlan 9 ขณะที่สายยังครบ พอร์ตที่เคยถูกบล็อกจะเปิดทันที แล้วเฟรมบรอดคาสท์ใบแรกที่วิ่งเข้ามาจะวนไม่รู้จบและทวีคูณ เพราะเฟรมเลเยอร์ 2 ไม่มี TTL — ภายในไม่กี่วินาทีสายเต็ม CPU เต็ม console แทบพิมพ์ไม่ได้ ซึ่งคือที่มาของวงเล็บ "ระวังเครื่องค้าง" ในใบแลป · จึงต้องตัดวงก่อน → ปิด STP → เสียบกลับพร้อมเริ่มโอนไฟล์ เพื่อให้ได้เห็น storm เกิดขึ้น "ในจังหวะที่เราคุมได้" · วิธีกู้เมื่อล่มคือถอดสายออกหนึ่งเส้น ไม่ใช่รีบูต① กติกา 3 ขั้น: Root Bridge (BID ต่ำสุด) → Root Port (cost ต่ำสุด ตัวละ 1) → Designated Port (segment ละ 1) ที่เหลือคือ Block Port ② BID = Priority 2 ไบต์ + MAC 6 ไบต์ · บน Cisco เลขที่แสดง = priority + เลข VLAN (32768+9 = 32777) ③ priority ต้องเป็นพหุคูณของ 4096 ④ Port State: Blocking 20 → Listening 15 → Learning 15 → Forwarding = 50 วินาที · สายขาดตรงหน้าเหลือ 30 วินาที ⑤ show spanning-tree vlan 9 — ตัวที่ขึ้น This bridge is the root คือ root · คอลัมน์ Role คือตำแหน่ง Sts คือสถานะตอนนี้ ⑥ portfast ใส่เฉพาะพอร์ตที่ต่อ PC ห้ามใส่ระหว่างสวิตช์ ⑦ ปิด STP ตอนสายยังเป็นวง = เน็ตล่มทันที กู้ด้วยการถอดสายหนึ่งเส้น ⑧ Mac: ไม่มี FileZilla Server ใช้ sudo python3 -m pyftpdlib -p 21 -w -d ~/ftpshare · ไม่มีคำสั่ง ftp ใช้ brew install inetutils หรือ curl · iperf3 ไม่ต้องมี ./ ⑨ Wireshark filter: stp · ftp-data · tcp.port == 5201 · Statistics → I/O Graphs ⑩ ทฤษฎีเต็ม ๆ อยู่ที่ บทที่ 15