المحتويات


مقدمة عن شبكات الند للند

شبكات الند للند، هي نوع من النُظم الموزّعة (distributed systems) تكون فيه الأنداد(peers) -أوما يسمى بالعُقد في علم الشبكات- تعمل سويًا دون أي خادم مركزي يُنظّمها.

في شبكات الند-للند، الشبكة هي الخدمة

في التطبيقات الاعتيادية: خادم-عميل، وكما هو معتاد يقدّم الخادم الخدمة إلى العميل، فيستهلك العميل الخدمة، لكن في شبكات الند-للند، كُل ندّ يُقدّم ويستهلك الخدمة، بالإمكان القول أن “الشبكة هي الخدمة”.

شبكات ندّ-للندّ موجودة، وتقنيات الند-للندّ

هُناك العديد من شبكات الند للند الموجودة والفعّالة، وأيضًا العديد من تقنيات الند للند، فمثلًا في الشبكات هناك: BitTorrent, LimeWire, Kazar,Skype,Joost,Hamachi ، وغيرها، وبالنسبة للتقنيات فهناك: JXTA, Jini, OpenP2P وغيرها.

كُلٌ من هذه الشبكات والتقنيات لديها أغراضها وحزمها التقنيّة الخاصة، بعضها مفتوح المصدر، والآخر لا، بعضها مصممة للشبكات ذات النطاق العالمي(Global Scale) والآخر للمجموعات الصغيرة.

شبكات الند-للند ذات النطاق العالمي

في هذا الدرس، سنركّز على شبكات الند-للند ذات النطاق العالمي، أي كيف نستطيع أن نجمع ملايين من الأنداد ونجعلهم يعملون سويًا دون أي خادم مركزي، لأن تقنيات شبكات الند-للند ذات النطاق العالمي بالإمكان استعمالها أيضًا للمجموعات الصغيرة، لكن العكس ليس صحيح دائمًا، فتقنيات الشبكات الصغيرة ليست جيدة للشبكات ذات النطاق العالمي.

سنقوم بتغطية كلًا من الجانب النظري(P2P Theory)، والعملي(Practical P2P Network Implementation) على قدر ما نستطيع، ومع ذلك هو موضوعٌ واسع، لذلك سأقوم بتقسيم الموضوع إلى عدّة أقسام ثانوية.

الجزء النظري، سيكون مبنيًا على خوازرميات شبكات الند للند، هي: Pastry, Tapestry, Chord, Kademlia، بإمكانك القراءة عنها في ويكيبيديا إن رغبت في معلومات أكثر عنها.

شبكة الند-للند غير المُنظمة

إن التحدي في تصميم شبكة ند-للند-البرمجيّة التي تسيّر عملها- هو:كيف نقوم بجعل الأنداد يتّصلون ببعضهم البعض، خذ نظرةً على المخطط أدناه، الذي يوضّح شبكةً غير منظمة، كُل الأنداد متّصلون بالانترنت، لكن كيف يعرفون أي عنوان هو عنوان الندّ الآخر؟ وكيف يتأكد الندّ بأنه يتّصل بالندّ الصحيح؟

شبكة ند-للند غير مُنظمة

كحلٍ لجعل الأنداد في الشبكة يتواصلون ببعضهم البعض بشكلٍ سليم، عليك أن تحل مشكلتين:

  1. تمييّز هويّة الند.
  2. معرفة موقع الند.

معرفة هوية الند، المُراد بها هو القدرة على تمييز كُل ندٍ عن الآخر، فما دام أن هُناك الملايين من الأنداد متصّلين عل ذات الشبكة، أنت بحاجة إلى أن تكون قادرًا على التعامل مع كُل ندٍ على حدة، وكحلٍ لهذا سنقوم بإعطاء كُل نِد رمزًا عالميًا فريدًا (Globally Unique ID) سنرمز له اختصارًا بـ”GUID” أو “رمز الهويّة العالميّ”، وسنأتي لاحقًا على كيف ينبغي أن يكون هذا الرمز.

أما تحديد موقع الأنداد، يُقصد به إيجاد الند الحامل لرمز هويّة عالمي GUID معيّن على الشبكة، ومع احتمال وجود ملايين من الأنداد على الشبكة، الند لن يكون قادرًا على الاستمرار في أن يكون على معرفة تامّة بقائمة جميع الأنداد في الشبكة، فالأنداد يدخلون إلى الشبكة ويخرجون منها طوال الوقت، فإذا كان يجب على كُل الأنداد معرفة بعضهم البعض، تصوّر عدد الرسائل التي يجب أن يرسلوها لبعضهم البعض حتى يكون الجميع على إطلاعٍ تام بقائمة الأنداد على الشبكة!، سيكون الأمر مستحيلًا إلى حدٍ كبير.

وكحلٍ لهذا فبدلًا من الاحتفاظ بقائمة جميع الأنداد على الشبكة، كُل ند سيحتفظ بـ”جدول التوجيه”(routing table) يحتوي على مجموعة جزئيّة من قائمة الأنداد على الشبكة، وسنأتي في شرح ماهيّته وطريقة عمله لاحقًا.

رمز الهويّة العالميّ

المرحلة الثانية من إنشاء شبكة ند-للند، هي القيام بإعطاء رمز الهويّة العالمي GUID إلى كُل نِدٍ في الشبكة، هذا الرمز يُستخدم لتحديد هويّة أي نِد في الشبكة، فبواسطته تعرف الندّ الذي تتواصل معه، وأيضًا يُستخدم حين البحث عن الأنداد، وسنأتي على ذكر هذا لاحقًا.

هذا المخطط يصف مرحلة رمز الهويّة العالمي GUID :

شبكة ند-للند، حينما يكون كُل ند قد أٌسند إليه رمز هويّة عالمي.

شبكة ند-للند، حينما يكون كُل ند قد أٌسند إليه رمز هويّة عالمي.

تركيبة رمز الهويّة العالمي GUID

رمز الهويّة العالمي، في العادة يتكوّن من سلسلة بت نصيّة، على سبيل المثال 64 أو 128 بت.

إعطاء رمز الهويّة العالمي.

قد تتساءل، كيف يتم إعطاء رمز الهويّة العالمي إلى نِدّ بينما لا يوجد أي خادم مركزي؟، حسنًا، هُناك طريقتان لفعل هذا:

  1. يقوم الأنداد بصنع رمز الهويّة بأنفسهم.
  2. يُعطى الأنداد رمز الهويّة العالمي حينما يقومون بالانضمام إلى الشبكة.

إذا قام الأنداد بصنع رمز الهويّة العالمي الخاص بهم، فأنت تخاطر بأن يقوم ندّان بصنع ذات الرمز، حتى لو قُمت بإنشاء خوارزمية ذكيّة لصنع الرمز، فلا يزال بإمكان أحد الأنداد الخِداع وانتحال رمز ندٍ آخر في الشبكة، وهذا أمر لا يتطلّب ذكاءً.

والحل الآخر هو إعطاء الندّ الرمز حينما يقوم بالانضمام إلى الشبكة، لذلك فعلى الند الذي خارج الشبكة الاتصال على الأقل بندٍ واحد داخل الشبكة لينضمّ إلى الشبكة، وحينها يقوم الند الذي تم الاتصال به بتوليد رمز الهويّة العالمي للندّ الجديد.

رغم هذا، قد يحاول الند الذي انضمّ حديثًا استخدام رمز هويّة عالمي لأنداد آخرين على الشبكة، سنتطرّق للمشاكل الأمنيّة في شبكات الند للند في مقالات لاحقة، الآن دعونا نعتبر أنه لا يوجد أنداد ضارّون ينضمّون للشبكة.

حلقة هويّة الأنداد

المرحلة الثالثة من إنشاء شبكة ند-للند هي القيام بتنظيم الأنداد في “حلقة خيالية”، بناءً على رمز هويّتهم العالمي، الأنداد الذين رمز هويّتهم العالمي قريب، يتم وضعهم بجانب بعضهم البعض في هذه الحلقة، وسآتي على معنى “القرب” لاحقًا.

حلقة هويّة خيالية لشبكة ند-للند

حلقة هويّة خياليّة لشبكة ند-للند

يعرض المخطط أعلاه 16 ندّ منظّمين بداخل حلقة، بناءً على رموز هويّتهم، المخطط التالي أكثر تجريدًا لكنه أكثر وضوحًا، سنستخدم هذه المخططات لشرح بقيّة أساسيات شبكة الند-للند.

ضع في الاعتبار، أن الأنداد ليس لديها بعد أي اتصال أومعلومات عن بعضها البعض، لديهم فقط رمز الهويّة الخاص بهم، سنرى لاحقًا كيف تُقلع (boots) شبكة ند-للند من ندٍ واحد إلى n من الأنداد.

الموقع الخيالي، ليس هو الموقع الجغرافي

تنظيم الأنداد داخل حلقة هو تنظيمٌ منطقي (خيالي)، فندّان قريبان جدًا من بعضهما البعض بناءً على رمز الهويّة، بالإمكان أن يكونان في مكانين مختلفين في العالم جغرافيًا، وهكذا فالموقع الخيالي ليس هو الموقع الجغرافي.

جدول توجيه الند

الندّ، في شبكات الندّ للند ييحتاج لأن يكون قابلًا للتواصل مع بقيّة الأنداد في الشبكة، ولتمكين هذا الأمر، في البدئ يجبُ أن يستطيع إيجاد الأنداد الآخرين في الشبكة، ولهذا فكل ندٍ في الشبكة لديه “جدول توجيه”، وجدول التوجيه يحتوي على ما يُشيرُ إلى عددٍ من الأنداد في الشبكة.

هُناك الملايين من الأنداد في شبكات الند للند، ولا يتسطيع كُل ند أن يمتلك جدولًا يحوي كافة الأنداد في الشبكة، وكما أن الجدول يستهلك الكثير من الموارد، فسيكون كذلك من شبه المستحيل تحديثه باستمرار حينما ينضمّ ويخرج الأنداد من الشبكة، لذلك وبدلًا من هذا سيحتوي جدول توجيه الند على ما يُشير إلى مجموعة جزئية من الأنداد في الشبكة، ويعتمد تنظيم جدول التوجيه بناءً على خوارزمية الشبكة، وسنتناول هُنا كيف تقوم كلًا من Chord و Kademlia بتنظيم هذا الجدول، حيث أرى أن هذين النظامين أكثر أناقةً -بقليلٍ- من Pasty و Tapesetry .

في الحقيقة، هُناك اختلاف بسيط جدًا بين هذين النظامين وجداول توجيهها، لكن المبادئ العامة جدًا متشابهة، يكمن الاختلاف في تفسير “رمز الهوية العالمي GUID”، وأيضًا ما يسمى بـ”دالة المسافة لرمز الهوية العالمي GUID “.

المسافة المرجعيّة الأسية لرمز الهويّة العالمي

كما أشرنا في الأعلى، كُل ندٍ يُشيرُ فقط إلى مجموعة جزئيّة من مجموعة كل الأنداد في جدول التوجيه الخاص به، تتألف الإشارة إلى ندٍ من: رمز هويّته العالمي، وعنوان IP الخاص به، ورقم منفذ الاتصال، حتى يتم الاتصال به.

وكأكثر رسمية، العناصر في جدول توجيه الند هي عناصر بيانيّة(Data Elements) من هذا النوع:

(GUID, IP Address, TCP Port)

يختارُ الندّ أيٌ من الأنداد الآخرين يريدُ الإشارة إليه بناءً على المسافة بين رمز هويّته ورمز هويّة الآخر المُشار إليه.

جدولُ التوجيه لديه عدد الخلايا نفسه الموجود في عدد البتّات في رمز الهويّة العالمي، وهكذا إذا كان رمز الهويّة العالمي يتكوّن من 64 بت، فسيكون هُناك 64 خليّة في جدول التوجيه، وبالتالي فـ 64 بت “مساحة رمز الهوية العالمي” تُمكننا من الاحتفاظ بـ رمز هويّة عالمي إجمالًا، وكُل ندٍ بحاجة إلى جدول توجيه مكوّن من 64 خليّة.

كُل خليّة في جدول التوجيه تحتوي على عنوان لرمز هويّة عالمي يبعد عن مالك الجدول، حيث تبدأ من صفر إلى عدد بتّات رمز الهويّة العالمي، كُلٌ من عنوان IP ورقم منفذ الاتصال يتم حفظها أيضًا، بهذا يكون الاتصال مع صاحب ذلك العنوان ممكنًا.

وكمثالٍ على هذا، إذا كانت المَسافة مُعرفة كـ(حاصل طرح القِيَم العددية في رمز الهويّة العالمي من بعضها البعض)، ويكون رمز الهويّة العالمي مكونًا من 4 بتّات(= 16 ندٍ كحدٍ أقصى = )، فسيكون جدول توجيه الند رقم 0 كالآتي:

رقم الخليّة عنوان الهويّة العالمي مسافة رمز الهويّة العالمي
0 1 1()
1 2 2()
2 4 4()
3 8 8()

وإذا ما حدث وأن كان الند صاحب المسافة غير متصلًا بالشبكة، سيتم حفظ الند صاحب رمز الهويّة الذي يليه بدلًا عنه، فمثلًا في جدولنا أعلاه، إذا كان الند صاحب رمز الهويّة العالمي 8 ليس متصلًا، ستكون الخليّة رقم 3 التي مسافتها = 8 ، محتويةً على بيانات الند الذي رقم هويّته 9، وإذا كان 9 غير متصلٍ أيضًا، ستحتوي على بيانات الند الذي رقم هويّته 10 وهكذا.

يُمثّل الجدول أعلاه بالشكل الآتي:

جدول توجيه في شبكة ند للند

تخيّل الآن أن كُل ندٍ يمتلك جدولًا شبيهًا بهذا، فمثلًا هذا تمثيل لجدول توجيه الند رقم 0 بالإضافة إلى رقم 9 :

جدول توجيه ندّين

مسافة رمز الهوية العالمي

رُبما كُنت تتساءل عن كيفية حساب المسافة بين رمزيّ هويّة؟

المسافة بين رمزيّ هويّة هي قيمة عددية تُحسب، وليست بناءً على الموقع الجغرافي، لذلك هُناك عدّة طرق لحسابها، سنقوم تاليًا بشرح طريقتيّ كُلٍ من Chord و Kademlia .

دالة Chord لحساب المسافة

تقوم Chord ببحساب المسافة بين ندّين عن طريق طرح رمزيّ هويّتهما من بعضهما البعض، ولقد تمّ تحديد مساحة رمز الهويّة لـ”طوي” هذه العمليّة، أي أنه عندما تكون مساحته 4 بتّات(أي من 0 إلى 15 ندًا)، تكون المسافة من الند رقم 15 إلى الند رقم 0 تساوي 1 ، والمسافة من الند رقم 15 إلى 1 تساوي 2 ، وما بين الند رقم 0 إلى الند رقم 15 تساوي 15 ، وكما لاحظت فالعمليّة ليست عكسيّةـ فالمسافة من A إلى B لا تساوي المسافة من B إلى A .

وكتعريفٍ واضحٍ مجمل، تُعرف دالة Chord لحساب المسافة كالآتي:

$$ Distance(A,B )= B-A \space \iff \space B\geq A $$
$$ Distance(A,B )= B-A+2^N \space \iff \space B < A $$

وإجمالًا:

$$ Distance(A,B) = (B-A+2^N) \space mod\space 2^N $$

مثال:

$$ Distance(0,11 )= (11- 0 + 16 )\space mod\space16 \space = (27)\space mod \space16 = 11 $$
$$ Distance(11,0)= (0-11+16)\space mod\space 16 = (5)\space mod\space 16 = 5 $$

وكما هو ظاهرٌ:

$$ Distance(A,B) \neq Distance(B,A) $$

دالة Kademlia لحساب المسافة

تستخدم طريقةُ Kademlia العمليّة الثنائية: كدالة لحساب المسافة، فببساطة المسافة بين رمزيّ هوية، هو تطبيق هذه العملية عليهما، وكتعريفٍ واضحٍ مجمل:

$$ Distance(A,B)=\space A \space \oplus B $$

حيث هي XOR . مثال:

$$ 0000 \space \oplus 1111 = \space 1111 $$
$$ 0110 \oplus 1010 \space = \space 1100 $$

لهذه الطريقة خاصيّة مميزة، حيثُ أن ناتج هذه العملية بالنسبة لرقم ما لا يمكن أن ينتج من رقمين مختلفين، أي أنه وبعبارةٍ أخرى، لو أتينا برقمين مختلفين ، وقُمنا بتطبيق هذه العملية بالنسبة لـ ، فسيكون:

$$ A \oplus B \neq A\oplus C $$

وهذه الخاصيّة مفيدةٌ جدًا في حساب المسافة الفريدة بين رموز الهويّة، وبالإضافة إلى هذا، لديها ميزةٌ أخرى:

$$ A \oplus B = B \oplus A $$

وهذا يعني، أن المسافة من إلى ، هي ذاتها المسافة من إلى ، وهذا لا يتحقق في عملية الطرح المُستخدمة في Chord .

مقارنة بين جدوليّ توجيه Chord و Kademlia

ومن بابِ الاهتمام، سنقوم بالمقارنة بين الجدولين، بناءً على أن مساحة رمز الهويّة هي 4 بتّات، سنرى كيف سيبدو تأثير دالة حساب المسافة واضحًا، بطريقة Kademilla مرةً، وب Chord مرةً أخرى.

كُل صفٍ في الجدولين أدناه، يبتدئ برمز الهويّة العالمي (GUID) للندِّ باللون الغامق، ومن ثم مُحتوى جدول التوجيه الخاص به.

Chord

رقم الهويّة
0 1 2 4 81
1 2 3 5 9
2 3 4 6 10
3 4 5 7 11
4 5 6 8 12
5 6 7 9 13
6 7 8 10 14
7 8 9 11 15
8 9 10 12 0
9 10 11 13 1
10 11 12 14 2
11 12 13 15 3
12 13 14 0 4
13 14 15 1 5
14 15 16 2 6
15 0 1 3 7

Kademilla

رقم الهويّة
0 1 2 4 8
1 0 3 5 9
2 3 0 4 10
3 2 1 7 11
4 5 6 0 12
5 4 7 1 13
6 7 4 2 14
7 6 5 3 15
8 9 10 12 0
9 8 11 13 1
10 11 12 14 2
11 10 9 15 3
12 13 14 8 4
13 12 15 9 5
14 15 12 10 6
15 14 13 11 7

المُخططات أدناه تُمثل جدول توجيه الأنداد ذات رقم الهوية 2,4,8,12 باستخدام كُلٍ من Chord و Kademlia ، بعض الأسهم مركّبة فوق بعضها البعض، بسبب أن الأنداد تُشير إلى بعضها البعض، إلى نظرت إلى رؤوس هذه الأسهم سترى إذا ما كان في اتجاهٍ واحد أم في اتجاهين.

Chord

جدول توجيه باستخدام Chord

Kademlia

جدول توجيه باستخدام Kademlia

مما تجدرُ الإشارة إليه، أن الإشارة في Kademlia متناظرة، فإذا كان يُشير إلى ، فـ يشير إلى أيضًا، ولا يتحقق هذا دائمًا في Chord، وبسبب التناظر، من الممكن أن نصف الإشارة بين ندّين بخطٍ مستقيم بدلًا من الأسهم ورؤوسها، لأنه دائمًا هُناك إشارة في اتجاهين.

ويبدو تناظر الإشارة واضحًا في المخططين أدناه، اللذان يمثّلان جدول توجيهٍ الأنداد ذات رقم الهوية 0,1,2,3 .

Chord

Chord

Kademlia

Kademlia

مزايا Kademlia

لـ Kademlia مزايا تتفوق فيها على Chord :

  • دالة Kademlia لحساب المسافة (XOR Distance) يسهل حسابها.
  • جدول توجيه Kademlia يمنح سهولة أكبرقليلًا في إدارة جداول التوجيه.

حساب المسافة

دالة Kadmila لحساب المسافة أسهل في الحساب من دالة Chord (التي تستخدم الطرح، وبواقي القسمة)، خصوصًا عندما لا يناسب رمز الهوية العالمي نسخة واحدة من أنواع البيانات في لغة البرمجة المستخدمة(كنسخة واحدة من Long, أو int, أو short ..الخ).

فمثلًا، لو كان رقم الهوية العالمي يبلغ طوله 128 بتًا، في لغة جافا(Java) سيكون عليك استخدام متغيّرين من نوع Long ، والآن سيكون عليك طرح 2x2 (2 = متغيرين من نوع Long) متغيرات من نوع Longs من بعضهما البعض، وبعد إضافة ، ستحتاج إلى ما المزيد من Long لتحفظ النتيجة حتى تستخدم عليها عملية .

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

جدول التوجيه

حينما ينظمّ ند إلى الشبكة، ستعيّن عليه إنشاء جدول التوجيه الخاص به ضمن أولى الإجراءات التي عليه القيام بها، ثم عليه أن يُخطر (Notify) جميع الأنداد في الشبكة الذين يجب عليهم أن يشيروا إليه، ليتمكّنوا من تحديث جداولهم.

في شبكة Kademlia ، الأنداد الذين يشير إليهم الند الجديد، هم ذاتهم الأنداد الذين يجب إخطارهم، بينما في Chord الأنداد الذين يشير إليهم الند الجديد ليسوا ذاتهم الأنداد الذين يجب إخطارهم، كلا المجموعتين يجب إيجادهم وإخطارهم على حدة، لهذا الانضمام إلى شبكة Kademlia أسهل بكثير من Chord .

وكذلك الأمر في حالة الخروج من الشبكة، الند الذي سيقوم بالخروج يجب عليه إخطار جميع الأنداد الذين يشيرون إليه، وبهذا يقوم هؤلاء الأنداد بحذفه من حدول توجيههم، والبدئ في البحث عن بديل، في شبكة Kademlia الند الذي يهمّ بالخروج يحتوي جدول توجيهه على قائمة كاملة من الأنداد الذين يشيرون إليه(إذا كان جدول توجيهه محدثًا بنسبة 100%)، وبهذا يقوم هذا الند فقط بالمرور على جدول توجيهه وإرسالة رسالة الخروج إلى جميع هؤلاء الأنداد، لكن الأمر ليس كذلك في Chord ، فجدول توجيه الند الذي يهم بالخروج لا يحتوي على قائمة كاملة بالأنداد الذين يشيرون إليه، لهذا يتوجّب عليه إيجاد جميع هؤلاء الأنداد ندًا تلو ند، ثم إرسال رسالة الخروج، وبالطبع عملية إيجاد الأنداد ندًا بند أبطأ بكثير مما يحصل في عملية Kademlia المباشرة.

وسنأتي على ذكر إدارة جداول التوجيه في الأجزاء القادمة.

إيجاد الأنداد في شبكات الند للند

في شبكات الند للند يجب أن يكون التواصل المباشر ممكنًا مع أي ندٍ في الشبكة، وبالطبع بإمكان الند بسهولة التواصل مباشرةً مع أي ندٍ لديه في جدول توجيهه، لكن ماذا عن الأنداد الذين ليسوا في جدول التوجيه؟ هؤلاء الأنداد يجب إيجادهم في البداية قبل أن التواصل معهم.

إيجاد ندٍ في شبكة ند-للند يتم باستخدام جداول توجيه الأنداد، وفق العملية التالية:

  1. إيجاد أقرب ندٍ (وفقًا لرمز الهوية العالمي GUID) للند المُراد الوصول إليه في جدول التوجيه.
  2. إذا كان هذا الند القريب ليس هو الند المراد، اتصل بأقرب ندٍ واسأل عن أقرب ندٍ للند المُراد.
  3. إذا كان الند الذي أعطانا إياه الند الذي تواصلنا معه ليس هو المراد، قم بتكرار الخطوة رقم 2.

هذه العملية يمثّلها المخطط أدناه، المخطط يستخدم نظام Kademilla ، لكن المفهوم ذاته ينطبق على الـ Chord أيضًا.

Kademlia Find Peer

  • يحاول الند رقم 0 إيجاد الند رقم 15 الذي لا يمتلك عنوانه
  • يأخذ الند رقم 0 نظرة على جدول توجيهه، أقرب ندٍ إلى الند رقم 15 في جدول توجيهه هو الند رقم 8.
  • يطلب الند رقم 0 من الند رقم 8 إيجاد أقرب ندٍ إلى الند رقم 15، وأقرب ندٍ إلى الند رقم 15 في جدول توجيه الند رقم 8 هو الند رقم 12، لهذا يعيد الند رقم 8 عنوان الند رقم 12 .
  • يطلب الند رقم 0 من الند رقم 12 أقرب ندٍ للند رقم 15، وأقرب ندٍ إلى الند رقم 15 في جدول توجيه الند رقم 12 هو الند رقم 14، لهذا يعيد الند رقم 12 عنوان الند رقم 14.
  • يطلب الند رقم 0 من الند رقم 14 أقرب ندٍ للند رقم 15، والند رقم 14 لديه عنوان الند رقم 15، لهذا يعيد الند رقم 14 عنوان الند رقم 15 للند رقم 0.
  • الند رقم 0 لديه الآن عنوان الند رقم 15.

إذا لم يكن الند رقم 15 موجودًا في الشبكة، يعيد الند رقم 14 عنوان أقرب ندٍ يعرفه للند رقم 15، والذي هو 14 نفسه، وعندما يعيد الند رقم 14 عنوانه، يعرف الند رقم 0 أنه لا يمكنه الاقتراب أكثر من الند رقم 15، وأن الند رقم 15 غير موجود.

المخطط الآتي يمثّل هذه العملية:

Lookup

وهنا pseudo code للعملية:

targetPeer      = 14;     // or some other number.
closestPeer     = routingTable.findClosest(targetGUID);
prevClosestPeer = null;

    
while(    closestPeer != targetPeer
       && closestPeer != prevClosestPeer ) {
    
    prevClosestPeer = closestPeer;
    closestPeer     = askForClosestPeer(closestPeer, targetPeer);
}

if(closestPeer == targetPeer) {
      // found
} else {
      // not found, closestPeer = prevClosestPeer
}

سرعة الإيجاد اللوغاريثمية

إذا نظرت إلى المخطط السهمي أعلاه، ستعرف أنه في كل مرة تنقص المسافة بين الند 0 والند 15 بمقدار النصف، ففي البداية كانت المسافة 15، ثم بعد إيجاد الند رقم 8 في جدول التوجيه أصبحت المسافة 7(15-8)، وبعد الاتصال بالند رقم 8 والحصول على عنوان الند رقم 12 أصبحت المسافة 3 (15-12)، ثم بعد الحصول على عنوان الند رقم 14 أصبحت المسافة 1 (15-14).

هذه السرعة الرهيبة في إيجاد الأنداد ناتجة عن المسافة الأسيّة للأنداد المحفوظة في جداول توجيهها، هذه السرعة هي باستخدام الـ ، كالآتي:

$$ O(log(n) ) \ni \space n =Number\space of Nodes $$

وكمثالٍ على هذا، إذا كانت الشبكة تستخدم 64 بتًا لرمز الهويّة العالمي، وهذا يمتلك مساحة لـ ندًا، فيكون بالإمكان إيجاد أي ندٍ في أسوأ الأحوال

خلال: خطوة، وإذا قمت بزيادة عدد الأنداد في الشبكة إلى ففي أسوأ الأحوال ستزيد خطوة واحدة فقط لإيجاد أي ند، أي خطوة فقط.

بلغةٍ أخرى، كلما زاد تتضخّم سرعة الإيجاد بمعدّل ، هذا يعني أن سرعة الإيجاد تتمدد بشكلٍ جيد، حتى لو كانت الشبكة كبيرة جدًا.

التكوين والانضمام في شبكات الند للند

لحدّ الآن، لم نمر على كيفية إدارة الأنداد لجداول توجيههم، وكيف يرتبط الأنداد ببعضهم البعض، لذلك ففي هذه الجزئية سنوضّح كيف تتكّون شبكات الند للند.

تبدأ شبكات الند للند بالتكوّن عبر ندٍ واحد، سنطلق عليه اسم:”ند التكوين”، ولا يشترط أن يكون هذا الند هو الند المكوّن دائمًا، لكن عندما تبتدئ الشبكة بالتكوّن لأول مرة، أحد الأنداد لابد أن يكون هو الند المكون.

حينما يبدأ الند المكوّن بالعمل، يستطيع الأنداد الآخرون الانضمام إلى الشبكة، وبهذا يكونون على اتّصال، هذه العملية تدعى عملية “تكوين” الشبكة، وعملية التكوّن هذه تتضمّن العديد من الأنداد الذين يرغبون في الانضمام للشبكة عن طريق ند التكوين، وهذه هي إجراءات الانضمام:

  1. يرسل الند الذي يرغب في الانضمام طلب “انضمام” إلى ند التكوين، ويحصل في المقابل على رمز الهوية العالمي الخاص به.
  2. يرسل الند الذي يرغب في الانضمام طلب “نسخة من جدول التوجيه” إلى ند التكوين.
  3. يبحث الند الذي انضم إلى الشبكة عن الأنداد الذين يجب أن يكونوا في جدول توجيهه.

طلب الانضمام

أول ندٍ(سوى ند التكوين بطبيعة الحال) سيقوم بالانضمام إلى الشبكة عن طريق إرسال رسالة انضمام إلى ند التكوين، سيرد ند التكوين برقم الهويّة العالمي الخاص بالند الجديد، هذا تمثيلٌ للعملية:

Joing Peer

طلب نسخة من جدول التوجيه

بعد الحصول على رمز الهوية، يطلب الند المُنضم نسخة من جدول التوجيه الخاص بند التكوين، هذا تمثيلٌ للعملية:

Copy Routing Table  Request

إيجاد الأنداد من أجل بناء جدول التوجيه

بعد الحصول على نسخة من جدول التوجيه ند التكوين، وباستخدام هذا الجدول يبدأ الند المُنضم بالبحث عن الأنداد الآخرين الذين فعلًا يجب أن يكونوا في جدول توجيهه، تذكّر أن الند لابد أن يحفظ في جدول توجيهه عناوين أولئك الأنداد الذين يبعدون مسافة معيّنة عن رقم الهويّة الخاص به، لهذا فجدول التوجيه الذي حصلنا عليه من ند التكوين صحيحٌ بالنسبة لرمز هويّة ند التكوين، لكنه ليس صحيحًا لرمز هويّة الند المُنضم.

المخطط التالي يمثّل عملية إيجاد الأنداد وتحديث جدول التوجيه:

Find and Updating

إذا كان الند المُنضم هو أول ندٍ في الشبكة بعد ند التكوين، فجدول التوجيه الذي سيأخذه من ند التكوين لا يحتوي إلا على عنوانه هو نفسه(أي عنوان الند المنضم)، لهذا سيتم تخطّي عمليّة إيجاد الأنداد، لأنه لا يوجد أنداد أصلًا سواه وند التكوين.

الخروج من شبكات الند للند

حينما يقرر ندٌ ما الخروج من الشبكة، سيُرسل رسالة “خروج” إلى جميع الأنداد في جدول توجيهه، حينها يقوم هؤلاء الأنداد بحذفه من جداولهم،و ما إن يتم إرسال هذه الرسالة، يمكن للند الخروج بشكلٍ آمن من الشبكة.

Chord مقابل Kademlia

كما ذكرنا في جدول توجيه الند أن هُناك اختلافًا بين Chord و Kademlia في أي من الأنداد يجب على الند أن يحتفظ بهم في جدوله، ففي Kademlia كل يكون الارتباط في اتجاهين، إذا كان يحتفظ بعنوان ، فإن أيضًا يحتفظ بعنوان ، هذا يعني أن كل الأنداد في جدول يجب إخطارهم حين يريد الخروج، بينما في Chord، إذا كان يحتفظ بعنوان بـ هذا لا يقتضي بالضرورة أن يحتفظ بعنوان ، لهذا إذا أراد أن يخرج في شبكة Chord عليه أولًا أن يجد جميع الأعداد الذين يحتفظون بعنوانه في جدول توجيههم، بصيغةٍ أخرى: عليه أن يجد الأنداد الذين يجعلون: أقرب ما تكون إلى , , .. الخ، وما إن يجد الأنداد هؤلاء عليه أن يرسل رسالة الخروج إليهم.

وكما تخيّلت، إيجاد من الأنداد وإرسال رسالة خروجٍ لهم في(Chord) أكثر بطئًا من إرسال رسالة الخروج مباشرةً إلى الأنداد الموجودين لديك في جدول التوجيه.

إدارة جدول التوجيه

في عالمٍ مثالي، طلبات الانضمام والخروج ستكون كافية لجعل جداول توجيه الأنداد محدّثةً باستمرار، لكن في العالم الحقيقي الأنداد والشبكة قد يتوقفون عن الاتصال فجأة(Crash) من وقتٍ لآخر، فيخرج الأنداد دون إرسال رسالة الخروج.

وكحلٍ لهذا، كُل ندٍ في الشبكة عليه أن يعيد البحث عن الأنداد الذين يجب أن يكونوا في جدول توجيهه، فإذا تواصل مع ندٍ ولم يتلقّى استجابة، عليه أن يقوم بحذف هذا الند من جدول توجيهه، والأمرُ نفسه إن كان هناك ندٌ أقربُ من ندٍ حالٍ في خليّة معينة من الجدول دخل إلى الشبكة دون أن يخطر هذا الند بتحديث جدوله، سيتم إيجاده باستخدام عمليّة البحث المتكرر، وبالتالي يُضاف إلى جدول التوجيه.

يُمثل الشكل الآتي ندًا يقوم الاتصال بالأنداد في جدول توجيهه، الند رقم 4 قد فقد الاتصال فجأة، بهذا يكون على الند رقم 0 حذفه من جدول توجيهه.

سمثّل لحالة مختلفة، لنفرض أن الند رقم 8 لم يكن متصلًا حينما كان الند رقم 0 يقوم ببناء جدول توجيهه لأول مرة، فبدلًا من الاحتفاظ بعنوان الند رقم 8 احفتظ بعنوان الند رقم 9، وفيما بعد قام الند رقم 8 بالانضمام إلى الشبكة لكنه شكلٍ أو بآخر لم يخطر الند رقم 0، الآن حينما يقوم الند رقم 0 بعملية البحث وتحديث جدول توجيهه، سيجد الند رقم 8، ثم سيضيفه إلى جدول التوجيه.

الرسائل في شبكات الند للند

كم رأيت في الأجزاء السابقة، يتواصل الأنداد عن طريق إرسال الرسائل إلى بعضهم البعض، هُناك 4 رسائل مختلفة نحتاجها لجعل أبسط شبكات الند للند تعمل، هي:

  • الانضمام.
  • الخروج.
  • نسخة من جدول التوجيه.
  • إيجاد الأقرب.

سنشرحُ كلًا منها على حدة:

الانضمام

ترسل رسالة الانضمام بواسطة الند الذي يريد الانضمام إلى أحد أنداد الشبكة، وسيُرَد عليه برقم هويتّه العالمي داخل الشبكة لينضمّ إليها.

الخروج

حينما يريد ندٌ ما الخروج من الشبكة، سيرسل رسالة الخروج إلى كل الأنداد الذين في جدول توجيهه، هؤلاء الأنداد بإمكانهم حذفه من جداول توجيههم.

نسخة من جدول التوجيه

تُرسل هذه الرسالة من قبل الند المنضمّ حديثًا من أجل أن يحصل على صيغة ابتدائية من جدول التوجيه يقوم باستخدامها لبناء جدول التوجيه الخاص به.

بالإمكان استخدام هذه الرسالة أيضًا في فحص الأنداد الآخرين، واختبار مدى كفاءة علميّات الانضمام والخروج وتحديث جداول التوجيه في الشبكة.

إيجاد الأقرب

تُرسل هذه الرسالة من قبل الند الذي يبحث عن ندٍ ذا رقمِ هويةٍ معيّن في الشبكة، والند الذي يتلقّى هذه الرسالة سيرد بعنوان أقرب رقم هويّة لديه في جدول التوجيه، أو عنوانه إذا كان هو أقربَ ندٍ يعرفه إلى الندّ الهدف.


خاتمة

تمّ بحمدِ الله، في التاسع من أكتوبر من عام ألفين وثمانية عشر ميلادية، الموافق التاسع والعشرين من شهرِ مُحرم لسنة ألفٍ وأربع مئة وأربعين هجريًة، وبالله التوفيق، وبه نستعين.

  • فارس.

هذه نسخة مترجمة من هذا المقال: Peer-to-Peer (P2P) Networks
وأقتبس من ردّهم على طلبي للترجمة:
“and you cannot pass on permission to anyone else to translate it again from Arabic to other languages. If you abide by these rules, go ahead :-)”