ข้ามไปยังเนื้อหา
Tayakorn

คู่มือ 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

สามลิงก์นั้นคือสถานการณ์แบบนี้ และผลที่ได้ขัดกับสัญชาตญาณเต็ม ๆ

ลิงก์สภาพจริงRSSIETX
A-Bใกล้ ไม่มีอะไรบัง−551.05 ดีที่สุด
A-Cสัญญาณแรงกว่า แต่มีคนใช้ย่านนี้เยอะ−52 แรงที่สุด2.10 แย่ที่สุด
A-Dสัญญาณอ่อนกว่ามาก แต่ย่านว่าง−781.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 ปริศนาที่จะไขในบทหลัง

จากประโยคแก่นเดียวนี้ มีคำถามสามข้อที่ตอบไม่ได้ด้วยความรู้แค่บทนี้ จดไว้แล้วไปต่อ

  1. ถ้าค่าเน่าตลอด แล้วจะรู้ได้ยังไงว่าเพื่อนบ้านคนไหนยังอยู่ → บทที่ 5
  2. ถ้าเส้นทางเปลี่ยนทุกครั้งที่ค่าขยับนิดเดียว เครือข่ายจะไม่สั่นตลอดเวลาหรือ → บทที่ 9
  3. ถ้าทุก hop แย่งอากาศกันเอง การมีเส้นทางที่ดีจะช่วยอะไรได้จริงหรือ → บทที่ 10 และคำตอบเต็มอยู่ที่บทที่ 11 ซึ่งเป็นจุดพีคของเล่ม

อ่านแบบเต็มเล่ม