معضلة اللواءين Two Generals Problem

تخيل معي السينارو التالي: ثم قلعة بها عدو يحتمي بها، وثم لواءان، عباس وعمرو، مع جنودهما يريدان اقتحام القلعة وهزيمة العدو، لواء منهما يتمركز شرق القلعة والآخر يتمركز غربها.. المشكلة إن الخبراء قدروا أنه إن هاجم لواء واحد منهما على القلعة سيهزم هو وجنوده بلا شك! أما إذا هاجم اللواءان في وقت واحد سيهزم العدو وتقتحم القلعة.

من أجل التنسيق، يريد اللواءان تحديد وقت يهاجمان فيه في لحظة واحدة حتى يتمكنا من اقتحام القلعة، يستطيع اللواء عباس إرسال رسول إلى عمرو يخبره فيها أن يبدآ الهجوم الساعة 6:00 صباحا، ولكن الرسول قد تدركه أحد سهام الرماة في القلعة أو أحد الجنود الذين حولها، إذ تُقدر احتمالية وصول الرسالة بسلام إلى عمرو بقيمة 50%، وفي 50% من الاحتمال قد يصاب الرسول في الطريق ولا يصل، ما يعني من الراجح أن الرسالة لم تصل إلى عمرو وأن عباس سيهاجم وحده ويهزم.. ما الحل؟

حل المعضلة

هذه المعضلة تسمى معضلة اللواءين Two Generals Problem، وهي معضلة ليس لها حل.. عفوا، يمكن أن توجد حلول تقلل من حدة المشكلة ولكن لا يوجد حل يضمن مزامنة الهجوم بنسبة 100%. ربما تقول "يخبر عباس عمرا في الرسالة أن يرد عليه برسول، فإن رجع رسول من عمرو إلى عباس يؤكد وصول الرسالة يهاجم، وإن لم يصل فإن الرسول الأول لم يصل ولا يهاجم.."، لكنك لم تلاحظ أن هذا ينقل المأزق من عباس إلى عمرو لا أكثر، إذ ربما لا يصل الرسول العائد من عمرو إلى عباس، حينها لن يهاجم عباس (لأنه يظن رسوله لم يصل) وسيهاجم عمرو ويقع في مأزق!

لا يوجد حل يضمن لهما المزامنة بنسبة 100% مهما فكرت أيها القارئ، فالطريقة الوحيدة هي أن تكون وسيلة التواصل بينهما توصل الرسائل باحتمالية 100%.. لكن يوجد حل يقلل حدة المشكلة: ماذا لو أرسل عباس رسولين بنفس الرسالة؟ احتمالية عدم وصول أحدهما 50% ولكن احتمالية عدم وصول كليهما معا تهبط إلى 25%، وإن أرسل ثلاثة فإن احتمالية عدم وصول الثلاثة تهبط إلى 12.5%، أما إن أرسل عشرة فإن احتمالية عدم وصول العشرة تهبط إلى 00.097%!

فكل ما على عباس هو أن يرسل سبعة أو ثمانية رسل مع نفس الرسالة (هاجم الساعة 6:00 صباحا) وأن يهاجم هو في هذه الساعة مهما كان، وأن يرجو من الله أن أحد الرسل على الأقل قد وصل إلى عمرو.

تطبيق المعضلة

لماذا تشرح هذه المعضلة؟ هذه المعضلة ليست من أجل تعليمك كيف تهاجم عندما تكون لواء، ولكنها لتعليمك المشكلات التي تواجه المهندسين عند محاولة المزامنة بين جهازين بينهما طريقة تواصل غير مضمونة.

  1. لنقل مثلا أنك تتصفح موقع تسوق وطلبت شراء حقيبة،
  2. ولنقل أن المبرمج صمم الموقع بحيث يرسل الطلب للخادوم وينتظر رسالة التأكيد من الخادوم،
  3. الطلب وصل للخادوم لكن رسالة التأكيد لم تصل للمتصفح
  4. لنقل أن المبرمج ليس بالخبرة الكافية وصمم الموقع بحيث يقول لك في هذه الحالة "الطلب لم يصل ⛔️، هل تريد المحاولة مجددا؟"
  5. تضغط المحاولة مجددا فيصل للخادوم طلب جديد،
  6. هذه المرة تصل رسالة التأكيد من الخادوم بنجاح ويخبرك الموقع أن الطلب تم ✅️
  7. يأتي لك رجل التوصيل ومعه لك نفس الحقيبة التي طلبتها مرتين!

من التطبيقات المعروفة للمعضلة أيضا بروتوكول (أو ميفاق) التحكم بالإرسال Transmission Control Protocol. كلنا نعلم أنه عندما يريد جهاز إنهاء الاتصال بهذا البروتوكول فإنه ينهيها بطريقة المصافحة رباعية الطرق "Four-way handshake".. كلنا نعلم ما عدا هذا القارئ

  1. في طريقة المصافحة رباعية الطرق يرسل الجهاز الذي يريد إنهاء الاتصال رسالة FIN،
  2. يرد الجهاز الآخر برسالة تأكيد ACK (اختصار Acknowledgement)،
  3. ثم يرسل رسالة FIN ليقطع الاتصال
  4. ثم يرد الجهاز الأول برسالة تأكيد ACK وينتهي الاتصال.
ولكن لنقل إن الجهاز الثاني استطاع إرسال ACK وإرسال FIN، ولكن لم تصل رسالة ACK الأخيرة. حينها سنكون في وضعية اتصال نصف مفتوح، بحيث يعلم أحد الطرفين (الجهاز الأيسر) أن الاتصال انتهى ولكن الآخر لا يعلم، يمكن حينها للطرف الذي لا يعلم أن الاتصال انتهى الاعتماد على نفاد الوقت Time out، بحيث ينتظر ردا على رسالته لبعض الوقت، فإن لم يأته أي رد خلال ذلك الوقت يفترض من نفسه أن الاتصال انتهى..

ربما هذا المثال بعيد قليلا عن حياتنا العملية، لنقل مثالا آخر، لنقل أن جهاز حاسوبك متصل بطابعة بالبلوتوث، وأرسلت أمر طباعة مستند، الحاسوب يخبرك أن أمر الطباعة أرسل بنجاح لكن الطابعة لم تطبع شيئا! السبب هو أن الحاسوب أرسل الأمر ولكنه لم يصل أو وصل منقوصا، فلم تنفذ الطابعة الأمر والحاسوب لا يستطيع أن يعلم أن الطابعة لم تنفذ الأمر.. إذا قلت أن ينتظر الحاسوب رسالة تأكيد من الطابعة، فهذا يصنع مأزقا آخر بحيث تكون الطابعة طبعت ولكن الحاسوب يظن أنها لم تطبع لأن رسالة التأكيد لم تصل بسلام..

بالنسبة لموضوع الطابعة.. ما رأيك؟ كيف نحل هذه المشكلة؟ ربما تقول "يرسل الحاسوب عشرات الرسائل بنفس الأمر لنحل المشكلة بنفس الطريقة"، ولكن كيف سنضمن أن الطابعة ستنفذ الأمر مرة واحدة فقط؟ حينها نحل المشكلة بطريقة رمز الهوية:

  1. يطلب الحاسوب من الطابعة رقم هوية،
  2. لنقل أن الطابعة طبعت 18 مستندا من قبل، فترد برقم "19"،
  3. يرسل الحاسوب عشرات الأوامر بطباعة نفس المستند برقم الهوية "19"،
  4. تنفذ الطابعة أول أمر يصل لها، وترفع عدد الأوامر المنفذة لديها إلى 19 بدلا من 18
  5. عندما يصل للطابعة أمر بنفس رقم الهوية (أو برقم هوية قديم) تتجاهل الطابعة الأمر لأنه أمر مكرر.

وبهذا نكون حللنا معضلة اللواءين بالنسبة للحاسوب والطابعة.

معضلة اللواءين, شبكات, علوم الحاسوب, بروتوكول, ميفاق

التعليقات:

إرسال تعليق

هنا أنت الكاتب، قل ما تريد، كن مهذبا


هذه أحدث تدوينة

يُشَغَّلُ من Blogger

تصميم الورشة مع تعديل وتطوير مني