← คู่มือ Mesh Networking — สื่อสารในที่ที่ไม่มีเสาสัญญาณ
LEVEL 1 · พื้นฐานที่ใช้ทุกวัน
เพื่อนบ้านคือใคร และรู้ได้ยังไงว่ายังอยู่
บทที่ 4 ทิ้งคำถามไว้ว่า ถ้าค่าทุกอย่างเน่าตลอด แล้วโหนดจะรู้ได้ยังไงว่าเพื่อนบ้านคนไหนยังอยู่ บทนี้ตอบข้อนั้น และคำตอบเรียบง่ายจนน่าประหลาดใจ
5.1 ไม่มีใครแจ้งลาออก
ในระบบที่มีสาย ถ้าคุณดึงสายออก อีกฝั่งรู้ทันทีว่าลิงก์ตาย เพราะไฟฟ้าที่เคยวิ่งอยู่หายไปในระดับฮาร์ดแวร์
ในเมชไม่มีสัญญาณแบบนั้น โหนดที่หายไปเพราะแบตหมด ตกเขา หรือเดินออกนอกระยะ ไม่มีโอกาสบอกลาใคร มันแค่เงียบไป และความเงียบกับ "ยังอยู่แต่ไม่มีอะไรจะพูด" หน้าตาเหมือนกันเป๊ะ
วิธีแก้จึงพลิกกลับด้าน: แทนที่จะรอฟังว่าใครตาย ให้ทุกคนประกาศว่าตัวเองยังอยู่เป็นจังหวะ ข้อความสั้น ๆ นี้เรียกว่า hello
5.2 hello, neighbor table และเส้นตายที่ต้องเลือกเอง
ทุกโหนดจดว่า "ได้ยิน hello จากใครล่าสุดเมื่อไหร่" ไว้ในตารางที่เรียกว่า neighbor table แล้วตั้งกติกาว่าถ้าเงียบเกินเส้นตายเมื่อไหร่ให้ถือว่าคนนั้นหายไป
NOW = 100.0 # เวลาปัจจุบัน (วินาทีนับจากเปิดเครื่อง)
HELLO_EVERY = 2.0 # ส่ง hello ทุกกี่วินาที
MISS_LIMIT = 3 # ขาดกี่ใบถือว่าเพื่อนบ้านหายไป
neighbors = {"B": 99.5, "C": 96.0, "D": 92.0} # ได้ยิน hello ล่าสุดเมื่อไหร่
deadline = HELLO_EVERY * MISS_LIMIT
for name, last in sorted(neighbors.items()):
age = NOW - last
print(f"{name}: ได้ยินล่าสุด {age:.1f} วิที่แล้ว -> {'ยังอยู่' if age <= deadline else 'ถือว่าหายไป'}")ผลรันจริง
B: ได้ยินล่าสุด 0.5 วิที่แล้ว -> ยังอยู่
C: ได้ยินล่าสุด 4.0 วิที่แล้ว -> ยังอยู่
D: ได้ยินล่าสุด 8.0 วิที่แล้ว -> ถือว่าหายไปสังเกตว่า C เงียบไปแล้วสองใบ แต่ยังไม่ถูกตัดออก เพราะเส้นตายตั้งไว้ที่สามใบ (2 × 3 = 6 วินาที) การเผื่อแบบนี้ไม่ใช่ความใจดี แต่เป็นการยอมรับว่า hello หายเองได้ — ในบทที่ 4 เราเพิ่งเห็นว่าลิงก์ที่ดีที่สุดยังส่งไม่ถึง 2–3% ถ้าตัดเพื่อนบ้านออกทันทีที่ขาดใบเดียว เครือข่ายจะสั่นตลอดเวลาโดยที่ไม่มีใครหายไปไหนจริง ๆ
5.3 ทำไม hello ถึงเป็นได้มากกว่าการเช็กชื่อ
hello ทำงานสองอย่างในใบเดียว และอย่างที่สองสำคัญกว่า
อย่างแรกคือบอกว่ายังอยู่ อย่างที่สองคือ มันคือ probe ที่ใช้คำนวณ ETX — ถ้าเพื่อนบ้านส่ง hello ทุก 2 วินาที แล้วในหนึ่งนาทีคุณควรได้ยิน 30 ใบ แต่ได้จริง 27 ใบ นั่นแปลว่าอัตราส่งถึงขาเข้าคือ 90% โดยไม่ต้องยิงอะไรเพิ่มเลย
ที่เหลือคืออัตราขาออก ซึ่งคุณวัดเองไม่ได้เพราะไม่รู้ว่าฝั่งโน้นได้ยินคุณกี่ใบ วิธีมาตรฐานคือ ให้แต่ละโหนดใส่ตัวเลขนี้ลงไปใน hello ของตัวเอง — hello ของ B จึงมีข้อความประมาณว่า "ฉันได้ยิน A 27 จาก 30 ใบ" พอ A ได้ยิน ก็ได้ตัวเลขขาออกของตัวเองมาเติมสมการ ETX ครบพอดี
💡 นี่คือลูกเล่นที่สวยที่สุดอันหนึ่งในสายนี้: ข้อมูลที่ใช้ตัดสินใจ ถูกผลิตขึ้นจากกลไกที่มีอยู่แล้ว โดยไม่ต้องจ่ายค่าอากาศเพิ่มแม้แต่ไบต์เดียว
5.4 ราคาของความสด
เส้นตายที่เลือกไว้ในโค้ดข้างบนกำหนดสองอย่างพร้อมกัน: ตรวจจับได้เร็วแค่ไหน และ ผิดพลาดบ่อยแค่ไหน
- hello ถี่ + เส้นตายสั้น → รู้ว่าใครหายภายในไม่กี่วินาที แต่โหนดที่แค่โดนบังชั่วคราวจะถูกตัดทิ้งบ่อย
- hello ห่าง + เส้นตายยาว → นิ่งกว่า แต่ยังส่งข้อมูลเข้าเส้นทางที่ตายไปแล้วอีกหลายสิบวินาที
ค่าที่ใช้กันจริงในโปรโตคอลสาย mesh อยู่ราว 1–3 วินาทีต่อ hello และเส้นตายที่ 3–6 เท่าของช่วงนั้น ตัวเลขที่แน่นอนขึ้นกับว่าโหนดขยับเร็วแค่ไหน — คนเดินกับโดรนบินไม่ควรใช้ค่าเดียวกัน