هذه هي مجموعة من المعلومات التي احتاجها لتنفيذ مرحلة تأسيس اتصال بين المشاركين في لعبة شبكة نظير إلى نظير باستخدام بروتوكول UDP.
تم تصميم المقال لمطوري اللعبة المبتدئين. حاولت كتابة مقال أود بنفسي قراءته في وقت بدأت فيه للتو بفهم هذا الموضوع: بحيث يتم جمع كل الفروق الدقيقة في مكان واحد ، لكن في الوقت نفسه لا يوجد شيء لا لزوم له ، بلغة بسيطة ، ومع الصور المرئية. ربما شخص ما سوف يأتي في متناول اليدين.
من غير المرجح أن يجد مطورو الألعاب المتمرسون أي شيء جديد لأنفسهم هنا. لكنني سأكون ممتنا للتعليقات والتعليقات.
لعبة الشبكة مع بنية الند للند
- يخزن كل لاعب حالة اللعبة بأكملها ويعالجها بشكل متزامن مع لاعبين آخرين. يقوم كل لاعب بتمرير تصرفات المستخدم إلى جميع اللاعبين الآخرين. يُطلق على اللاعب الرئيسي الذي يجمع اللاعبين الآخرين اسم الخادم والباقي عملاء. الخادم هو الرئيسي فقط في مرحلة جمع اللاعبين. وخلال اللعبة لا يوجد كمبيوتر رئيسي.
- يحتوي هذا النهج على الميزات التالية:
- لا تعتمد حركة المرور على تعقيد عالم اللعبة ، ولكن تعتمد فقط على عدد اللاعبين. في هذا الوضع ، عادة ما تعمل استراتيجيات الوقت الفعلي ، حيث تحتاج إلى معالجة آلاف الوحدات.
- حجم حركة المرور من N² ، حيث N هو عدد اللاعبين. لذلك ، ينطبق هذا النهج فقط على الألعاب التي بها عدد صغير من اللاعبين.
- نظرًا لأن البيانات يتم نقلها مباشرة بين اللاعبين بدون خادم وسيط ، فإن تأخيرات الإرسال (التأخر) تكون ضئيلة. ولكن إذا كان لدى أحد اللاعبين على الأقل مشكلات في الاتصال ، فسيؤثر ذلك على جميع اللاعبين.
- من الضروري إنشاء قنوات اتصال بين جميع اللاعبين. ولكن إذا كان اللاعبون على شبكات محلية مختلفة ، فهذا غير ممكن دائمًا.
- يمكنك استخدام TCP أو UDP لنقل البيانات في اللعبة.
- يوفر TCP (بروتوكول التحكم في الإرسال) تسليم دفق بايت موثوق. هذا يبسط تنفيذ اللعبة ، ولكن لا يوجد تحكم في تأخير نقل البيانات.
- UDP (بروتوكول مخطط بيانات المستخدم) هو بروتوكول نقل حزم بسيط دون ضمان تسليمها. ولكن بسبب بساطته ، يتم استخدام UDP في الأنظمة في الوقت الحقيقي عندما يكون من غير المقبول انتظار الحزم المتأخرة أو المفقودة. يمكن أن يؤدي استخدام UDP إلى تقليل التأخير في اللعبة ، ولكنه يعقد تنفيذ اللعبة.
توضح هذه المقالة استخدام UDP.
تأسيس اتصال على الشبكة المحلية
- لإنشاء اتصال بين اللاعبين ، يحتاج العميل إلى معرفة عنوان IP الخاص بالخادم والمنفذ الذي يستمع إليه برنامج اللعبة.
- على سبيل المثال ، لدى كمبيوتر اللاعب A عنوان IP 192.168.1.2 على الشبكة المحلية. يقوم اللاعب "أ" بتشغيل برنامج اللعبة على جهاز الكمبيوتر الخاص به في وضع الخادم ، ويستمع البرنامج إلى المنفذ 50120. يقوم اللاعب "أ" بتوصيل هذه المعلومات بطريقة ما للاعب ب.
- يحتوي جهاز الكمبيوتر الخاص بـ Player B على عنوان IP الخاص بـ 192.168.1.5 على الشبكة المحلية. يقوم Player B بإطلاق برنامج اللعبة على جهاز الكمبيوتر الخاص به في وضع العميل ، ويشغل البرنامج المنفذ 50150. يدخل اللاعب B عنوان الخادم 192.168.1.2►0120 في برنامج اللعبة ، ويرسل البرنامج طلبًا إلى الخادم على العنوان المحدد.
- الخادم في وضع الاستعداد ، وبعد تلقي طلب من المشغل B ، سيعرف عنوانه 192.168.1.5►0150. وبالتالي ، أنشأ العميل والخادم اتصالًا ويمكنهما بدء اللعبة.
- إذا كان هناك عدة عملاء متصلين بالخادم ، فيجب أن يرسل الخادم كل منهم عناوين العملاء الآخرين.
في المثال في الصورة ، يرسل الخادم A إلى العميل B عنوان العميل C (192.168.1.6►0160) ، ويرسل العميل C عنوان العميل B (192.168.1.5►0150). وبالتالي ، سيتمكن جميع اللاعبين من إقامة اتصالات "مع كل منهم".
- في كل مرة تبدأ اللعبة ، يمكن للخادم طلب أي منفذ مجاني من نظام التشغيل. لكنه أكثر ملاءمة لاستخدام نفس المنفذ في كل مرة حتى لا يضطر العميل إلى إدخال منفذ جديد في كل مرة.
تنقسم جميع المنافذ إلى ثلاثة نطاقات:
- [0 ، 1023] - معروفة (النظامية).
- [1024 ، 49151] - مسجل (مستخدم). يجب تحديد منفذ الخادم في هذا النطاق.
- [49152 ، 65535] - ديناميكي (خاص). هنا ، يخصص نظام التشغيل منافذ مؤقتة للبرامج.
في ويكيبيديا ، يمكنك رؤية قائمة بالمنافذ المحجوزة . بعد ذلك ، على سبيل المثال ، يتم تحديد المنفذ 49094 لخادم اللعبة.
- يمكن أن يحتوي الكمبيوتر على عدة واجهات للشبكة ، حقيقية (Ethernet و WiFi) وظاهرية (VPN). كل واجهة شبكة لها عنوان IP خاص بها. يمكن للبرنامج تزويد مستخدم الخادم بفرصة اختيار واجهة الشبكة التي سينتظر بها طلبات العميل. لكن من الملائم استخدام عنوان IP wildcard خاص 0.0.0.0 . إذا فتح البرنامج مقبسًا بعنوان IP هذا ، فسيستمع إلى المنفذ المحدد لجميع واجهات الشبكة لهذا الكمبيوتر. وبالتالي ، لا يتعين على اللاعب التفكير في واجهة الشبكة التي يجب اختيارها.
- يمكنك أيضًا مساعدة العميل وتحديد عنوان IP الخاص بالخادم تلقائيًا. إذا أرسل العميل طلبًا إلى عنوان IP خاص للبث (البث) ، فستتلقى جميع أجهزة الكمبيوتر في الشبكة المحلية ذلك.
على سبيل المثال ، إذا كان عنوان الشبكة هو 192.168.1.0 ، يكون قناع الشبكة الفرعية هو 255.255.255.0 ، فسيكون عنوان IP للبث 192.168.1.255.
إذا كانت جميع خوادم اللعبة تستمع إلى المنفذ 49094 ، فسيتم استلام الحزمة التي تم إرسالها إلى العنوان 192.168.1.255-00-009094 بواسطة جميع خوادم الألعاب على هذه الشبكة. سيرسل كل خادم تأكيدًا إلى المرسل. وبالتالي سيتلقى العميل قائمة بجميع خوادم الألعاب على شبكته ، وسيكون قادرًا على تحديد الخادم الذي يحتاجه.
- إذا كان جميع اللاعبين على نفس الشبكة المحلية ، فإن إنشاء اتصالات "مع كل منهم" أمر بسيط للغاية. قد تكون هناك مشاكل في وصول العميل إلى منفذ الخادم بسبب جدار الحماية. لكن ذلك يعتمد على إعدادات نظام التشغيل والأمان.
تأسيس اتصال من شبكة محلية إلى خادم على الإنترنت
- كقاعدة عامة ، أجهزة الكمبيوتر غير متصلة بالإنترنت مباشرةً ، ولكن من خلال جهاز توجيه. وكقاعدة عامة ، ينفذ الموجه ترجمة عنوان الشبكة (NAT ، ترجمة عنوان الشبكة) .
على سبيل المثال ، العميل C موجود على الشبكة المحلية ولديه إمكانية الوصول إلى الإنترنت من خلال جهاز التوجيه B ، بينما يحتوي الخادم A على عنوان IP عام على الإنترنت. دعهم لديهم العناوين التالية:

- عنوان الإنترنت الخاص بالخادم A هو 203.0.113.2. يستمع برنامج الخادم على المنفذ 49094.
- عنوان جهاز التوجيه B على الإنترنت هو 203.0.113.5. عنوان جهاز التوجيه B على الشبكة المحلية هو 192.168.1.1.
- عنوان العميل C على الشبكة المحلية هو 192.168.1.5. يشغل برنامج العميل المنفذ 50150 ، ويرسل حزمة إلى الخادم على 203.0.113.2-00-009094.
- جهاز التوجيه B هو البوابة الافتراضية على شبكته المحلية. أي ، يتم إرسال جميع الحزم التي تحتوي على عناوين ليست من الشبكة المحلية الحالية إليها.
- يحتوي جهاز التوجيه على جدول ترجمة عنوان: (عنوان داخلي: منفذ داخلي) - (عنوان خارجي: منفذ خارجي). بعد تلقي حزمة من العميل إلى الخادم 203.0.113.2-00-009094 ، يختار جهاز التوجيه أي منفذ خارجي مجاني ، على سبيل المثال 52050 ، ويقوم بإنشاء إدخال في جدول ترجمة العنوان: 192.168.1.5►0150 - 203.0.113.5►2050.
- يستبدل جهاز التوجيه العنوان الداخلي للمرسل 192.168.1.5/100150 في الحزمة بالعنوان الخارجي 203.0.113.5/102050 ، وينقل الحزمة التي تم تغييرها إلى الخادم.
- يستقبل الخادم حزمة بعنوان المرسل 203.0.113.5► 2020 ، ويرسل استجابة إلى هذا العنوان ، أي ، إلى جهاز التوجيه.
- بعد استلام الحزمة من الخادم ، يبحث الموجه عن عنوان المستلم في جدول ترجمة العنوان الخاص به ، ويقوم بإجراء الاستبدال العكسي للعنوان الخارجي للمستلم 203.0.113.5►2050 بالعنوان الداخلي 192.168.1.5►0150 ، ويرسل الحزمة إلى هذا العنوان ، أي العميل.
- إذا أرسل العميل الحزم اللاحقة إلى الخادم ، فإن الموجه ينظر إلى عنوان المرسل لمعرفة ما إذا كان هذا السجل موجود بالفعل في الجدول ، وإذا كان الأمر كذلك ، فإنه يستخدم المنفذ الخارجي المخصص مسبقًا ، في هذه الحالة 52050.
- وبالتالي ، أنشأ العميل والخادم اتصالًا من خلال NAT ، ويمكنهما بدء اللعبة. لكن الخادم لا يعرف العنوان الداخلي للعميل في شبكته المحلية ، ويعتبر أن العميل هو جهاز توجيه.
- يكون الإدخال في جدول ترجمة العنوان صالحًا لفترة معينة من الوقت ، عادة ما تكون 1-3 دقائق. لذلك ، يحتاج العميل والخادم إلى تبادل الحزم بشكل دوري بحيث لا يتم حذف السجل الذي يربطهما. إذا أرسل العميل حزمة جديدة إلى الخادم بعد حذف السجل ، فيمكن تخصيص منفذ خارجي مختلف للسجل الجديد على جهاز التوجيه ، وبالنسبة للخادم سيكون عميلًا آخر بعنوان مختلف.
- كقاعدة عامة ، لا يتم توصيل جهاز توجيه المستخدم مباشرة بالإنترنت ، ولكنه موجود على الشبكة الداخلية لمزود الإنترنت. وهذا هو ، العميل وراء اثنين من NAT.
على سبيل المثال ، مثل هذا:
أي ، يتم تنفيذ ترجمة مزدوجة لعناوين الشبكة.
- هناك أنواع مختلفة من NAT:
- مخروط كامل NAT
- بعد إنشاء إدخال في جدول ترجمة العنوان (العنوان الداخلي: المنفذ الداخلي) - (العنوان الخارجي: المنفذ الخارجي) ، يتم نقل جميع الحزم من المرسل (العنوان الداخلي: المنفذ الداخلي) عبر (العنوان الخارجي: المنفذ الخارجي) إلى أي عنوان مستلم.
- يمكن لأي خادم خارجي إرسال حزم إلى (عنوان داخلي: منفذ داخلي) ، وإرسال حزم إلى (عنوان خارجي: منفذ خارجي).
على سبيل المثال ، يرسل العميل C الحزم إلى الخوادم A و D باستخدام نفس العنوان الخارجي 203.0.113.5► 202050. إذا أرسل الخادم E حزمة إلى هذا العنوان 203.0.113.5► 202050 ، فسيقوم جهاز التوجيه بتمريرها إلى العميل C.
- مخروط مقيد العنوان NAT.
- بعد إنشاء إدخال في جدول ترجمة العنوان (العنوان الداخلي: المنفذ الداخلي) - (العنوان الخارجي: المنفذ الخارجي) ، يتم نقل جميع الحزم من المرسل (العنوان الداخلي: المنفذ الداخلي) عبر (العنوان الخارجي: المنفذ الخارجي) إلى أي عنوان مستلم.
- يمكن للخادم الخارجي (عنوان الخادم: منفذ الخادم) إرسال الحزم إلى (العنوان الداخلي: المنفذ الداخلي) ، وإرسال الحزم إلى (العنوان الخارجي: المنفذ الخارجي) فقط إذا كان (العنوان الداخلي: المنفذ الداخلي) الحزم المرسلة مسبقًا إلى (عنوان الخادم: أي الميناء).
على سبيل المثال ، يرسل العميل C الحزم إلى الخوادم A و D باستخدام نفس العنوان الخارجي 203.0.113.5► 202050. يمكن للخادم D إرسال حزمة إلى العميل C عبر عنوان جهاز التوجيه 203.0.113.5► 202050 من أي من منافذه. لكن جهاز التوجيه لن يمر الحزم من الخادم E.
- مخروط مقيد بالميناء NAT.
- بعد إنشاء إدخال في جدول ترجمة العنوان (العنوان الداخلي: المنفذ الداخلي) - (العنوان الخارجي: المنفذ الخارجي) ، يتم نقل جميع الحزم من المرسل (العنوان الداخلي: المنفذ الداخلي) عبر (العنوان الخارجي: المنفذ الخارجي) إلى أي عنوان مستلم.
- يمكن للخادم الخارجي (عنوان الخادم: منفذ الخادم) إرسال الحزم إلى (العنوان الداخلي: المنفذ الداخلي) ، وإرسال الحزم إلى (العنوان الخارجي: المنفذ الخارجي) فقط إذا كان (العنوان الداخلي: المنفذ الداخلي) الحزم المرسلة مسبقًا إلى (عنوان الخادم: منفذ الخادم).
على سبيل المثال ، يرسل العميل C الحزم إلى الخوادم A و D باستخدام نفس العنوان الخارجي 203.0.113.5► 202050. لن يمرر جهاز التوجيه الحزم من أي خادم E أو منفذ خادم آخر D.
- NAT متماثل (NAT متماثل).
- إذا أرسل المرسل الداخلي نفسه (العنوان الداخلي: منفذ داخلي) الحزم إلى مستلمين مختلفين (عنوان الخادم: منفذ الخادم) ، فسيتم تخصيص منفذ خارجي منفصل لكل عنوان مستلم وسيتم استخدام إدخال منفصل في جدول ترجمة العنوان.
- يمكن فقط للخادم الخارجي (عنوان الخادم: منفذ الخادم) الذي تلقى الحزمة من المرسل الداخلي (العنوان الداخلي: المنفذ الداخلي) إرسال الحزمة مرة أخرى.
على سبيل المثال ، يرسل العميل C الحزم إلى الخادم A باستخدام عنوان خارجي 203.0.113.5► 202050 ، وإلى الخادم D باستخدام عنوان خارجي آخر 203.0.113.5. 20201. لن يمرر جهاز التوجيه الحزم من أي خادم E أو منفذ خادم آخر D.
- إذا كان هناك العديد من العملاء متصلين بخادم اللعبة ، فبالنسبة إلى لعبة نظير إلى نظير ، يتعين عليك إنشاء اتصال مباشر بين كل زوج من العملاء يتجاوز الخادم.
على سبيل المثال ، يتصل عميلان C و E بالخادم A:

- لدى العميل C عنوان داخلي 192.168.1.5/100150 وعنوان خارجي 203.0.113.5/102050.
- لدى العميل E عنوان داخلي وهو 192.168.2.5:50250 وعنوان خارجي 203.0.113.6-062060.
- يجب أن يخبر الخادم كل عميل العنوان الخارجي للعميل الآخر.
- عادةً ما تستخدم أجهزة التوجيه مخروطًا مقيدًا بالمنافذ NAT type NAT. يقوم جهاز التوجيه بتمرير الحزم إلى العميل فقط من المرسل (عنوان IP والمنفذ) الذي أرسل إليه العميل الحزم مسبقًا. وإذا أرسل العميل C حزمة إلى العميل E ، فلن يفوت جهاز التوجيه D هذه الحزمة.
- في هذه الحالة ، يتم استخدام طريقة اللكم ثقب UDP . يجب على كلا العملاء إرسال حزم UDP لبعضهما البعض. بمجرد أن يرسل العميل C حزمة إلى العميل E ، سيكون الموجه B جاهزًا لاستلام الحزم من العميل E. وبالمثل ، بمجرد أن يرسل العميل E حزمة إلى العميل C ، يصبح الموجه D جاهزًا لاستلام الحزم من العميل C. الحزم الأولى من العميل الذي بدأ نقل أولا سوف تضيع. ولكن بمجرد أن يبدأ العميل الثاني أيضًا في إرسال الحزم باتجاهه ، سيتمكن كلا العملاء من تبادل الحزم.
- ولكن إذا كان جهاز التوجيه يستخدم Symmetric NAT ، فسيتم تخصيص منفذ خارجي جديد لكل مستلم. وكقاعدة عامة ، لا توجد طريقة لمعرفة المنفذ الذي خصصه الموجه. لذلك ، إذا كان واحد على الأقل من أجهزة التوجيه يستخدم متماثل NAT ، فسيكون من المستحيل تأسيس اتصال بين العملاء.
- إذا كان هناك عميلان على نفس الشبكة المحلية ، فسيعرفان فقط العناوين الخارجية لكل منهما.
على سبيل المثال ، يرسل العميل C حزمة إلى العميل D على عنوانه الخارجي 203.0.113.5Point2051. يجب أن يعالج جهاز التوجيه B هذه الحزمة كما لو كانت قد وردت من شبكة خارجية ، واستبدل عنوان المستلم 203.0.113.5► 20201 بعنوان داخلي للعميل D 192.168.1.6.10060 ، وأرسل الحزمة إلى العميل D مرة أخرى إلى الشبكة المحلية. تسمى وظيفة الموجه NAT loopback ( تصفيف شعر NAT ). إذا تم تعطيل استرجاع NAT على جهاز التوجيه ، فسيكون من المستحيل إنشاء اتصال بين العملاء.
- يمكن أن يكون العملاء موجودين في شبكات محلية مختلفة ، لكن يمكنهم الوصول إلى الإنترنت من خلال مزود إنترنت مشترك.
إذا تم إيقاف تشغيل NAT loopback على أجهزة مزود خدمة الإنترنت ، فسيكون من المستحيل إقامة اتصال بين العملاء.
- ماذا يجب أن أفعل إذا تم استخدام متماثل NAT على جهاز التوجيه ، أو تم إيقاف تشغيل استرجاع NAT؟
كما أفهمها ، فإن الطريقة الوحيدة الموثوقة لحل هذه المشكلات هي نقل الحزم ليس مباشرة بين العملاء ، ولكن من خلال الخادم. من الضروري إما تنفيذ هذه الوظيفة في برنامج اللعبة ضمن إطار بنية نظير إلى نظير أو لتنفيذ بنية خادم العميل.
أو يمكنك استخدام برامج الجهات الخارجية لإنشاء VPN ، على سبيل المثال LogMeIn Hamachi .
تأسيس اتصال بين الشبكات المحلية على الإنترنت
- كقاعدة عامة ، ليس لدى أي من اللاعبين عنوان IP عام ، واللاعبون موجودون على شبكات محلية مختلفة خلف NAT.
على سبيل المثال ، في هذا المخطط ، سيرسل العميل C الحزم إلى الخادم A على عنوانه الخارجي 203.0.113.2-022020 ، حيث يتم تحديد المنفذ بواسطة جهاز التوجيه B. لذلك ، لا يعد اختيار المنفذ الداخلي للخادم A أمرًا مهمًا ، ويمكنك تحديد أي منفذ. في هذه الحالة ، بدلاً من المنفذ 49094 ، يمكن للخادم A طلب أي منفذ مجاني من نظام التشغيل ، على سبيل المثال 50120.
- لكي يقوم الخادم A والعميل C بإنشاء اتصال ، أولاً ، يحتاج كل منهما إلى معرفة عنوانه الخارجي بطريقة أو بأخرى.
يمكنك استخدام بروتوكول STUN (جلسة Traversal Utilities لـ NAT) لهذا الغرض .
يسمح بروتوكول STUN للعميل الموجود خلف NAT بتحديد عنوان IP الخارجي الخاص به والمنفذ.
يتم إرسال رسائل STUN في حزم UDP.
يمكن للعميل الوصول إلى أي من خوادم STUN العامة. يمكن العثور على قائمة بخوادم STUN العامة على ويكيبيديا . أو ابحث عن "قائمة خوادم STUN العامة" .
لا تنطبق هذه الطريقة إذا كان واحد على الأقل من المشغلات على جهاز التوجيه يستخدم "NAT المتماثل".
- بعد أن يتعلم كل لاعب عنوانه الخارجي ، يجب عليه إعطاء عنوانه لجميع اللاعبين الآخرين بطريقة أو بأخرى.
بحيث يمكن للاعبين تبادل عناوينهم ، يمكنك استخدام خادمك العام. في الرسم التخطيطي ، يطلق عليه خادم عنوان.
هذا لا يتطلب بالضرورة خادم مخصص. يمكنك استخدام أي استضافة مع خادم ويب وبدعم من أي لغة نصية ، مثل PHP. باستخدام بروتوكول HTTP ، يجب على كل لاعب إرسال عنوانه الخارجي إلى خادم العنوان. ثم اطلب عناوين جميع اللاعبين الآخرين.
- على سبيل المثال ، يمكن لكل خادم ألعاب تسجيل معرفه الفريد (معرف اللعبة) على خادم العنوان. يمكنك استخدام أي سلسلة كمعرّف للعبة ، على سبيل المثال ، اللقب (الاسم المستعار) لمستخدم الخادم. يقوم مستخدم الخادم بإخبار معرف اللعبة لهؤلاء اللاعبين الذين يريد دعوتهم إلى لعبته. وسيتمكن هؤلاء اللاعبون من الانضمام إلى اللعبة عن طريق طلب العناوين الخارجية لجميع المشاركين في هذه اللعبة بواسطة معرف اللعبة من خادم العنوان.
- بعد أن يتلقى كل لاعب العناوين الخارجية لجميع اللاعبين الآخرين ، يمكنهم إنشاء اتصالات كل على حدة باستخدام طريقة تثقيب ثقب UDP .