أدخلت تطبيقات مشاركة الموسيقى مثل Napster و KaZaA مصطلح الند للند في اللغة العامية الشعبية، ولكن ما الذي يعنيه بالضبط أن يكون النظام ندًا لند أو نظيرًا لنظير؟ يعني ذلك، ضمن سياق مشاركة ملفات MP3، عدم الاضطرار إلى تحميل الموسيقى من موقعٍ مركزي، ولكن القدرة على الوصول إلى ملفات الموسيقى مباشرةً من أي شخصٍ على الإنترنت لديه نسخةٌ مخزنةٌ على حاسوبه. يمكننا القول أن شبكة الند للند تسمح لمجتمع المستخدمين بتجميع مواردهم، مثل المحتوى والتخزين وحيز النطاق التراسلي للشبكة وحيز نطاق القرص الصلب ووحدة المعالجة المركزية، وبالتالي توفير الوصول إلى متجرٍ مؤرشَف أكبر، ومؤتمرات فيديو أو صوت أكبر، وعمليات بحثٍ وحوسبةٍ أعقد مما يستطيع أي مستخدمٍ تحمل تكاليفه بمفرده.
تُذكَر سماتٌ مثل اللامركزية والتنظيم الذاتي عند مناقشة شبكات الند للند في كثيرٍ من الأحيان، مما يعني أن العُقد تنظّم نفسها في شبكةٍ دون أي تنسيقٍ مركزي. إذا فكرت في الأمر، فيمكنك استخدام مصطلحات مثلها لوصف الإنترنت نفسه، ولكن من المفارقات أن تطبيق نابستر Napster لم يكن نظام ندٍ لند حقيقيًا بهذا التعريف بسبب اعتماده على سجلٍ مركزيٍ للملفات المعروفة، وكان على المستخدمين البحث في هذا الدليل للعثور على الجهاز الذي يقدم ملفًا معينًا. الخطوة الأخيرة المتمثلة بتحميل الملف فعليًا هي فقط التي حدثت بين الأجهزة التي تنتمي إلى مستخدمين اثنين، ولكن هذا ليس أكثر من معاملةٍ تقليديةٍ بين العميل والخادم؛ حيث أن الفارق الوحيد هو أن الخادم مملوكٌ لشخصٍ مثلك تمامًا وليس لشركةٍ كبيرة.
إذا عدنا إلى السؤال الأصلي: ما المثير للاهتمام في شبكات الند للند؟ تتمثل إحدى الإجابات في أن كلًا من عملية تحديد موقع كائن وعملية تحميل هذا الكائن على جهازك المحلي تحدث دون الحاجة إلى الاتصال بسلطةٍ مركزية، وفي نفس الوقت يكون النظام قادرًا على توسيع نطاقه ليشمل ملايين العقد. يتضح أن نظام الند للند الذي يمكنه إنجاز هاتين المهمتين بطريقةٍ لامركزية هو شبكة تراكب overlay network، حيث تكون العقد هي هؤلاء المضفين الذين يرغبون في مشاركة الكائنات، مثل الموسيقى والملفات المتنوعة الأخرى، وتمثل الروابط (أو الأنفاق) التي تربط هذه العقد تسلسل الأجهزة التي يجب عليك زيارتها لتعقب الكائن الذي تريده. سيصبح كل شيءٍ أوضح بعد أن نشرح المثالين التاليين.
شبكة جنوتيلا Gnutella
وهي إحدى شبكات الند للند الأولى التي حاولت التمييز بين تبادل الموسيقى، الذي يمكن أن ينتهك حقوق الطبع والنشر لشخصٍ ما، والمشاركة العامة للملفات والتي يجب أن تكون جيدة لأننا تعلّمنا المشاركة منذ نعومة أظفارنا. كانت شبكة جنوتيلا Gnutella من أوائل الأنظمة التي لم تعتمد على سجلٍ مركزي للكائنات، حيث يرتّب المشاركون أنفسهم في شبكة تراكبٍ مشابهةٍ للشبكة الموضحة في الشكل الآتي؛ أي أن كل عقدةٍ تشغّل برمجيات شبكة جنوتيلا (أي تطبّق بروتوكول شبكة Gnutella) تعرّف مجموعةً من الأجهزة الأخرى التي تشغّل برمجيات هذه الشبكة أيضًا. تتوافق العلاقة "تعرف العقدتان A وB بعضهما بعضًا" مع أضلاع الرسم البياني التالي.
إذا أراد المستخدم في عقدةٍ معينة العثور على كائنٍ ما، ترسل شبكة جنوتيلا رسالة استعلام QUERY عن هذا الكائن (مثل تحديد اسم الملف) إلى جيران العقدة في الرسم البياني؛ فإذا كان لدى أحد الجيران هذا الكائن، فإنه يستجيب للعقدة التي أرسلت إليه الاستعلام برسالة استجابة QUERY RESPONSE، مع تحديد مكان تحميل الكائن، مثل عنوان IP ورقم منفذ TCP، ويمكن لهذه العقدة فيما بعد استخدام رسائل GET أو PUT للوصول إلى الكائن؛ وفي حال لم تتمكن العقدة من تحليل الاستعلام، فإنها تعيد توجيه رسالة QUERY إلى كل جيرانها باستثناء العقدة التي أرسلت لها الاستعلام، وتتكرر العملية، أي يغمر بروتوكول جنوتيلا شبكة التراكب لتحديد موقع الكائن المطلوب. يضبط بروتوكول شبكة جنوتيلا مدة البقاء أو العُمر TTL على كل استعلامٍ حتى لا يستمر هذا الغمر إلى أجلٍ غير مسمى.
تحتوي كل رسالةٍ من رسائل QUERY على معرف استعلام فريد query identifier -أو اختصارًا QID- بالإضافة إلى مدة TTL وسلسلة الاستعلامات، ولكنها لا تحتوي على هوية مصدر الرسالة الأصلي، حيث تحتفظ كل عقدةٍ بدلًا من ذلك بسجلٍ لرسائل QUERY التي شاهدتها مؤخرًا، والذي يحتوي على كلٍ من معرّف QID والجار الذي أرسل رسالة QUERY إلى هذه العقدة.
يُستخدم هذا السجل بطريقتين. أولًا، إذا استلمت العقدة في أي وقت استعلامًا بمعرف QID يطابق معرّفًا رأته مؤخرًا، فلن تمرر رسالة QUERY. يعمل هذا على قطع حلقات التمرير بسرعةٍ أكبر مما قد تفعله مدة TTL. ثانيًا، عندما تتلقى العقدة استجابة QUERY RESPONSE من جارٍ يقع تحتها في الشجرة، فإنها تمرر الاستجابة إلى الجار الرئيسي الذي أرسل إليها رسالة QUERY في الأصل. تعود الاستجابة في طريقها باستخدام هذه الطريقة إلى العقدة الأصلية دون أن تعرف أيًّا من العقد الوسيطة هي العقدة التي أرادت تحديد موقع هذا الكائن المحدد في المقام الأول.
يجب أن تعرف العقدة عقدةً أخرى على الأقل عندما تنضم إلى شبكة تراكب جنوتيلا، حيث تُضاف العقدة الجديدة إلى شبكة التراكب بواسطة هذا الرابط على الأقل، ثم تتعرف عقدةٌ معينةٌ على العقد الأخرى نتيجة لرسائل QUERY RESPONSE، سواء بالنسبة للكائنات التي طلبتها أو للاستجابات التي تمر عبرها. العقدة حرةٌ في تحديد العقد التي تُكتشف بهذه الطريقة والتي تريد الاحتفاظ بها مثل جار، حيث يوفر بروتوكول جنوتيلا رسائل PING و PONG التي تتحرى العقدة بواسطتها ما إذا كان جارٌ معين لا يزال موجودًا أم لا وأن هذا الحار يستجيب، على التوالي.
يجب أن يكون واضحًا أن بروتوكول شبكة جنوتيلا كما هو موصوف هنا ليس بروتوكولًا ذكيًا، وقد حاولت الأنظمة اللاحقة تحسينه. أحد أبعاد التحسينات الممكنة هو كيفية نشر الاستعلامات، حيث تحتوي طريقة الغمر Flooding على خاصيةٍ لطيفةٍ وهي ضمان العثور على الكائن المطلوب في أقل عددٍ ممكنٍ من القفزات، ولكنها لا تتوسّع جيدًا. يمكن تمرير الاستعلامات عشوائيًا، أو وفقًا لاحتمالية النجاح بناءً على النتائج السابقة. البعد الثاني هو استنساخ الكائنات استباقيًا، نظرًا لأنه كلما زاد عدد نسخ كائنٍ معين، كان من الأسهل العثور على نسخة. يمكن بدلًا من ذلك تطوير استراتيجيةٍ مختلفةٍ تمامًا، وهو الموضوع الذي سنشرحه الآن.
شبكات التراكب المهيكلة Structured Overlays
في نفس الوقت الذي بدأت فيه أنظمة مشاركة الملفات الصراع لملء الفراغ الذي تركه تطبيق Napster، بدأ مجتمع البحث في استكشاف تصميمٍ بديلٍ لشبكات الند للند. نشير إلى هذه الشبكات على أنها مهيكلة structured، على عكس الطريقة العشوائية غير المهيكلة أساسًا التي تتطوّر بها شبكة جنوتيلا، حيث تستخدم شبكات التراكب غير المهيكلة مثل شبكة جنوتيلا خوارزميات بناء وصيانة تراكب بسيطة، ولكن أفضل ما يمكن أن تقدمه هو البحث العشوائي غير الموثوق به؛ بينما صُمِّمت شبكات التراكب المهيكلة لتتوافق مع بنية رسمٍ بيانيٍ معينة تتيح موقعًا موثوقًا وفعالًا وبتأخير محدود احتماليًا، في مقابل تعقيدٍ إضافي أثناء إنشاء التراكب وصيانته.
هناك سؤالان يجب مراعاتهما، هما: كيف يمكننا ربط الكائنات مع العقد، وكيف نوجه طلبًا إلى العقدة المسؤولة عن كائن معين؟ نبدأ بالسؤال الأول، الذي يحتوي على عبارةٍ بسيطة: كيف يمكننا ربط كائنٍ x مع عنوان بعض العقد n التي يمكنها خدمة هذا الكائن؟ لا تتحكم شبكات الند للند التقليدية في تحديد العقدة التي تستضيف الكائن x، فإذا تمكنا من التحكم في كيفية توزيع الكائنات عبر الشبكة، فقد نتمكن من فعل أمرٍ أفضل للعثور على هذه الكائنات في وقتٍ لاحق.
من الأساليب المعروفة لربط الأسماء مع عنوان هي استخدام جدول التعمية hash كما يلي:
hash(x) → n
حيث يُوضَع الكائن x أولًا على العقدة n، وسيتعين في وقتٍ لاحق على العميل الذي يحاول تحديد موقع x، تنفيذ تعمية x لتحديد أنه موجود على العقدة n. يتميز النهج القائم على التعمية بخاصيةٍ تتمثل في ميله إلى نشر الكائنات بالتساوي عبر مجموعة العقد، لكن خوارزميات التعمية المباشرة تعاني من عيبٍ هو: ماهو عدد القيم n الممكنة التي يجب أن نسمح بها؟ أو باستخدام مصطلحات التعمية، كم عدد المجموعات buckets التي يجب أن تكون موجودة؟ يمكننا أن نقرر ببساطةٍ أن هناك 101 قيمةً معمَّاةً محتملةً على سبيل المثال، ونستخدم دالة تعميةٍ نمطيةٍ هي:
hash(x) return x % 101
إذا كان هناك أكثر من 101 عقدةٍ على استعدادٍ لاستضافة كائنات، فلا يمكننا الاستفادة منها جميعًا. وإذا حددنا عددًا أكبر من أكبر عددٍ ممكنٍ من العقد، فستكون هناك بعض قيم x التي ستُطبَّق عليها التعمية في عنوان عقدةٍ غير موجودة. وهناك أيضًا مشكلةٌ صغيرةٌ تتمثل في ترجمة القيمة التي تعيدها دالة التعمية إلى عنوان IP فعلي.
تستخدم شبكات الند للند المهيكلة، لمعالجة هذه المشكلات خوارزميةً تُعرف باسم إجراء التعمية المستقرة consistent hashing، والتي تطبّق تعميةً على مجموعة من الكائنات بصورةٍ موحدة عبر حيز معرّفاتٍ كبير. يوضح الشكل السابق حيز معرّفات ذا 128 بت على شكل دائرة، حيث نستخدم الخوارزمية لوضع كلٍ من الكائنات:
hash(ObjectName) → ObjectID
والعقد:
hash(IPAddr) → NodeID
على هذه الدائرة. بما أن حيز المعرّفات ذا 128 بت هائل، فليس مرجحًا تعمية الكائن لنفس المعرّف تمامًا مثل تعمية عنوان IP الخاص بالجهاز. لحساب هذا الاحتمال، يُحتفَظ بكل كائنٍ على العقدة التي يكون معرّفها أقرب، في حيز 128 بت هذا، إلى معرّف هذا الكائن. تكمن الفكرة في استخدام دالة تعمية عالية الجودة لربط كلٍ من العقد والكائنات في نفس حيز المعرّفات الكبير والمبعثر؛ حيث يمكنك بعد ذلك ربط الكائنات مع العقد عن طريق التقريب العددي من معرّفات كل منها، وهذا يوزّع الكائنات بالتساوي إلى حدٍ ما عبر العقد، ولكن وعلى عكس التعمية العادية، يجب أن يتحرك عددٌ قليلٌ فقط من الكائنات عندما تنضم العقدة إلى مجموعة التعمية أو تغادر.
ننتقل الآن إلى السؤال الثاني الذي يدور حول كيفية معرفة المستخدم الذي يريد الوصول إلى الكائن x العقدةَ الأقرب في معرّف x ضمن هذا الحيّز. تتمثل إحدى الإجابات المحتملة في احتفاظ كل عقدةٍ بجدولٍ كامل لمعرّفات العقد وعناوين IP المرتبطة بها، ولكن هذا لن يكون عمليًا لشبكةٍ كبيرة، والبديل هو توجيه رسالةٍ إلى هذه العقدة، وهو النهج الذي تستخدمه شبكات ند لند المهيكلة. فإذا أنشأنا شبكة التراكب بطريقةٍ ذكية، والذي يعني أننا بحاجةٍ إلى اختيار مدخلات لجدول توجيه العقدة بطريقةٍ ذكية، فسنجد عقدةً ببساطة عن طريق التوجيه نحوها، ويُطلَق على هذا النهج أحيانًا جدول التعمية الموزَّع distributed hash table -أو اختصارًا DHT-، نظرًا لأنه نظريًا يُوزَّع جدول التعمية على جميع العقد في الشبكة. يوضّح الشكل السابق ما يحدث لحيز معرّف بسيطٍ ذي 28 بت، حيث افترضنا تسمية النهج الذي تستخدمه شبكة ند لندٍ معينة باسم Pastry للحفاظ على طبيعة المناقشة محددةً، وتعمل الأنظمة الأخرى بطريقةٍ مماثلة.
افترض أنك في العقدة ذات المعرّف 65a1fc
(عدد ست عشري) وتحاول تحديد موقع locate الكائن ذي المعرّف d46a1c
، حيث تدرك أن معرّفك لا يتشارك شيئًا مع الكائن، لكنك تعرف عقدةً تشترك في البادئة d
على الأقل، وهذه العقدة أقرب منك في حيز المعرّفات ذي 128 بت، لذلك تمرر الرسالة إلى هذه العقدة. لا نعطي صيغة الرسالة المُمررة، ولكن يمكنك التفكير في الأمر مثل تحديد موقع الكائن d46a1c
. افترض أن العقدة d13da3
تعرف عقدةً أخرى تشترك في بادئةٍ أطول مع الكائن، لذلك تمرر الرسالة إليها. تستمر عملية الاقتراب في حيز المعرّفات حتى تصل إلى عقدةٍ لا تعرف أي عقدةٍ أقرب؛ هذه العقدة، بحكم التعريف، هي التي تستضيف الكائن. ضع في بالك أنه تُمرر الرسالة بالفعل من عقدةٍ إلى أخرى عبر شبكة الإنترنت الأساسية، بينما نتحرك منطقيًا عبر حيز المعرّفات.
تحتفظ كل عقدةٍ بجدول توجيه وعناوين IP لمجموعةٍ صغيرة من معرّفات العقد الأكبر والأصغر عددًا، وهذا ما يُسمى مجموعة أوراق leaf set العقدة؛ وتكمن أهمية مجموعة الأوراق في أنه بمجرد توجيه الرسالة إلى أية عقدةٍ في نفس مجموعة الأوراق مثل العقدة التي تستضيف الكائن، يمكن لهذه العقدة تمرير الرسالة مباشرةً إلى الوجهة النهائية؛ كما تسهّل مجموعة الأوراق التسليم الصحيح والفعال للرسالة إلى العقدة الأقرب عدديًا، على الرغم من وجود عدة عقدٍ تشترك في بادئةٍ ذات أقصى طول مع معرّف الكائن؛ وتقوّي أيضًا مجموعةُ الأوراق التوجيهَ لأن أيًا من العقد في مجموعة الأوراق يمكنها توجيه رسالة تمامًا مثل أية عقدةٍ أخرى في نفس المجموعة، وبالتالي إذا كانت إحدى العقد غير قادرةٍ على إحراز تقدمٍ في توجيه رسالة، فقد يتمكن أحد جيرانها في مجموعة الأوراق من ذلك، حيث يمكن تعريف إجراء التوجيه على النحو التالي:
Route(D) if D is within range of my leaf set forward to numerically closest member in leaf set else let l = length of shared prefix let d = value of l-th digit in D's address if RouteTab[l,d] exists forward to RouteTab[l,d] else forward to known node with at least as long a shared prefix and numerically closer than this node
جدول التوجيه المشار إليه باسم RouteTab
، هو مصفوفةٌ ثنائية الأبعاد، ويحتوي على سطرٍ لكل رقمٍ ست عشري في المعرّف (يوجد 32 رقمًا في معرّف 128 بت) وعمودٍ لكل قيمةٍ ست عشرية (هناك 16 قيمة)، حيث تشترك كل مدخلةٍ في السطر i ببادئة طولها i مع هذه العقدة، وتكون للمُدخلة في العمود j في هذا السطر القيمة الست عشرية j في الموضع i + 1. يوضح الشكل الآتي السطور الثلاثة الأولى من جدول توجيه العقدة 65a1fcx
، حيث تشير x إلى لاحقةٍ غير محددة. يوضّح هذا الشكل أيضًا بادئة المعرّف المطابقة لكل مدخلةٍ في الجدول، ولكنه لا يُظهر القيمة الفعلية المضمَّنة في هذه المدخلة، والتي هي عنوان IP للعقدة التالية للتوجيه إليها.
تعمل إضافة عقدةٍ إلى شبكة التراكب إلى حدٍ كبير مثل توجيه رسالة تحديد موقع locate object message إلى كائن، حيث يجب أن تعرف العقدة الجديدة عضوًا حاليًا واحدًا على الأقل، وتطلب من هذا العضو توجيه رسالة إضافة عقدة add node message إلى العقدة الأقرب عدديًا لمعرّف عقدة الانضمام، كما هو موضح في الشكل الآتي. تتعرّف العقدة الجديدة على العقد الأخرى ذات البادئة المشتركة من خلال عملية التوجيه، وتستطيع بدء ملء جدول التوجيه الخاص بها. تمتلك العقد الحالية أيضًا بمرور الوقت وانضمام العقد الإضافية إلى شبكة التراكب، خيارَ تضمين معلوماتٍ حول العقدة المنضمَّة حديثًا في جداول التوجيه الخاصة بها، حيث تقوم بذلك عندما تضيف العقدة الجديدة بادئةً أطول مما هو موجود حاليًا في جداولها. كما تتبادل العقد الجيران في مجموعات الأوراق جداول التوجيه مع بعضها بعضًا، مما يعني أنه بمرور الوقت تنتشر معلومات التوجيه عبر شبكة التراكب.
من المُلاحظ أن شبكات التراكب المهيكلة توفر حدًا محتمَلًا لعدد قفزات التوجيه المطلوبة لتحديد موقع كائنٍ معين، لكن عدد القفزات في آلية Pastry محددٌ بالقيمة log<sub>16</sub>N
، حيث تمثل N
عدد العقد في شبكة التراكب. قد تساهم كل قفزةٍ في تأخيرٍ كبير، لأن كل عقدةٍ وسيطة قد تكون في موقعٍ عشوائيٍ على الإنترنت، وقد تكون كل عقدةٍ في قارةٍ مختلفة في أسوأ الأحوال. التأخير المتوقَع لكل قفزة هو متوسط التأخير بين جميع أزواج العقد في الإنترنت في شبكة تراكبٍ عالمية باستخدام الخوارزمية كما هو موضح أعلاه، ولكن يمكن فعل شيءٍ أفضل بكثير عمليًا؛ حيث تكمن الفكرة في اختيار كل مدخلةٍ في جدول التوجيه بحيث تشير إلى عقدةٍ قريبةٍ في الشبكة الفيزيائية الأساسية، من بين جميع العقد ذات بادئة المعرّف المناسبة للمدخلة. اتضح أن فعل ذلك يؤدي إلى تأخيراتٍ في التوجيه من طرفٍ إلى طرف بمعامل تأثيرٍ صغير من إجمالي التأخير بين عقدة المصدر والوجهة.
أخيرًا، ركّزت المناقشة حتى الآن على المشكلة العامة المتمثلة في تحديد موقع الكائنات في شبكة ندٍ لند، حيث يمكن بناء خدماتٍ مختلفة بالنظر إلى مثل هذه البنية التحتية للتوجيه. قد تستخدم خدمة مشاركة الملفات أسماء الملفات مثل أسماء كائنات، حيث يجب أولًا تطبيق تعميةٍ على اسم ملفٍ لتحديد موقعه في معرّف الكائن المقابل ثم توجيه رسالة تحديد موقع إلى هذا المعرّف. وقد ينسخ النظام أيضًا كل ملفٍ عبر عقدٍ متعددةٍ لتحسين التوافرية، وتتمثل أحد الطرق لتحقيق ذلك بتخزين عدة نُسخٍ على مجموعة أوراق العقدة التي يُوجَّه إليها ملفٌ معين.
ضع في بالك أنه على الرغم من أن هذه العقد هي جيران في حيز المعرّفات، فيُحتمَل أن توزَّع فعليًا عبر الإنترنت، وبالتالي فإن انقطاع التيار الكهربائي في مدينةٍ بأكملها قد يؤدي إلى إزالة النسخ المتماثلة القريبة فعليًا من ملفٍ في نظام ملفاتٍ تقليدي، لكن يمكن أن تنجو نسخةً متماثلةً واحدةً أو أكثر من هذا الفشل في شبكة ند لند. يمكن أيضًا إنشاء خدمات أخرى غير مشاركة الملفات على جداول التعمية الموزعة. فمثلًا من أجل تطبيقات البث المتعدد وبدلًا من إنشاء شجرة متعددة البث من شبكة، يمكن إنشاء الشجرة من أضلاع شبكة التراكب المهيكلة، ويؤدي ذلك إلى استهلاك تكلفة إنشاء شبكة التراكب وصيانتها عبر العديد من التطبيقات ومجموعات البث المتعدد.
ترجمة -وبتصرّف- للقسم Overlay Networks من فصل Applications من كتاب Computer Networks: A Systems Approach.
أفضل التعليقات
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.