← คู่มือ Mesh Networking — สื่อสารในที่ที่ไม่มีเสาสัญญาณ
LEVEL 0 · ปูพื้นจากศูนย์
แบบจำลองความคิด: ลิงก์คือความน่าจะเป็น
บทนี้สำคัญที่สุดในเล่ม ถ้าอ่านได้บทเดียวให้อ่านบทนี้ เพราะอีกสิบเอ็ดบทที่เหลือคือการไต่ประโยคเดียวที่จะเขียนอยู่ข้างล่างนี้
4.1 ประโยคแก่น
ลิงก์ในเมชไม่ใช่สาย แต่เป็นค่าประมาณที่เน่าตามเวลา
ในเครือข่ายมีสาย ลิงก์มีสองสถานะ: เสียบหรือไม่เสียบ ถามเมื่อไหร่ก็ได้คำตอบเดิม
ในเมช คำถามว่า "A ต่อกับ B ได้ไหม" ไม่มีคำตอบว่าใช่หรือไม่ใช่ มีแต่คำตอบว่า "เมื่อสิบวินาทีที่แล้ว ส่งไปร้อยครั้งถึงเก้าสิบสองครั้ง" ซึ่งเป็นคำตอบที่มีวันหมดอายุติดมาด้วย
สังเกตว่าประโยคนั้นมีสองส่วนที่ต่างกันคนละเรื่อง — ค่าประมาณ (ไม่ใช่ 0/1 แต่เป็นเปอร์เซ็นต์) และ เน่าตามเวลา (ยิ่งเก่ายิ่งเชื่อไม่ได้) ทุกกลไกที่จะเจอในเล่มนี้แก้อย่างใดอย่างหนึ่งในสองข้อนี้เสมอ
4.2 พิสูจน์ด้วยตาเอง — ทำไมสัญญาณแรงถึงหลอกได้
ทีนี้มาดูว่า "ค่าประมาณ" ต่างจาก "ความแรงสัญญาณ" ยังไง เพราะนี่คือกับดักแรกที่ทุกคนตกกัน
ค่าที่วิทยุรายงานว่าสัญญาณแรงแค่ไหนเรียกว่า RSSI มีหน่วยเป็น dBm ยิ่งใกล้ศูนย์ยิ่งแรง (−52 แรงกว่า −78) สัญชาตญาณบอกว่าเลือกเพื่อนบ้านที่ RSSI แรงที่สุดสิ ลองรันดูว่าเกิดอะไรขึ้น
import random
def measure(deliver_fwd, deliver_rev, probes=100, seed=1):
"""ยิง probe จริง 100 ครั้งแล้วนับที่ถึง — ไม่ได้คำนวณจากสูตร แต่สุ่มตามความน่าจะเป็นที่กำหนด"""
rnd = random.Random(seed)
got_fwd = sum(1 for _ in range(probes) if rnd.random() < deliver_fwd)
got_rev = sum(1 for _ in range(probes) if rnd.random() < deliver_rev)
df, dr = got_fwd/probes, got_rev/probes
etx = 1/(df*dr) if df and dr else float("inf")
return got_fwd, got_rev, etx
# ชื่อ RSSI อัตราถึงขาไป อัตราถึงขากลับ
links = [("A-B", -55, 0.98, 0.97),
("A-C", -52, 0.70, 0.65),
("A-D", -78, 0.92, 0.90)]
for name, rssi, f, r in links:
gf, gr, etx = measure(f, r)
print(f"{name} RSSI {rssi} ถึง {gf}/{gr} ETX {etx:.2f}")ผลรันจริง
A-B RSSI -55 ถึง 97/98 ETX 1.05
A-C RSSI -52 ถึง 67/71 ETX 2.10
A-D RSSI -78 ถึง 92/95 ETX 1.14สามลิงก์นั้นคือสถานการณ์แบบนี้ และผลที่ได้ขัดกับสัญชาตญาณเต็ม ๆ
| ลิงก์ | สภาพจริง | RSSI | ETX |
|---|---|---|---|
| A-B | ใกล้ ไม่มีอะไรบัง | −55 | 1.05 ดีที่สุด |
| A-C | สัญญาณแรงกว่า แต่มีคนใช้ย่านนี้เยอะ | −52 แรงที่สุด | 2.10 แย่ที่สุด |
| A-D | สัญญาณอ่อนกว่ามาก แต่ย่านว่าง | −78 | 1.14 |
ลิงก์ที่สัญญาณแรงที่สุด (−52 dBm) เป็นลิงก์ที่แย่ที่สุด ในสามเส้น ส่วนลิงก์ที่อ่อนกว่ามันถึง 26 dB กลับดีกว่าเกือบเท่าตัว
เพราะอะไร? เพราะ RSSI ตอบคำถามว่า "ได้ยินดังแค่ไหน" ไม่ใช่ "สื่อสารสำเร็จไหม" ในย่านที่มีคนใช้เยอะ คุณได้ยินเพื่อนดังมาก และก็ได้ยินคนอื่นดังมากพร้อมกันด้วย เสียงทับกันจนถอดรหัสไม่ออก — ดังไม่ได้แปลว่าชัด
4.3 ETX — ตัวเลขที่วัดสิ่งที่เราต้องการจริง ๆ
ค่าที่โผล่ในคอลัมน์สุดท้ายคือ ETX (expected transmission count) แปลตรงตัวว่า "คาดว่าต้องส่งกี่ครั้งกว่าจะสำเร็จหนึ่งครั้ง"
สูตรมันสั้นมาก และเหตุผลเบื้องหลังสวยกว่าตัวสูตร:
ETX = 1 / (อัตราถึงขาไป × อัตราถึงขากลับ)ทำไมต้องคูณสองทิศ? เพราะการส่งสำเร็จหนึ่งครั้งต้องการสองเหตุการณ์: ข้อมูลไปถึงปลายทาง และ ใบตอบรับกลับมาถึงต้นทาง ถ้าอย่างใดอย่างหนึ่งหาย ผู้ส่งจะไม่รู้ว่าสำเร็จ แล้วส่งซ้ำอยู่ดี
ค่า ETX เท่ากับ 1 คือลิงก์สมบูรณ์แบบ ส่งครั้งเดียวถึง · เท่ากับ 2 คือโดยเฉลี่ยต้องส่งสองครั้ง · ยิ่งมากยิ่งแย่ และข้อดีที่สุดของมันคือ บวกกันข้าม hop ได้อย่างมีความหมาย — เส้นทางสาม hop ที่ ETX 1.05 + 1.14 + 1.05 = 3.24 เทียบกับเส้นทางสอง hop ที่ 2.10 + 2.10 = 4.20 ได้ตรง ๆ แปลว่าเส้นทางที่ยาวกว่าแต่ลิงก์ดี ชนะเส้นทางที่สั้นกว่าแต่ลิงก์แย่
นี่คือคำตอบแรกของปริศนาที่ปลูกไว้ในบทที่ 1 ว่าทำไม "เส้นทางสั้นที่สุด" ถึงไม่ใช่คำตอบ
4.4 ครึ่งหลังของประโยค: ค่าที่เน่า
ทุกตัวเลขในตารางข้างบนมีสิ่งที่มองไม่เห็นติดมาด้วย — อายุ
ค่า ETX 1.05 นั้นคำนวณจาก probe ร้อยครั้งที่ยิงไปแล้ว แปลว่ามันบอกอดีต ไม่ได้บอกปัจจุบัน ถ้าระหว่างนั้นมีคนเดินไปยืนขวาง หรือมีใครเปิดวิทยุตัวใหม่ในย่านเดียวกัน ตัวเลขนั้นก็ผิดทันทีโดยไม่มีใครรู้
ตรงนี้คือแก่นของ trade-off ที่จะวนกลับมาทุกบทที่เหลือ:
- ยิง probe ถี่ขึ้น → ตัวเลขสดขึ้น → แต่กินอากาศที่ควรใช้ส่งข้อมูลจริง และเปลืองแบตของอุปกรณ์ที่ต้องอยู่ในสนามทั้งวัน
- ยิง probe ห่างขึ้น → ประหยัดขึ้น → แต่ตัดสินใจด้วยข้อมูลเก่า ส่งไปตามเส้นทางที่พังไปแล้ว
ไม่มีคำตอบที่ถูกต้อง มีแต่จุดที่เลือกไว้ และการเลือกจุดนั้นคือสิ่งที่แยกโปรโตคอลแต่ละตัวออกจากกัน — ซึ่งเป็นเรื่องของบทที่ 8
4.5 ปริศนาที่จะไขในบทหลัง
จากประโยคแก่นเดียวนี้ มีคำถามสามข้อที่ตอบไม่ได้ด้วยความรู้แค่บทนี้ จดไว้แล้วไปต่อ
- ถ้าค่าเน่าตลอด แล้วจะรู้ได้ยังไงว่าเพื่อนบ้านคนไหนยังอยู่ → บทที่ 5
- ถ้าเส้นทางเปลี่ยนทุกครั้งที่ค่าขยับนิดเดียว เครือข่ายจะไม่สั่นตลอดเวลาหรือ → บทที่ 9
- ถ้าทุก hop แย่งอากาศกันเอง การมีเส้นทางที่ดีจะช่วยอะไรได้จริงหรือ → บทที่ 10 และคำตอบเต็มอยู่ที่บทที่ 11 ซึ่งเป็นจุดพีคของเล่ม