AWDL://CRSE MODULE 01 / 07 TOPIC AWDL · CORE STATUS DEEP_DIVE SIGNAL_LIVE
// MODULE_01 CORE_PROTOCOL REVERSE_ENGINEERED

تشريح بروتوكول AWDL.

AWDL ليس «بروتوكول إرسال ملفات». هو آلة حالة موزّعة متزامنة زمنياً: قفز قنوات متفق عليه + انتخاب قائد + نوافذ إتاحة دقيقة. AirDrop مجرّد مستهلك يجلس فوقه. إذا فهمت هذه الوحدة فهمت 70% من الباقي.

ما هو AWDL ولماذا وُجد؟

AWDL = Apple Wireless Direct Link: بروتوكول خاص (proprietary) طوّرته Apple للاتصال المباشر جهاز-لجهاز بدون AP. هو الأساس التحتي لـ AirDrop، AirPlay، Sidecar، وألعاب GameKit التشاركية.

// CORE_TRICK

الفكرة العبقرية فيه: الجهاز يريد أن يبقى متصلاً بشبكة Wi-Fi عادية (للإنترنت) و يشارك في AWDL في آن واحد، بشريحة راديو واحدة. الحلّ: مشاركة زمنية (time-slicing) — الراديو يقفز بين قناة الـ AP المعتادة وقنوات AWDL وفق جدول دقيق، فيبدو وكأنه على شبكتين معاً.

تاريخ الهندسة العكسية

AWDL مغلق وغير موثّق رسمياً. الفهم العام مصدره ورقة بحثية محورية:

FOUNDING_PAPER · MOBICOM 2018

"One Billion Apples' Secret Sauce: Recipe for the Apple Wireless Direct Link Ad hoc Protocol"

Stute, Kreitschmann, Hollick · TU Darmstadt · SEEMOO Lab. نتج عنها مشروعا OWL (محاكاة AWDL) و OpenDrop (محاكاة AirDrop). كل ما نعرفه عملياً يقوم على هذا العمل.

AWDL كطبقة فوق 802.11 — النموذج الذهني

FIG_1.2aAWDL · LOGICAL STACK
applications AirDrop · AirPlay · Sidecar · GameKit mDNS/Bonjour · IPv6 · TCP/UDP standard internet stack AWDL LOGICAL LAYER channel hopping · synchronization · master election · TLV negotiation the secret sauce IEEE 802.11 — Action & QoS-Data frames MAC layer (reused, not replaced) regular Wi-Fi to AP simultaneous, time-sliced PHY · 5 GHz / 2.4 GHz radio single physical radio chain, shared in time time-slice AWDL يركب فوق MAC العادي ويتقاسم نفس الراديو زمنياً مع اتصال البنية التحتية.
AWDL لا يستبدل 802.11. يجلس فوقه ويتقاسم الراديو زمنياً مع اتصال الـ AP العادي.

القفز بين القنوات (Channel Hopping)

كل أجهزة AWDL المتجاورة تتفق على جدول قفز قنوات مشترك وتتبعه متزامنةً. لو لم تتزامن، لن يلتقي جهازان على قناة واحدة أبداً.

مثال لتسلسل على نطاق 5 GHz (قابل للتغيّر ويُعلَن عنه داخل البروتوكول):

149 → 44 → 36 → 153 → 48 → 40 → 157 → 52 → 44 → 161 → 56 → 48 → 165 → 60 → 52 → 149 → ... └─ slot 0 └─ slot 1 ... └─ wrap
FIG_1.3aCHANNEL HOP · 16 SLOTS · SAMPLE SEQUENCE
freq 165 161 157 153 149 60 56 52 48 44 40 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 channel sequence over 16 Availability Windows (one full cycle) UNII-3 (149-165) UNII-1/2 (36-60)
تصوّر القفز بين القنوات على 16 فتحة. كل عمود = نافذة إتاحة واحدة (AW). الجهاز يتنقّل بين قنوات 5 GHz العليا والسفلى.
// PRECISION_NOTE

المرجع الأصلي يذكر «dwell ≈ 64 ms ودورة ≈ 3.07 s». هذا تبسيط مفيد لكن غير دقيق. الوحدة الزمنية الأساسية في AWDL هي TU = 1024 µs، والنافذة AW = 16 TU ≈ 16.384 ms. الجدول الفعلي يُرمَّز في Channel Sequence TLV ويُعلَن داخل البروتوكول. لا تحفظ الأرقام كحقائق مطلقة — احفظ أن التوقيت مبني على TU، والأجهزة تقرأ الجدول لا تفترضه.

نوافذ الإتاحة (Availability Windows)

AWDL يقسّم الزمن إلى تسلسل من النوافذ. خلال نافذة الإتاحة (AW) يكون الجهاز «حاضراً» على القناة المحدّدة لتلك الفتحة، مستعداً لإرسال/استقبال إطارات الاكتشاف والبيانات. بين النوافذ قد يعود الجهاز لقناة الـ AP العادية.

FIG_1.4aAVAILABILITY WINDOWS · TIMELINE
t → AW #0 ch 149 16 TU AW #1 ch 44 16 TU AW #2 ch 36 16 TU AW #3 ch 153 16 TU AW #4 ch 48 16 TU gap gap gap gap inside AW: standard DCF/CSMA-CA contention between AWs: radio may return to AP channel for regular Wi-Fi a missed AW boundary = missed conversation = device "disappears"
تسلسل نوافذ الإتاحة. خلال كل AW جهازك متاح على قناة محدّدة. بين النوافذ، الراديو يخدم شبكة AP العادية.
// IMPL_CONSEQUENCE

المحاكي (OWL مثلاً) يجب أن يبدّل قناة بطاقته بالتزامن مع بدايات الـ AWs المُعلَنة من الـ Master. خطأ توقيت بسيط = تفويت النوافذ = «اختفاء» من الشبكة.

المزامنة الزمنية (Synchronization) و TSF

كي تتفق الأجهزة على «متى تبدأ AW#0»، تحتاج ساعة مشتركة:

الإطارالاسم الكاملالتردّدالغرض
PSFPeriodic Synchronization Frame~110 msيحمل معاملات المزامنة دورياً
MIFMaster Indication Frameعند الحاجةيبثّه الـ Master ويعلن «أنا الـ Master ومعاملاتي كذا»

النتيجة: شجرة مزامنة (synchronization tree) جذرها الـ Master، وكل العقد تتبع توقيته.

انتخاب الـ Master (Election)

من يصبح Master؟ لا تنسيق مركزي، فالقرار موزّع وتنافسي:

  1. كل عقدة تحسب «مقياس» (metric) لنفسها. قيمة تمثّل «جدارتها» بالقيادة.
  2. كل عقدة تعلن في إطاراتها: عنوان الـ Master الذي تتبعه حالياً، مقياس ذلك الـ Master، ومقياسها هي، و«المسافة للـ Master» (عدد القفزات).
  3. القاعدة: العقدة ذات المقياس الأعلى في الجوار تفوز وتصبح Master. تُكسر التعادلات بعنوان العقدة (المشتق من الـ MAC) كحَكَم.
  4. إذا اختفى الـ Master (لم تُسمع إطاراته خلال مهلة)، يُعاد الانتخاب تلقائياً.
FIG_1.6aELECTION · STATE MACHINE
LISTENING on boot, scanning SLAVE following another master syncs TSF + ch sequence MASTER broadcasts PSF + MIF defines channel sequence heard master, higher metric no master / my metric highest master timeout, I'm highest now neighbor with higher metric appeared broadcast PSF/MIF distributed, leaderless until decided. tie-breaker = MAC address.
آلة حالة الانتخاب: العقدة تبدأ بالاستماع، ثم تصبح Slave أو Master وفق المقياس. تغيير الحالة لحظي حسب الحوار.

→ هذه آلة الحالة هي بالضبط ما ينفّذه OWL في userspace (الوحدة 4).

بنية الإطار: Action frames و TLVs

إطارات AWDL (PSF و MIF) هي 802.11 Vendor-Specific Action frames:

أهم أنواع الـ TLV

Typeالاسمالغرض
0x04Synchronization Parametersمعاملات الـ AW، التوقيت، عدّاد القفز
0x05Election Parametersمقياس الانتخاب، عنوان ومقياس الـ Master
0x18Election Parameters v2نسخة موسّعة من معاملات الانتخاب
0x12Channel Sequenceجدول القنوات نفسه (أيّ قناة لكل فتحة)
0x06Service Parametersمعاملات الخدمات المعلَن عنها
0x02Service Responseسجلات mDNS/Bonjour (اكتشاف الخدمات)
0x0CData Path Stateحالة مسار البيانات (عنوان، قدرات)
0x10Arpa (Hostname)اسم المضيف
0x14Synchronization Treeبنية شجرة المزامنة
0x16Versionإصدار البروتوكول
FIG_1.7aAWDL ACTION FRAME · BYTE LAYOUT
① 802.11 MAC HEADER FC Dur Addr1 (RA) Addr2 (TA) Addr3 = BSSID 00:25:00:FF:94:73 Seq ② ACTION FRAME WRAPPER Category=0x7F Action OUI = 00:17:F2 AWDL subtype ③ AWDL FIXED HEADER version type (PSF/MIF) flags Target Tx Time (TSF) ④ TLV CHAIN — variable [0x04 Sync] T·L·V [0x12 Channel Seq] 16 slots, current index [0x05 Election] my metric, master addr [0x02 Service] mDNS records [0x16 Ver] protocol ver …more…
تفصيل بايت-بايت لإطار AWDL Action. ينتهي الإطار بسلسلة TLVs قابلة للتوسعة — هذه بطاقة هوية البروتوكول كاملةً.

أما إطارات البيانات فهي 802.11 QoS-Data عادية، لكن بعد ترويسة MAC تُدرَج AWDL Data Header (تحمل: نوع AWDL، sequence number، timestamp، traffic class)، ثم تأتي حمولة IPv6 فعلية.

مسار البيانات و IPv6 فوق AWDL

EUI-64 · MAC → IPv6 link-local derivation
# MAC address (48-bit)
  AA  :  BB  :  CC  :  11  :  22  :  33
  └────┬────┘    └────┬────┘    └────┬────┘
   OUI: vendor   middle           NIC

# step 1: split MAC in half, insert FF:FE in the middle
  AA:BB:CC : FF:FE : 11:22:33

# step 2: flip the universal/local bit (bit 1 of first byte)
  AA = 1010 1010   →   1010 1000 = A8
  → A8:BB:CC:FF:FE:11:22:33

# step 3: prepend the link-local prefix fe80::/64
  fe80::a8bb:ccff:fe11:2233
                ▲ this is your AWDL IPv6 address
// ELEGANCE

AWDL يعطيك في النهاية «كيبل IPv6 افتراضي» بين جهازين، وكل شيء فوقه بروتوكولات إنترنت قياسية. هذا ما يجعل محاكاته في userspace ممكنة: تلتقط/تحقن الإطارات منخفضة المستوى، وتمرّر الحمولة لمكدّس IPv6 عادي عبر واجهة TUN.

سلوك طبقة MAC في AWDL — تلخيص القيود

CSMA/CA
access inside AW
00:25:00:FF:94:73
fixed BSSID
NO L2 CRYPTO
no WPA2/WPA3
ACK REQUIRED
on every unicast

نقاط ارتكاز الوحدة 1

  • AWDL = (channel hopping متزامن) + (master election) + (availability windows) فوق 802.11.
  • التوقيت مبني على TU و AW (16 TU)، والجدول مُعلَن في Channel Sequence TLV لا مُفترَض.
  • إطارات التحكّم/الإعلان = Vendor-Specific Action frames (OUI 00:17:F2) محمّلة بـ TLVs.
  • إطارات البيانات = QoS-Data + AWDL header + IPv6.
  • المخرج النهائي: رابط IPv6 link-local بين الجهازين.

تمارين الوحدة 1

  1. اكتب جدولاً يربط كل TLV من الجدول أعلاه بالسؤال الذي يجيب عنه («متى؟»، «أين؟»، «من القائد؟»، «ما الخدمات؟»).
  2. احسب عنوان IPv6 link-local المتوقّع (EUI-64) لجهاز عنوان MAC الخاص به AA:BB:CC:11:22:33. اشرح خطوة قلب بِتّ U/L.
  3. لماذا يُعلَن جدول القنوات داخل البروتوكول بدل تثبيته في الكود؟ ما الميزة الهندسية؟