Lab 5 · มิถุนายน 2569

Implementing Spanning Tree Protocol on Cisco Switches

ต่อสวิตช์สามตัวเป็นสามเหลี่ยม (มีลูปเต็ม ๆ) แล้วดูว่า STP เลือก Root Bridge อย่างไร บล็อกพอร์ตไหน · บังคับ Root ด้วย priority 4096 · ดึงสายแล้วจับเวลาที่พอร์ตสำรองไต่ Listening → Learning → Forwarding · ปิด STP แล้วดูเน็ตล่มด้วยตาตัวเอง

อ่าน ~30 นาที ทำจริง ~3 ชม. ทฤษฎี = บทที่ 15
สรุปแลปนี้ใน 30 วินาที

ทำอะไร — เตรียม 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
5BPDU คือเฟรมอะไร มีข้อมูลอะไรบ้าง§5.7
6คำสั่งที่เกี่ยวข้อง Listing 1–8 — VLAN, STP, Priority, Mirror§5.9
7ต่ออุปกรณ์ตามรูปที่ 13 กำหนด IP ให้เหมาะสม · ทุกสวิตช์อยู่บน VLAN 9 · เปิด Wireshark ดักจับตลอด§5.10
84.1 สังเกตไฟบนสวิตช์ว่าเป็นสีส้มหรือไม่ เพราะเหตุใด§5.11
94.2 กำหนด Priority ให้สวิตช์ · วาดรูปการเชื่อมต่อและระบุสถานะของพอร์ต ทั้งก่อนและหลัง§5.11
104.3–4.4 โอนไฟล์ ≥ 30 MB ด้วย FTP + ดู I/O Graph · แล้วดึงสายระหว่างโอน§5.11
114.5 โอนข้อมูลโดยยกเลิก STP (ระวังเครื่องค้าง) แล้วบันทึกเวลาและผลจากกราฟ§5.11
124.6 หาความเร็ว transfer ด้วย iperf3 ซ้ำ 10 ครั้ง แล้วหาค่าเฉลี่ย§5.11
135. อภิปราย — เปรียบเทียบผล show spanning-tree ตั้งแต่กำหนด Priority · ติดตั้ง · และยกเลิก STP§5.15
146. คำถามท้ายการทดลอง — ดักจับ BPDU จาก Wireshark แล้วแสดงค่าที่เกี่ยวข้องกับ STP§5.15
ตาราง IP ของแลปนี้ — แทนค่า x = 3, y = 128 ให้แล้ว

ใบแลปเขียนแค่ "พร้อมกำหนด IP ให้เหมาะสม" ไม่ได้ให้ตารางมา — ตารางนี้เป็นส่วนขยายที่แทนค่ารหัส 673040128-3 ลงไปแล้ว (x = 3 คือเลขหลังขีด · y = 128 คือสามตัวก่อนขีด mod 254) · ทุกเครื่องอยู่วงเดียวกันหมด เพราะ STP เป็นเรื่องของเลเยอร์ 2 ล้วน ๆ ไม่ต้องมี router

อุปกรณ์บทบาทIPSubnet MaskVLAN
MacBook Air M2FTP Client + iperf3 Client192.3.128.2255.255.255.09
เครื่อง Wiresharkดักจับทราฟฟิก (เสียบที่ Root Bridge)192.3.128.3255.255.255.09
FTP / iperf3 Serverเครื่องที่รัน FTP server + iperf3 -s192.3.128.10255.255.255.09
SW1 (ตัวบน)สวิตช์ · จัดการผ่าน interface vlan 9192.3.128.101255.255.255.09
SW2 (ล่างซ้าย)สวิตช์ · ฝั่ง FTP Client192.3.128.102255.255.255.09
SW3 (ล่างขวา)สวิตช์ · ฝั่ง FTP Server192.3.128.103255.255.255.09

ไม่ต้องมี 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 ให้ครบ

ใบแลปต้องการอะไรจากขั้นตอน FileZilla ทั้ง 10 ข้อ — สรุปเป็นเป้าหมาย 4 ข้อ
  1. มี FTP server ฟังอยู่ที่พอร์ต 21 ของเครื่องหนึ่งในวง
  2. ยอมให้ต่อแบบ plain FTP ไม่เข้ารหัส (ในรูปที่ 8 คือเปลี่ยน Protocol จาก Require explicit FTP over TLS เป็น Explicit FTP over TLS and insecure plain FTP) — เพราะต้องให้ Wireshark อ่านออก
  3. มี user + password อย่างน้อยหนึ่งชุด (รูปที่ 9–10)
  4. ชี้ path ว่าจะให้เครื่องอื่นเข้าถึงโฟลเดอร์ไหน — Virtual path / → Native path = โฟลเดอร์จริง (รูปที่ 11) และในโฟลเดอร์นั้นต้องมีไฟล์ขนาดอย่างน้อย 30 MB

วิธีที่ง่ายที่สุดบน Mac — pyftpdlib (คำสั่งเดียวจบ)

  1. ติดตั้งไลบรารี — ทำครั้งเดียว ตอนที่ยังมีเน็ต (ที่บ้าน) อย่ารอไปทำในห้องแลป
    [macOS Terminal] — ทำที่บ้าน ก่อนเข้าห้อง
    $ pip3 install pyftpdlib
    
    # ถ้าขึ้น error: externally-managed-environment (Python 3.12+ / Homebrew)
    # ให้ใช้บรรทัดใดบรรทัดหนึ่งข้างล่างแทน
    $ pip3 install --user pyftpdlib
    $ pip3 install --break-system-packages pyftpdlib
  2. สร้างโฟลเดอร์แชร์ + ไฟล์ทดสอบ ≥ 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
  3. สั่งเซิร์ฟเวอร์ขึ้น — พอร์ต 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
  4. ตรวจว่าเซิร์ฟเวอร์ขึ้นจริง — เปิด 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
  5. เปิดให้เครื่องอื่นเข้าถึงได้ — ปิด Firewall ของ macOS (System Settings → Network → Firewall) แล้วให้เพื่อนลองจากเครื่องเขา
    [เครื่องเพื่อน / Windows]
    > ftp 192.3.128.2   # IP ของ MacBook เรา
จุดที่คนพลาดบ่อย — macOS ไม่มีคำสั่ง ftp มาให้แล้ว

ใบแลปข้อ 4.3 สั่งให้พิมพ์ ftp <ip address> แต่ Apple ถอดโปรแกรม ftp และ telnet ออกจาก macOS ตั้งแต่ Big Sur (macOS 11) — บน MacBook Air M2 พิมพ์ ftp จะได้ zsh: command not found: ftp ทันที · แก้ได้ 2 ทาง

[macOS Terminal] — เลือกทางใดทางหนึ่ง ทำที่บ้านก่อนเข้าห้อง
# ทาง 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

[Ubuntu VM] — ssh ubuntu จาก Terminal ของ macOS
$ 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 ด้านบนแทน · เก็บรูปพวกนี้ไว้เพื่อ ① เข้าใจว่าเพื่อนกำลังทำอะไรอยู่ตอนทำแลปคู่กัน และ ② ตอบคำถามอาจารย์ได้ว่าค่าที่ต้องตั้งคืออะไร

หน้าต่างตัวติดตั้ง FileZilla Server 1.10.3 บน Windows หน้า License Agreement แสดงข้อความ GNU Affero General Public License Version 3 พร้อมปุ่ม I Agree ที่มุมล่าง
รูปที่ 1 จากใบแลป Lab 5 — หน้าต่างติดตั้งโปรแกรม FileZilla หน้าจอ Windows ใบแลปบอกว่ากด I Agree แล้ว Next ไปเรื่อย ๆ จนถึงหน้า Server settings (รูปที่ 2–4 คือหน้า Next ที่ไม่ต้องตั้งค่าอะไรเลย) แล้วกด Install
หน้าต่าง Administration interface ของ FileZilla Server 1.10.3 เป็นพื้นที่ว่างเปล่าทั้งหน้า มีเพียงปุ่ม Connect to Server อยู่ตรงกลาง และมีเมนู Server Window Help ที่แถบบน
รูปที่ 5 จากใบแลป Lab 5 — หน้าต่างโปรแกรม Filezilla หน้าจอ Windows เปิดครั้งแรกจะพบหน้าเปล่าพร้อมปุ่ม Connect to Server ตรงกลาง กดเข้าไปแล้วหน้าต่าง Connection จะเด้งขึ้นมา (รูปที่ 6) ไม่ต้องตั้งค่าอะไร กด OK จากนั้นไปที่เมนู Server → Configure (รูปที่ 7)
หน้าต่าง Settings for server 127.0.0.1:14148 เลือกหน้า Server listeners ทางซ้าย ตารางทางขวามีคอลัมน์ Address, Port, Protocol แถวแรกคือ 0.0.0.0 พอร์ต 21 และช่อง Protocol กำลังเปิดรายการให้เลือก โดยรายการ Explicit FTP over TLS and insecure plain FTP ถูกไฮไลต์เป็นแถบสีน้ำเงินและมีกรอบแดง
รูปที่ 8 จากใบแลป Lab 5 — การตั้งค่า FTP โปรโตคอลให้กับ Server listeners หน้าจอ Windows ข้อนี้สำคัญที่สุดในทั้ง 11 รูป: ที่ Address 0.0.0.0 พอร์ต 21 ต้องเปลี่ยน Protocol จาก Require explicit FTP over TLS เป็น Explicit FTP over TLS and insecure plain FTP ไม่งั้นทราฟฟิกจะถูกเข้ารหัสหมดและ Wireshark อ่านอะไรไม่ออก · เทียบกับฝั่ง Mac — pyftpdlib เป็น plain FTP อยู่แล้วโดยปริยาย จึงไม่ต้องตั้งอะไรตรงนี้
หน้าต่าง Settings for server หน้า Rights management / Users มีรายการ Available users ทางซ้ายคือ system user, user และ New User ที่ถูกเลือกอยู่ ทางขวาเป็นแท็บ General ติ๊ก User is enabled และช่อง Authentication เลือก Require a password to log in พร้อมช่องกรอกรหัสผ่านว่างอยู่ มีลูกศรแดงชี้ไปที่ช่องรหัสผ่านและที่ปุ่ม Rename ด้านล่าง
รูปที่ 10 จากใบแลป Lab 5 — การตั้งค่า Username และ Password หน้าจอ Windows กด Add ใต้ช่อง Available users (รูปที่ 9) จะได้ user ชื่อ New User มา แล้วตั้ง Password กด Apply · พอตั้งเสร็จช่อง Password จะขึ้นว่า Leave empty to keep existing · เปลี่ยนชื่อได้ด้วยปุ่ม Rename · เทียบกับฝั่ง Mac — คือตัวเลือก -u lab -P lab123 ของ pyftpdlib
หน้าต่าง Settings for server หน้า Rights management / Users แสดงตาราง Mount points ที่มีคอลัมน์ Virtual path เป็นเครื่องหมายทับ และ Native path เป็น E:\retro ทางขวามี Access mode เป็น Read + Write พร้อมช่องติ๊ก Apply permissions to subdirectories และ Writable directory structure มีลูกศรแดงสองอันชี้ไปที่แถว Virtual path และ Native path
รูปที่ 11 จากใบแลป Lab 5 — การตั้งค่า Virtual path และ Native path หน้าจอ Windows ช่อง Virtual path ใส่ / ส่วน 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 แล้ว

[macOS Terminal] — ทำที่บ้าน ก่อนเข้าห้อง
$ 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

[เครื่อง Server · 192.3.128.10]
$ iperf3 -s
# -----------------------------------------
# Server listening on 5201
# -----------------------------------------

ฝั่ง Client — ใบแลปข้อ 4.6.3

[MacBook · 192.3.128.2]
$ 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 ต้อง filter tcp.port == 5201

ทำซ้ำ 10 ครั้งแล้วหาค่าเฉลี่ย (ใบแลปข้อ 4.6.5)

ใบแลปสั่งให้ทำขั้นตอนที่ 3 และ 4 ซ้ำอีก 9 ครั้ง (รวมเป็น 10 ครั้ง) แล้วหาค่าเฉลี่ย — นั่งกด 10 รอบก็ได้ แต่บน Mac เขียนเป็นลูปบรรทัดเดียวจบและได้ตัวเลขเรียงสวย ๆ ไปแปะรายงานเลย

ส่วนขยาย — ลูปเก็บผล 10 รอบอัตโนมัติ (ใบแลปไม่ได้ให้คำสั่งนี้)
[macOS Terminal]
$ 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 = เห็นบนจอไปด้วยและเก็บลงไฟล์ไปด้วย

สกรีนช็อต Windows แสดง File Explorer เปิดโฟลเดอร์ iperf3.19_64 ที่แตกไฟล์ออกมาแล้ว มีไฟล์ cygcrypto-3-dll, cyggcc_s-1.dll, cygz.dll และ iperf3.exe · ทางขวาซ้อนอยู่คือหน้าต่าง Windows PowerShell ที่ cd เข้ามาในโฟลเดอร์ iperf3.19_64 แล้วพิมพ์คำสั่ง ./iperf3.exe
รูปที่ 14 จากใบแลป Lab 5 — การเรียกใช้ iperf3 (จุดที่ต้องสังเกต: ใบแลปให้คลิกขวาที่พื้นที่ว่างของโฟลเดอร์แล้วเลือก Open in Terminal หรือเปิด Terminal แล้ว 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 && icmpping ที่ออกจากเครื่องเราเท่านั้น — ตรงกับที่ข้อสอบข้อ 2 สั่งเป๊ะ ๆ ("filter จาก source address ของ ping")ข้อสอบข้อ 2
tcp.port == 5201ทราฟฟิกของ iperf3ข้อ 4.6
arpเฟรม ARP — ในสภาวะลูป คุณจะเห็น ARP ตัวเดิมซ้ำหลายพันแถวติดกัน นั่นคือหลักฐานของ broadcast stormข้อ 4.5
หน้าต่าง Wireshark กำลัง Capturing from Wi-Fi มีกรอบสีแดงล้อมช่อง Apply a display filter ที่อยู่ใต้แถบเครื่องมือ ด้านล่างเป็นรายการแพ็กเก็ตที่มีคอลัมน์ No., Time, Source, Destination, Protocol, Length, Info แสดงทราฟฟิก TCP, TLSv1.2 และ DNS ปะปนกัน
รูปที่ 15 จากใบแลป Lab 5 — การใช้งาน Filter เพื่อกรองหาสิ่งที่เราต้องการ (ช่องในกรอบแดงคือ display filter — พิมพ์แล้วกด Enter จะเหลือเฉพาะแพ็กเก็ตที่ตรงเงื่อนไข · ช่องเป็นสีเขียว = filter ถูก · สีชมพู = พิมพ์ผิด แล้วกด Enter ไปก็ไม่มีอะไรเกิดขึ้น)

I/O Graph — หัวใจของข้อ 4.3, 4.4 และ 4.5

ใบแลปสั่งให้ดูทราฟฟิก "ในรูปแบบ I/O Graph" ทั้งสามข้อ เพราะกราฟนี้ตอบคำถามได้ในภาพเดียวว่า ตอนไหนทราฟฟิกไหลลื่น ตอนไหนสะดุด และสะดุดนานกี่วินาที

หน้าต่าง Wireshark เปิดเมนู Statistics ค้างไว้ แสดงรายการเมนูย่อยได้แก่ Capture File Properties, Resolved Addresses, Protocol Hierarchy, Conversations, Endpoints, Packet Lengths โดยรายการ I/O Graphs ถูกไฮไลต์เป็นแถบสีน้ำเงินและมีกรอบแดงล้อม มีลูกศรแดงสองอันชี้จากคำว่า Statistics บนแถบเมนูมายังรายการ I/O Graphs
รูปที่ 16 จากใบแลป Lab 5 — การใช้งาน Filter เพื่อกรองหาสิ่งที่เราต้องการ (เส้นทางเมนูคือ Statistics → I/O Graphs — บน macOS อยู่ที่เดียวกันเป๊ะ เพราะ Wireshark ใช้เมนูของตัวเองไม่ใช่เมนู Mac)
  1. เปิดกราฟ — เมนู Statistics → I/O Graphs
  2. ตั้งแกน X ให้ละเอียดพอ — ช่อง Interval ตั้งเป็น 100 ms หรือ 1 sec · ถ้าปล่อยไว้หยาบเกินจะมองไม่เห็นช่วงที่หายไป 30 วินาที
  3. เพิ่มเส้นของ FTP โดยเฉพาะ — กด + ที่มุมล่างซ้าย แล้วใส่ Display filter ftp-data ตั้ง Y Axis เป็น Bytes หรือ Bits
  4. เพิ่มเส้นของ BPDU — กด + อีกเส้น ใส่ filter stp ตั้ง Y Axis เป็น Packets · เส้นนี้จะราบเรียบตอนปกติ แต่พุ่งขึ้นตอนโทโพโลยีเปลี่ยน (ตอนดึงสาย)
  5. บันทึกภาพส่งอาจารย์ — ปุ่ม Save As… ในหน้าต่างกราฟ หรือ ⌘+⇧+4 แล้วลากครอบ (สกรีนช็อตของ macOS)
ส่วนขยาย — ตั้ง Wireshark ให้จับได้จริงในแลปนี้

สวิตช์ส่งเฟรมเฉพาะไปพอร์ตปลายทาง เสียบเครื่องเข้าพอร์ตว่างแล้วจะไม่เห็นทราฟฟิกของคนอื่นเลย · ใบแลปจึงกำกับไว้ว่า "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 ต่ำสุด

พอร์ตที่เหลือจาก Root Port และ Designated Port = Block Port ประโยคปิดท้ายของใบแลป — ไม่มีขั้นที่ 4 ที่ไปเลือก block port ตรง ๆ · มันคือ "เศษ" ที่เหลือจากขั้น ② และ ③
Bridge ID = Priority (2 ไบต์) + MAC Address (6 ไบต์) รวม 8 ไบต์ · เทียบกันจากซ้ายไปขวา — Priority มาก่อนเสมอ ถ้า Priority ต่างกัน MAC ไม่ถูกดูเลย

กดดูภาพข้างล่างเพื่อเห็นกติกาทั้งสามข้อทำงานจริงบนสามเหลี่ยมของแลปนี้ และเห็นว่าพอสั่ง priority 4096 แล้วพอร์ตที่ถูกบล็อกย้ายที่ไปเลย

จุดที่คนพลาดบ่อย — Priority บน Cisco ไม่ใช่ 32768 เปล่า ๆ

Cisco ใช้ PVST+ คือรัน STP แยกต้นละ VLAN จึงต้องยัดเลข VLAN ลงไปในฟิลด์ Priority ด้วย เรียกว่า sys-id-ext — ผลคือเลขที่โผล่ในหน้าจอไม่ตรงกับที่เราพิมพ์:

สิ่งที่พิมพ์VLANสิ่งที่ show spanning-tree แสดง
(ไม่พิมพ์อะไร = ค่าปริยาย 32768)132769  = 32768 + 1
(ไม่พิมพ์อะไร = ค่าปริยาย 32768)932777  = 32768 + 9
spanning-tree vlan 9 priority 409694105  = 4096 + 9
spanning-tree vlan 1 priority 409614097  = 4096 + 1

เห็น 32777 แล้วอย่าตกใจว่าตั้งผิด — บรรทัดในวงเล็บ (priority 32768 sys-id-ext 9) บอกที่มาไว้ให้แล้ว · และเพราะทุกตัวบวก 9 เท่ากันหมด การเปรียบเทียบจึงไม่เปลี่ยน ใครพิมพ์ priority ต่ำกว่าก็ยังชนะอยู่ดี

ออกสอบยังไง — ทฤษฎีก้อนนี้อยู่ในบทที่ 15

โจทย์ข้อเขียนจะให้ผังสวิตช์ + 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 ปลายทางของ BPDU01: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 BPDU35 ไบต์ (2+1+1+1+8+4+8+2+2+2+2+2)
รายละเอียดทุกฟิลด์อยู่ในแท็บ Lecture แล้ว — ไม่ต้องท่องซ้ำสองที่

บทที่ 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#] — ผลเต็ม ๆ ที่ควรเห็น (สวิตช์ที่ไม่ใช่ 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 — บทบาท (ใครเป็นอะไร)

RootRoot Port — ทางไปหา root · มีได้ตัวละ 1 พอร์ต
DesgDesignated Port — พอร์ตที่คุม segment นั้น · ทุกพอร์ตของ root bridge เป็นแบบนี้หมด
AltnAlternate — พอร์ตสำรองที่ถูกบล็อกไว้ เพราะมีทางไป root ที่ดีกว่าอยู่แล้ว
BackBackup — สำรองของ segment เดียวกัน (เจอเฉพาะตอนต่อสองเส้นเข้าฮับ/สวิตช์ตัวเดียวกัน)

คอลัมน์ Sts — สถานะ (ตอนนี้ทำอะไรอยู่)

BLKBlocking — รับแต่ BPDU · ทิ้งข้อมูลทั้งหมด · ไม่เรียน MAC
LISListening — 15 วิ · ฟัง BPDU จัดโครงสร้าง · ยังไม่เรียน MAC
LRNLearning — 15 วิ · เริ่มเรียน MAC แล้ว แต่ยังไม่ส่งต่อ
FWDForwarding — ส่งข้อมูลได้เต็มที่
จุดที่คนพลาดบ่อย — Role กับ Sts ไม่ใช่เรื่องเดียวกัน

Role คือ "ตำแหน่งงาน" · Sts คือ "ตอนนี้ทำอะไรอยู่" — พอร์ตที่ Role เป็น Root หรือ Desg ก็ยังไต่ผ่าน LIS และ LRN อยู่ 30 วินาทีก่อนจะเป็น FWD ได้ · ตอนเพิ่งเสียบสายแล้วรีบพิมพ์ show spanning-tree คุณจะเห็น Desg LIS หรือ Root LRN ซึ่งปกติมาก ไม่ได้พัง — รอให้ครบ แล้วพิมพ์ซ้ำ

ส่วนขยาย — คำสั่ง show อีกสามตัวที่ประหยัดเวลามาก
[SW#] — ใบแลปให้แค่ show spanning-tree เฉย ๆ สามตัวนี้เป็นส่วนขยาย
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

[SW1#] — Listing 1: กำหนดชื่อและ ID ของ 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)#exit
[SW1#] — Listing 2: การติดตั้ง VLAN (เอาพอร์ตเข้า VLAN)
SW1(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#] — Listing 3
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:

ผังเครือข่ายสองฝั่ง ฝั่งซ้ายพื้นสีส้มเขียนว่า VLAN 10 Subnet 10 มีคอมพิวเตอร์ชื่อ Dino และ Fred ต่อเข้าสวิตช์ตัวหนึ่ง · ฝั่งขวาพื้นสีเทาน้ำเงินเขียนว่า VLAN 20 Subnet 20 มีคอมพิวเตอร์ชื่อ Wilma และ Betty ต่อเข้าสวิตช์ชื่อ SW1 · สวิตช์ฝั่งซ้ายลากสายลงมาเข้าพอร์ต F0/0 ของเราเตอร์ R1 ที่อยู่ด้านล่างกลาง และสวิตช์ฝั่งขวาลากสายลงมาเข้าพอร์ต F0/1 ของ R1 ตัวเดียวกัน · มีลูกศรเส้นประพร้อมไอคอน IP แสดงทิศทางแพ็กเก็ตวิ่งจากฝั่งซ้ายลงไปที่ R1 แล้วขึ้นไปฝั่งขวา
รูปที่ 12 จากใบแลป Lab 5 — VLAN Routing (จุดที่ต้องสังเกต: VLAN 10 กับ VLAN 20 อยู่คนละ subnet และคุยกันเองตรง ๆ ไม่ได้ แม้จะเสียบอยู่ในตึกเดียวกัน — ต้องวิ่งลงไปที่ R1 แล้วเด้งกลับขึ้นมาอีกฝั่ง โดย R1 ใช้พอร์ตแยกกันคนละ VLAN คือ F0/0 และ F0/1 · แต่ในแลปนี้เราไม่ต้องใช้ router เลย เพราะใบแลปกำหนดให้ทุกสวิตช์อยู่บน VLAN 9 เดียวกันหมด → STP เป็นเรื่องเลเยอร์ 2 ล้วน ๆ · วิธีทำ inter-VLAN routing แบบเต็ม ๆ อยู่ที่ Lab 4)

Listing 4–6 — ติดตั้ง STP · ตั้ง Priority · ตรวจสอบ

[SW#] — Listing 4: การติดตั้ง Spanning Tree (ทำที่ทุกตัว)
SW1#configure terminal
SW1(config)#spanning-tree vlan 9
# ถ้าโจทย์ไม่ได้ระบุ VLAN ให้ใช้ VLAN 1 ซึ่งเป็น VLAN ปริยาย:
#   SW1(config)#spanning-tree vlan 1
[SW2#] — Listing 5: การกำหนดค่า Priority (ใบแลปข้อ 4.2.3 ให้ทำที่ตัวที่ไม่ได้เป็น root)
SW2#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       # คืนค่าเดิม 32768
[SW#] — Listing 6: การตรวจสอบ Spanning Tree
SW1#show spanning-tree            # ทุก VLAN ที่มีอยู่บนเครื่อง
SW1#show spanning-tree vlan 9     # เจาะเฉพาะ VLAN 9 ของแลปนี้ — อ่านง่ายกว่ามาก
SW1#show spanning-tree vlan 1     # กรณีโจทย์ใช้ VLAN ปริยาย
จุดที่คนพลาดบ่อย — ใบแลปพิมพ์ spanning-tree เกินตัว n ไปหนึ่งตัว

Listing 5 ในใบแลปเขียนว่า spannning-tree (n สามตัว) — พิมพ์ตามเป๊ะ ๆ จะได้ % 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# — ตัวที่เป็น Root Bridge] — Listing 7: Mirror Command
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/2
[SW1#] — Listing 8: ตรวจสอบ Mirror
SW1#show monitor session 1
# Session 1
# ---------
# Type              : Local Session
# Source Ports      :
#     Both          : Et0/0, Et0/1
# Destination Ports : Et0/2
ส่วนขยาย — ใน GNS3 ไม่ต้อง mirror เลย มีวิธีที่ง่ายกว่ามาก

คลิกขวาที่เส้นสายในผัง → 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

ผังการเชื่อมต่อ มีสวิตช์สามตัวต่อกันเป็นรูปสามเหลี่ยมด้วยสายสีส้ม สวิตช์ตัวบนกลางมีสายต่อไปยังคอมพิวเตอร์ที่เขียนกำกับว่า Wireshark ทางขวาบน · สวิตช์ตัวล่างซ้ายมีสายต่อไปยังคอมพิวเตอร์ที่เขียนว่า FTP Client ทางซ้ายสุด · สวิตช์ตัวล่างขวามีสายต่อไปยังคอมพิวเตอร์ที่เขียนว่า FTP Server ทางขวาสุด
รูปที่ 13 จากใบแลป Lab 5 — การเชื่อมต่อเพื่อทดสอบ STP (จุดที่ต้องสังเกตสามจุด: ① สวิตช์สามตัวต่อกันครบทุกคู่เป็นสามเหลี่ยม — นี่คือลูปที่ตั้งใจสร้างขึ้นมาให้ STP แก้ ② FTP Client กับ FTP Server อยู่คนละสวิตช์ ทราฟฟิกจึงต้องเดินทางผ่านโครงข่าย ทำให้เห็นผลตอนดึงสาย ③ เครื่อง Wireshark เสียบอยู่ที่สวิตช์ตัวบน ซึ่งใบแลปหมายเหตุไว้ว่าควรเป็นตัวที่เป็น Root Bridge)

ผังการต่อสาย — แทนชื่อพอร์ตให้แล้ว

สายปลาย Aปลาย Bหมายเหตุ
สายวงสามเหลี่ยม 1SW1 Et0/0SW2 Et0/0สามเส้นนี้คือลูป · เสียบให้ครบก่อนแล้วค่อยดูว่า STP บล็อกเส้นไหน
สายวงสามเหลี่ยม 2SW1 Et0/1SW3 Et0/0
สายวงสามเหลี่ยม 3SW2 Et0/1SW3 Et0/1
เครื่อง WiresharkSW1 Et0/2MacBook / PC (192.3.128.3)เสียบที่ตัวที่เป็น Root Bridge
FTP ClientSW2 Et0/2MacBook (192.3.128.2)เครื่องที่สั่ง get
FTP ServerSW3 Et0/2เครื่อง server (192.3.128.10)เครื่องที่รัน pyftpdlib + iperf3 -s

ซ้อมที่บ้านด้วย GNS3 2.2.53 บน Mac

จุดที่คนพลาดบ่อย — "Ethernet switch" ที่ติดมากับ GNS3 ทำ STP ไม่ได้

ถ้าลาก 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
  1. เปิด GNS3 2.2.53 สร้างโปรเจกต์ใหม่ชื่อ lab5-stp — ถ้าใช้ server ของ KKU ต้องต่อ VPN KKU ก่อนเปิด GNS3 ไม่งั้นจะขึ้น server error → วิธีตั้งค่า
  2. ลากสวิตช์ 3 ตัว ลงมาวางเป็นสามเหลี่ยม เปลี่ยนชื่อเป็น SW1 (บน) SW2 (ล่างซ้าย) SW3 (ล่างขวา)
  3. ลากสายให้ครบทั้ง 3 เส้น ตามตารางด้านบน — อย่าเพิ่งกด Start จนกว่าจะต่อครบ
  4. เพิ่ม 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 ไม่หยุด · ใช้ดูตอนดึงสายว่าขาดไปกี่วินาที
  5. กด Start ทั้งหมด แล้วรอ 30–50 วินาที ให้ STP บรรจบก่อนค่อยเริ่มดู — กดเร็วเกินจะเห็นแต่ LIS / LRN แล้วเข้าใจผิดว่าพัง
  6. เข้า console ทุกตัว — คลิกขวาที่อุปกรณ์ → Console · อันนี้เปิดในเทอร์มินัลของ GNS3 เอง ไม่ต้องใช้ screen เพราะไม่ได้ต่อสาย USB จริง · screen /dev/tty.usbmodemXXXX 9600 ใช้เฉพาะตอนทำกับสวิตช์เครื่องจริงในห้อง → Lab 2 §2.4
  7. คลิกขวาที่สายเส้นที่สนใจ → 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 จะไม่มีไฟให้ดู

GNS3 ไม่ได้จำลอง LED ของตัวเครื่อง — จุดสีที่หน้าชื่ออุปกรณ์บอกแค่ว่าเปิด/ปิด (เขียว = ทำงาน · แดง = หยุด) ไม่ได้บอกสถานะ STP · ให้ใช้ show spanning-tree vlan 9 แทน แล้วดูคอลัมน์ Sts ซึ่งให้ข้อมูลละเอียดกว่าไฟจริงเสียอีก (แยก LIS กับ LRN ออกจากกันได้ ในขณะที่ไฟจริงส้มเหมือนกันหมด)

4.2กำหนด Priority ให้กับสวิตช์

  1. ตรวจสอบหรือติดตั้ง Spanning Tree (ข้อ 4.2.1)
    [SW1#] [SW2#] [SW3#] — ทำที่ทั้งสามตัว
    SW1#configure terminal
    SW1(config)#spanning-tree vlan 9
    SW1(config)#end
  2. ตรวจสอบว่าเครื่องใดเป็น root และพอร์ตมีสถานะอะไรบ้าง (ข้อ 4.2.2) — แล้ววาดรูปการเชื่อมต่อพร้อมระบุสถานะของพอร์ตให้ชัดเจน
    [SW1#] [SW2#] [SW3#] — เก็บผลทั้งสามตัวไว้ นี่คือ "ก่อน" ของข้อ 5
    SW1#show spanning-tree vlan 9
    SW1#show spanning-tree root       # ส่วนขยาย — สรุปแถวเดียว หา root ได้เร็วสุด
    สวิตช์พอร์ตต่อไปหาRole / Sts ที่ควรเห็น
    SW1
    root
    Et0/0SW2Desg FWD — ทุกพอร์ตของ root เป็น Designated เสมอ
    Et0/1SW3Desg FWD
    SW2Et0/0SW1Root FWD — ทางตรงไป root cost 100
    Et0/1SW3Desg FWD — ชนะเพราะ BID ต่ำกว่า SW3
    SW3Et0/0SW1Root FWD
    Et0/1SW2Altn BLK — พอร์ตที่ถูกบล็อก

    ตารางนี้คือผลที่ควรได้ถ้า MAC ของ SW1 ต่ำสุด — ของจริงในห้องอาจได้ตัวอื่นเป็น root เพราะ MAC ของเครื่องจริงไม่ได้เรียงสวยแบบนี้ · ให้ดูจากหน้าจอจริงเสมอ อย่าลอกตาราง วิธีอ่านอยู่ที่ §5.8

  3. ปรับค่า 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. สังเกตการเปลี่ยนแปลงสถานะของพอร์ต แล้ววาดรูปอีกครั้ง (ข้อ 4.2.4)
    สวิตช์พอร์ตก่อนตั้ง priorityหลังตั้ง priority 4096 ที่ SW2
    SW1Et0/0 → SW2Desg FWDRoot FWD เปลี่ยน
    Et0/1 → SW3Desg FWDDesg FWD
    SW2
    root ตัวใหม่
    Et0/0 → SW1Root FWDDesg FWD เปลี่ยน
    Et0/1 → SW3Desg FWDDesg FWD
    SW3Et0/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

[macOS Terminal] — เทียบบรรทัดต่อบรรทัดกับที่ใบแลปเขียนไว้สำหรับ Windows
# ใบแลปเขียน:  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> bye
จุดที่คนพลาดบ่อย — ใบแลปเขียน ftp 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

  1. ตั้ง port mirroring ที่ตัวที่เป็น Root Bridge ก่อน แล้วเสียบเครื่อง Wireshark ที่พอร์ต destination → Listing 7 ใน §5.9
  2. เปิด Wireshark กด Start capture ที่ interface ของการ์ด USB-C Ethernet · ใส่ display filter ftp-data
  3. เปิด Statistics → I/O Graphs ทิ้งไว้ ตั้ง Interval = 100 ms
  4. สั่ง get test50m.bin แล้วดูกราฟพุ่งขึ้นเป็นแท่งสูงราบยาว — นั่นคือลิงก์เต็มความเร็ว
  5. บันทึกเวลาที่ใช้ — เมื่อเสร็จ 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#] — พิมพ์ซ้ำทุก ~10 วินาทีหลังดึงสาย จะเห็น Sts ไต่ขึ้นทีละขั้น
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 — ทราฟฟิกกลับมา)
Blocking 20 + Listening 15 + Learning 15 = 50 วินาที กรณีสายขาดตรงหน้าเรา (direct failure) พอร์ตข้าม Blocking ได้เลย → เหลือ 15 + 15 = 30 วินาที · แต่ถ้าสายขาดที่ปลายไกลจนต้องรอ BPDU หมดอายุก่อน (indirect failure) → เต็ม 50 วินาที
ส่วนขยาย — spanning-tree portfast ตัด 30 วินาทีนี้ทิ้ง (เฉพาะพอร์ตที่ต่อ PC)
[SW#] — ใส่เฉพาะพอร์ตที่ต่อ PC / FTP Server เท่านั้น
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 default

portfast ทำให้พอร์ตกระโดดจาก Blocking ไป Forwarding ทันที ข้าม Listening และ Learning — เพราะพอร์ตที่ต่อ PC ตัวเดียวสร้างลูปไม่ได้อยู่แล้ว · อาการที่แก้ได้จริง: เสียบสายแล้ว PC ขอ DHCP ไม่ทันเพราะพอร์ตยังไม่ forward · ห้ามใส่ที่พอร์ตระหว่างสวิตช์เด็ดขาด — จะเกิดลูปชั่วคราวตามที่ IOS เตือนไว้ · ในผล show spanning-tree พอร์ตที่ตั้ง portfast จะขึ้น Type ว่า P2p Edge

4.5โอนข้อมูลโดยยกเลิก Spanning Tree ระวังเครื่องค้าง

อ่านให้จบก่อนลงมือ — ลำดับนี้ห้ามสลับ

ถ้าปิด STP ทั้งที่สายสามเหลี่ยมยังเสียบครบ เครือข่ายจะล่มทันทีภายในไม่กี่วินาที และคุณจะพิมพ์คำสั่งเข้าไปแก้ไม่ได้อีกเลย เพราะ CPU ของสวิตช์เต็ม · ใบแลปจึงบังคับให้ถอดสายออกให้หมดก่อน แล้วค่อยปิด STP แล้วค่อยเสียบสายกลับ พร้อมกับเริ่มโอนไฟล์

  1. แยกเน็ตเวิร์คออกจากกันให้หมด — ดึงสายแลนที่เชื่อมระหว่างสวิตช์ออกทั้ง 3 เส้น (ใน GNS3 = คลิกขวาที่สาย → Delete หรือ Suspend)
  2. เปิด Wireshark เพื่อรอตรวจจับ BPDU — ใส่ display filter stp แล้วกด Start · ตอนนี้จะเห็น BPDU ไหลมาทุก 2 วินาที เก็บภาพไว้ตอบคำถามท้ายการทดลอง → §5.15
  3. ยกเลิก 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. เสียบสายกลับเข้าเหมือนเดิม — ใบแลปกำกับว่า "ขั้นตอนที่ 4–5 ทำพร้อมกัน"
  5. โอนไฟล์ ≥ 30 MB ด้วย FTP อีกครั้ง พร้อมเปิด I/O Graph ค้างไว้
  6. บันทึกเวลาและผลลัพธ์ที่ได้จากกราฟ
สิ่งที่จะเห็นข้อ 4.3 (มี STP)ข้อ 4.5 (ไม่มี STP + มีลูป)
I/O Graphแท่งสูงราบสม่ำเสมอ แล้วจบลงตอนไฟล์หมดพุ่งชนเพดานแล้วค้างอยู่อย่างนั้น ไม่ลงเลย แม้ไฟล์ยังโอนไม่เสร็จ
เวลาโอนไฟล์ไม่กี่วินาทีถึงหลักสิบวินาทีค้าง / ช้ามาก / หลุดกลางคัน
filter arpเห็นไม่กี่แถวเห็นแพ็กเก็ตเดิมซ้ำเป็นพัน ๆ แถวรัว ๆ = หลักฐานของ broadcast storm
filter stpBPDU ไหลสม่ำเสมอทุก 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

  1. เปิด terminal แล้วเข้าไปยัง directory ที่มีโปรแกรม iperf3 — ขั้นตอนนี้ข้ามได้บน Mac เพราะ brew ติดตั้งไว้ใน PATH แล้ว → §5.3
  2. ฝั่ง Server — iperf3 -s (ใบแลปเขียน ./iperf3 -s ซึ่งเป็นรูปแบบของ Windows ที่แตกไฟล์ zip มา)
  3. ฝั่ง Client — iperf3 -c 192.3.128.10 (ใบแลปสะกด ipref3 ผิด)
  4. บันทึกผลจากทั้งเครื่อง Server และ Client — สองฝั่งรายงานตัวเลขคนละบรรทัด (sender กับ receiver) ให้จดทั้งคู่
  5. ทำขั้นที่ 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.exebrew 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 addressSystem Settings → Network → คลิกการ์ด USB-C Ethernet → Details… → TCP/IP → Configure IPv4 = Manually → 192.3.128.2 / 255.255.255.0
ปิด FirewallWindows Defender Firewall → Turn offSystem 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 21succeeded! = 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 — หน้าตาของตัวที่เป็น root (สังเกตความต่างจาก SW3 ใน §5.8)
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-environmentPython 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: ftpmacOS 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 existsSTP ถูกปิด (จากข้อ 4.5) หรือยังไม่ได้สร้าง VLAN 9spanning-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 พิมพ์ไม่ได้หลังปิด STPBroadcast storm — CPU สวิตช์เต็มถอดสายระหว่างสวิตช์ออกหนึ่งเส้นทันที ให้ไม่เป็นวง แล้วค่อยเปิด STP กลับ → §5.11 ข้อ 4.5
Wireshark ไม่เห็นทราฟฟิก FTP ของคนอื่นยังไม่ได้ตั้ง port mirroringmonitor 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 BLKping ผ่าน · โอนไฟล์เต็มความเร็ว · 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 IDBroadcast storm — ทุกพอร์ตกะพริบรัว · CPU เต็ม · console แทบพิมพ์ไม่ได้ · I/O Graph พุ่งชนเพดานค้าง · โอนไฟล์ไม่จบ · MACFLAP_NOTIF วิ่งรัว
ประโยคสรุปที่ควรมีในหัวข้ออภิปราย

"ผลการทดลองแสดงว่า STP ไม่ได้เพิ่มความเร็ว แต่เป็นตัวที่ทำให้เครือข่ายที่มีสายสำรองใช้งานได้เลย — เมื่อเปิด STP ด้วยค่าปริยาย ระบบเลือก root จาก MAC ที่ต่ำสุดโดยอัตโนมัติซึ่งผู้ดูแลควบคุมไม่ได้ การกำหนด priority จึงมีไว้เพื่อบังคับให้สวิตช์ที่เราต้องการเป็น root (ปกติเลือกตัวที่อยู่ตรงกลางหรือแรงที่สุด เพื่อให้เส้นทางของทุกคนสั้นที่สุดและเพื่อวาง Wireshark ได้ตรงจุด) · ส่วนการยกเลิก STP พิสูจน์ว่าลูปเลเยอร์ 2 ไม่มีกลไกป้องกันตัวเองใด ๆ เลย เพราะเฟรมไม่มี TTL — เครือข่ายจึงล่มภายในไม่กี่วินาที และกู้คืนได้ทางเดียวคือถอดสายให้ไม่เป็นวง"

6. คำถามท้ายการทดลอง

"จากการทดลองตรวจจับค่า BPDU (STP) จาก Wireshark ให้แสดงค่าที่ตรวจจับ และแสดงค่าที่เกี่ยวข้องกับ STP ว่ามีอะไรบ้าง"

แนวคำตอบ — วิธีดักจับ และตารางค่าที่ต้องแสดง

ขั้นตอนดักจับ

  1. เปิด Wireshark ที่ interface ของการ์ด USB-C Ethernet (ใน GNS3: คลิกขวาที่สายระหว่างสวิตช์ → Start capture)
  2. ใส่ display filter stp แล้วกด Enter — ไม่ต้องตั้ง port mirroring เพราะสวิตช์ส่ง BPDU ออกทุกพอร์ตอยู่แล้ว
  3. รอ 5–10 วินาที จะเห็นแถวโผล่มาเรื่อย ๆ ทุก 2 วินาที · คลิกแถวหนึ่ง แล้วกางกิ่ง Spanning Tree Protocol ในหน้าต่างกลาง
  4. สกรีนช็อตทั้งรายการแพ็กเก็ตและกิ่งที่กางออก แล้วกรอกลงตารางข้างล่าง

ค่าที่เห็นในกิ่ง Spanning Tree Protocol — และแปลว่าอะไร

ฟิลด์ที่ Wireshark แสดงค่าตัวอย่างความหมาย
Destination (ชั้น Ethernet)01:80:c2:00:00:00MAC multicast ที่สงวนไว้สำหรับ BPDU โดยเฉพาะ — ไม่ใช่ broadcast
LLC · DSAP / SSAP0x42บอกว่าเฟรมนี้เป็น Spanning Tree BPDU · BPDU ห่อด้วย 802.3 + LLC ไม่ใช่ Ethernet II
Protocol Identifier0x0000อัลกอริทึม spanning tree ตาม 802.1 — ศูนย์ทั้งหมด (2 ไบต์)
Protocol Version Identifier0 (Spanning Tree)0 = STP ดั้งเดิม (802.1D) · ถ้าเป็น 2 คือ RSTP (1 ไบต์)
BPDU Type0x00 Configurationศูนย์ = Configuration BPDU · 0x80 = TC-BPDU (1 ไบต์)
BPDU flags0x00บิต 7 = Topology Change · บิต 0 = Topology Change Ack · ที่เหลือไม่ได้ใช้ (1 ไบต์)
Root Identifier32777 / 9 / aabb.cc00.0100root bridge คือใคร — priority 2 ไบต์ + MAC 6 ไบต์ · Wireshark แยก sys-id-ext (9) ให้ด้วย
Root Path Cost100ต้นทุนจากผู้ส่ง BPDU ใบนี้ไปถึง root (4 ไบต์) · ตัว root เองส่งออกมาเป็น 0
Bridge Identifier32777 / 9 / aabb.cc00.0300ใครเป็นคนส่ง BPDU ใบนี้ — priority + MAC ของผู้ส่ง (8 ไบต์)
Port identifier0x8002พอร์ตที่ส่งออกมา = port priority 0x80 (128) + หมายเลขพอร์ต (2 ไบต์)
Message Age1 sec (หรือ 0)อายุของ configuration message นับจากที่ root สร้าง — 0 ถ้ามาจาก root ตรง ๆ และเพิ่มขึ้นทุก hop
Max Age20 secเกินนี้ให้ทิ้ง BPDU และถือว่าเส้นทางตาย
Hello Time2 secช่วงเวลาที่ root ส่ง configuration message
Forward Delay15 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) — แต่แลปนี้ยังต้องอ่านด้วยสามเหตุผล:

  1. ทฤษฎี STP = บทที่ 15 ซึ่งออกข้อเขียนแน่ โจทย์ให้ผังกับ Bridge ID มาแล้วสั่งหา root / root port / designated port / blocked port — แลปนี้คือการเห็นของจริงที่ทำให้ทฤษฎีนั้นจำง่ายขึ้นมาก
  2. คำสั่ง VLAN ใน Listing 1–3 คือข้อ 3 ของข้อสอบแลป (10 คะแนน) — vlan, name, switchport mode access, switchport access vlan, show vlan
  3. Wireshark filter ในแลปนี้คือข้อ 2 (10 คะแนน) — โจทย์สั่ง filter จาก source address ของ ping และ filter icmp กับ arp

เช็กลิสต์สำหรับห้องสอบ — ทำตามลำดับนี้

  1. เตรียมล่วงหน้าที่บ้าน (ห้ามรอไปทำในห้อง) — pip3 install pyftpdlib · brew install iperf3 inetutils · Wireshark Arm + ChmodBPF · mkfile 50m test50m.bin
  2. วาดผังลงกระดาษก่อนแตะอุปกรณ์ — สวิตช์ 3 ตัว สายสามเส้น IP ทุกเครื่องในวง 192.3.128.0/24 · VLAN 9
  3. สร้าง VLAN ให้ครบทุกตัวก่อน แล้วเอาพอร์ตเข้า VLAN → ยืนยันด้วย show vlan brief ก่อนเสียบสายวง
  4. เสียบสายให้ครบสามเส้น แล้วรอ 50 วินาที — อย่ารีบพิมพ์ show
  5. หา root ให้เจอ — show spanning-tree vlan 9 ทั้งสามตัว · ตัวที่ขึ้น This bridge is the root คือคำตอบ
  6. จดตารางพอร์ตทั้งหมด — สวิตช์ / พอร์ต / ต่อไปหาใคร / Role / Sts · วาดรูปพร้อมระบายสีพอร์ตที่ BLK
  7. บังคับ root ด้วย priority — spanning-tree vlan 9 priority 4096 ที่ตัวที่ยังไม่ใช่ root · ค่าต้องเป็นพหุคูณของ 4096 · รอ 30 วินาที แล้วจดตารางใหม่
  8. ตั้ง port mirroring ที่ root ก่อนเปิด Wireshark ดักทราฟฟิก FTP → Listing 7–8
  9. เก็บผลส่ง — show spanning-tree vlan 9 ทั้งสามช่วง (ปริยาย / หลังตั้ง priority / หลังปิด STP) · show vlan ของทุกสวิตช์ · สกรีนช็อต I/O Graph ทั้งสามรอบ · สกรีนช็อต BPDU ที่กางกิ่งแล้ว · ผล iperf3 10 รอบ + ค่าเฉลี่ย
  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 ถึงจะส่งข้อมูลได้
ทันที เพราะสายเส้นนั้นเสียบอยู่แล้วและลิงก์ก็ขึ้นอยู่แล้ว
ประมาณ 2 วินาที เท่ากับ hello time ที่ root ส่ง BPDU ออกมา
ประมาณ 30 วินาที — Listening 15 + Learning 15 (ข้าม Blocking ได้เพราะสายขาดตรงพอร์ตตัวเอง)
ประมาณ 300 วินาที เท่ากับ aging time ของตาราง MAC
พอร์ตที่ถูกบล็อกกระโดดไป Forwarding ทันทีไม่ได้ ต้องไต่ Listening (forward delay 15 วินาที) → Learning (อีก 15 วินาที) → Forwarding เพื่อกันลูปชั่วคราวระหว่างที่สวิตช์ตัวอื่นยังคำนวณไม่เสร็จ · ในกรณีนี้สายขาดที่พอร์ตของ SW3 เอง (direct failure) SW3 จึงรู้ทันทีและไม่ต้องรอ max age 20 วินาที → รวม 30 วินาที · แต่ถ้าเหตุเกิดไกลออกไป จนลิงก์ฝั่ง SW3 ยังขึ้นอยู่ (indirect failure) จะต้องรอ BPDU ขาดครบ 20 วินาทีก่อน → รวม 20+15+15 = 50 วินาที · ส่วน 300 วินาที คือ aging time ของตาราง MAC ไม่เกี่ยวกับสถานะพอร์ต
คุณสั่ง spanning-tree vlan 9 priority 4096 ที่ SW2 แล้วพิมพ์ show spanning-tree vlan 9 ปรากฏว่าบรรทัด Bridge ID ขึ้นว่า Priority 4105 ไม่ใช่ 4096 — เกิดอะไรขึ้น
พิมพ์ผิด ต้องเข้าไปแก้เป็น priority 4105 ให้ตรงกัน
ปกติ — Cisco เอาเลข VLAN (sys-id-ext = 9) มาบวกกับ priority ที่ตั้งไว้ 4096 + 9 = 4105
สวิตช์ปัดค่าขึ้นให้เป็นพหุคูณของ 4096 ที่ใกล้ที่สุด
มีสวิตช์ตัวอื่นในวงตั้ง priority ชนกัน IOS จึงเลื่อนค่าให้อัตโนมัติ
Cisco ใช้ PVST+ คือรัน STP แยกต้นละ VLAN จึงต้องยัดเลข VLAN ลงในฟิลด์ priority เรียกว่า sys-id-ext — ผลคือเลขที่แสดงจะเป็น priority ที่ตั้ง + เลข VLAN เสมอ · ค่าปริยาย 32768 บน VLAN 9 จึงแสดงเป็น 32777 และ 4096 แสดงเป็น 4105 · สังเกตว่า IOS พิมพ์ที่มาไว้ให้แล้วในวงเล็บ (priority 4096 sys-id-ext 9) · และเพราะทุกตัวบวกเลข VLAN เดียวกันหมด การเปรียบเทียบ BID จึงไม่เปลี่ยน ใครตั้ง priority ต่ำกว่าก็ยังชนะอยู่ดี
ข้อ 4.5 สั่งให้ยกเลิก STP แล้วโอนไฟล์อีกครั้ง — ทำไมใบแลปถึงบังคับให้ดึงสายแลนระหว่างสวิตช์ออกให้หมดก่อน แล้วค่อยพิมพ์ no spanning-tree vlan 9
เพราะคำสั่ง no spanning-tree ใช้ไม่ได้ถ้ายังมีสายเสียบอยู่ IOS จะปฏิเสธ
เพราะต้องให้ตาราง MAC หมดอายุก่อน ไม่งั้นสวิตช์จะยังจำเส้นทางเดิม
เพราะ Wireshark จะจับ BPDU ไม่ได้ถ้าสายยังเสียบครบอยู่
เพราะถ้าปิด STP ทั้งที่สามเหลี่ยมยังครบ จะเกิด broadcast storm ทันทีจน CPU สวิตช์เต็มและพิมพ์คำสั่งเข้าไปแก้ไม่ได้อีก
STP คือสิ่งเดียวที่กันไม่ให้สามเหลี่ยมกลายเป็นลูป · พอสั่ง 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