تشريح بروتوكول AWDL.
AWDL ليس «بروتوكول إرسال ملفات». هو آلة حالة موزّعة متزامنة زمنياً: قفز قنوات متفق عليه + انتخاب قائد + نوافذ إتاحة دقيقة. AirDrop مجرّد مستهلك يجلس فوقه. إذا فهمت هذه الوحدة فهمت 70% من الباقي.
ما هو AWDL ولماذا وُجد؟
AWDL = Apple Wireless Direct Link: بروتوكول خاص (proprietary) طوّرته Apple للاتصال المباشر جهاز-لجهاز بدون AP. هو الأساس التحتي لـ AirDrop، AirPlay، Sidecar، وألعاب GameKit التشاركية.
الفكرة العبقرية فيه: الجهاز يريد أن يبقى متصلاً بشبكة Wi-Fi عادية (للإنترنت) و يشارك في AWDL في آن واحد، بشريحة راديو واحدة. الحلّ: مشاركة زمنية (time-slicing) — الراديو يقفز بين قناة الـ AP المعتادة وقنوات AWDL وفق جدول دقيق، فيبدو وكأنه على شبكتين معاً.
تاريخ الهندسة العكسية
AWDL مغلق وغير موثّق رسمياً. الفهم العام مصدره ورقة بحثية محورية:
"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 — النموذج الذهني
القفز بين القنوات (Channel Hopping)
كل أجهزة AWDL المتجاورة تتفق على جدول قفز قنوات مشترك وتتبعه متزامنةً. لو لم تتزامن، لن يلتقي جهازان على قناة واحدة أبداً.
مثال لتسلسل على نطاق 5 GHz (قابل للتغيّر ويُعلَن عنه داخل البروتوكول):
المرجع الأصلي يذكر «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 العادية.
- خلال الـ AW، الأجهزة تتنافس على الوسط بـ DCF/CSMA-CA عادي (الوحدة 0) لكن غالباً بنافذة تنافس مصغّرة.
- خارج الـ AW، لا يُتوقَّع أن يكون الجهاز مُصغياً على قناة AWDL.
المحاكي (OWL مثلاً) يجب أن يبدّل قناة بطاقته بالتزامن مع بدايات الـ AWs المُعلَنة من الـ Master. خطأ توقيت بسيط = تفويت النوافذ = «اختفاء» من الشبكة.
المزامنة الزمنية (Synchronization) و TSF
كي تتفق الأجهزة على «متى تبدأ AW#0»، تحتاج ساعة مشتركة:
- يحتفظ كل جهاز 802.11 بعدّاد دقيق يُسمّى TSF (Timing Synchronization Function) بدقّة الميكروثانية.
- في AWDL، الـ Master يبثّ دورياً إطارات مزامنة تحمل توقيته (نقطة مرجعية للـ AW)، فتعدّل بقيّة الأجهزة (Slaves) ساعاتها لتطابقه.
| الإطار | الاسم الكامل | التردّد | الغرض |
|---|---|---|---|
PSF | Periodic Synchronization Frame | ~110 ms | يحمل معاملات المزامنة دورياً |
MIF | Master Indication Frame | عند الحاجة | يبثّه الـ Master ويعلن «أنا الـ Master ومعاملاتي كذا» |
النتيجة: شجرة مزامنة (synchronization tree) جذرها الـ Master، وكل العقد تتبع توقيته.
انتخاب الـ Master (Election)
من يصبح Master؟ لا تنسيق مركزي، فالقرار موزّع وتنافسي:
- كل عقدة تحسب «مقياس» (metric) لنفسها. قيمة تمثّل «جدارتها» بالقيادة.
- كل عقدة تعلن في إطاراتها: عنوان الـ Master الذي تتبعه حالياً، مقياس ذلك الـ Master، ومقياسها هي، و«المسافة للـ Master» (عدد القفزات).
- القاعدة: العقدة ذات المقياس الأعلى في الجوار تفوز وتصبح Master. تُكسر التعادلات بعنوان العقدة (المشتق من الـ MAC) كحَكَم.
- إذا اختفى الـ Master (لم تُسمع إطاراته خلال مهلة)، يُعاد الانتخاب تلقائياً.
→ هذه آلة الحالة هي بالضبط ما ينفّذه OWL في userspace (الوحدة 4).
بنية الإطار: Action frames و TLVs
إطارات AWDL (PSF و MIF) هي 802.11 Vendor-Specific Action frames:
- الفئة Public Action، مع OUI الخاص بـ Apple =
00:17:F2ونوع فرعي يدلّ على AWDL. - جسد الإطار سلسلة من عناصر TLV (Type-Length-Value): كل عنصر = بايت نوع + طول + قيمة. هذا يجعل البروتوكول قابلاً للتوسعة.
أهم أنواع الـ TLV
| Type | الاسم | الغرض |
|---|---|---|
0x04 | Synchronization Parameters | معاملات الـ AW، التوقيت، عدّاد القفز |
0x05 | Election Parameters | مقياس الانتخاب، عنوان ومقياس الـ Master |
0x18 | Election Parameters v2 | نسخة موسّعة من معاملات الانتخاب |
0x12 | Channel Sequence | جدول القنوات نفسه (أيّ قناة لكل فتحة) |
0x06 | Service Parameters | معاملات الخدمات المعلَن عنها |
0x02 | Service Response | سجلات mDNS/Bonjour (اكتشاف الخدمات) |
0x0C | Data Path State | حالة مسار البيانات (عنوان، قدرات) |
0x10 | Arpa (Hostname) | اسم المضيف |
0x14 | Synchronization Tree | بنية شجرة المزامنة |
0x16 | Version | إصدار البروتوكول |
أما إطارات البيانات فهي 802.11 QoS-Data عادية، لكن بعد ترويسة MAC تُدرَج AWDL Data Header (تحمل: نوع AWDL، sequence number، timestamp، traffic class)، ثم تأتي حمولة IPv6 فعلية.
مسار البيانات و IPv6 فوق AWDL
- بمجرد التزامن، يُنشئ كل جهاز واجهة AWDL منطقية ويولّد لها عنوان IPv6 link-local ضمن البادئة
fe80::/10. - العنوان يُشتقّ من الـ MAC بصيغة EUI-64 (توسعة الـ 48-bit MAC إلى 64-bit بإدراج
FF:FEوقلب بِتّ U/L). - فوق هذا الرابط IPv6: يجري تبادل Neighbor Discovery (ND) للتأكد من الوصول، ثم تعمل بقيّة البروتوكولات (mDNS, TCP, UDP) طبيعياً كأنها على أي رابط IPv6.
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
AWDL يعطيك في النهاية «كيبل IPv6 افتراضي» بين جهازين، وكل شيء فوقه بروتوكولات إنترنت قياسية. هذا ما يجعل محاكاته في userspace ممكنة: تلتقط/تحقن الإطارات منخفضة المستوى، وتمرّر الحمولة لمكدّس IPv6 عادي عبر واجهة TUN.
سلوك طبقة MAC في AWDL — تلخيص القيود
- يستخدم CSMA/CA + DCF داخل الـ AW.
- BSSID ثابت
00:25:00:FF:94:73؛ الوجهة إما unicast أو broadcast (ff:ff:ff:ff:ff:ff). - لا تشفير على مستوى الرابط (لا WPA2/WPA3). الأمن يُبنى في الطبقات العليا (TLS في AirDrop).
- يتطلّب ACK على مستوى MAC لكل إطار unicast — وهذا (مجدداً) جوهر متطلب العتاد في الوحدة 3.
نقاط ارتكاز الوحدة 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
- اكتب جدولاً يربط كل TLV من الجدول أعلاه بالسؤال الذي يجيب عنه («متى؟»، «أين؟»، «من القائد؟»، «ما الخدمات؟»).
- احسب عنوان IPv6 link-local المتوقّع (EUI-64) لجهاز عنوان MAC الخاص به
AA:BB:CC:11:22:33. اشرح خطوة قلب بِتّ U/L. - لماذا يُعلَن جدول القنوات داخل البروتوكول بدل تثبيته في الكود؟ ما الميزة الهندسية؟