هذا هو أحدث وثائق بروتوكول Raknet. ويتضمن معلومات حول أنواع البيانات المستخدمة في البروتوكول وتفاصيل حول كل حزمة وحقولها المرتبطة بها.
TODO: تعديل لجعلها أفضل للعين وإزالة الكثير من الأشياء غير المجدية. وأيضًا تنظيم الأشياء ، مثل التعداد/الثوابت في مكان واحد ، وكذلك إزالة الأشياء المتكررة.
تفترض هذه الوثائق أنك تريد طريقة أمان متشابهة/نفس libcat ، ولهذا السبب إذا كان الخادم الذي تستهدفه لا يحتوي على libcat أو أي شيء آخر ، ولكن لديهم أيضًا تمكين الأمن ، سيتعطل العميل لأنهم سيعطيك ملف تعريف ارتباط فقط أو أي دليل على الهوية أو أي شيء من الإعجابات. ولكن يمكنك سحب طلب دعم كلتا الحالتين.
| يكتب | مقاس | ملحوظة |
|---|---|---|
| uint8 | 1 بايت | عدد صحيح 8 بت غير موقعة |
| uint16 | 2 بايت | عدد صحيح 16 بت غير موقعة |
| uint24 | 3 بايت | عدد صحيح غير موقعة 24 بت مع الحد الأدنى قيمة 0 وقيمة أقصى قدرها 167777215 |
| uint32 | 4 بايت | عدد صحيح 32 بت غير موقعة |
| uint64 | 4/8 بايت | عدد صحيح 64 بت غير موقعة (4 بايت للأنظمة 32 بت ، 8 بايت لأنظمة 64 بت) |
| uint16 سلسلة | عامل | سلسلة مشفرة UTF-8 بطول 2 بايت تسبق السلسلة |
| سحر | 16 بايت | مجموعة من أعداد صحيحة 8 بت غير موقعة مع تسلسل محدد [0x00, 0xFF, 0xFF, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFD, 0x12, 0x34, 0x56, 0x78] |
| وسادة مع الصفر | عامل | البايتات الخالية المستخدمة في الحشو مع حجم من اختيارك |
| بول | 1 بايت | اكتب أو قراءة كصهر واحد غير موقّع 8 بت ، بقيمة 0 أو 1 (يتم استخدام الصفر لتمثيل خطأ ، ويستخدم واحد لتمثيل True) |
| عنوان | 7-29 بايت | IPv4: 1 byte (إصدار العنوان) ، 4 بايت (عنوان IP) ، 2 بايت (المنفذ) ، IPv6: 1 بايت (إصدار العنوان) ، قصير غير موقّع لعائلة العنوان (باللغة الصغيرة) ، قصيرة غير موقعة لرقم المنفذ ، عدد صحيح غير موقّع لمعلومات التدفق ، 16 بايت للعنوان ، وهو حدد غير محدد للدراسة. |
| قليل | 1 بت | اكتب أو اقرأ الجزء داخل المخزن المؤقت بعد الانتهاء منه |
| يطفو | 4 بايت | IEEE 754 رقم عائم الدقة الفردية |
يمكنك على الفور تحديد أولئك دون قراءة كيفية صنعهم إذا كنت ترغب في جعل تطبيقك أسرع.
| اسم | قيمة |
|---|---|
| mtusize | 1492 |
| udpheadersize | 28 |
| publickeysize | 294 |
| requstchallengesize | 64 |
| الاستجابة | 128 |
| maxnumberoflocaladdresses | 10 |
| الحجم المضاد للهوية | 294 |
| عميل العميل | 32 |
| DefaultProtocoleversion | 6 |
| NumberOfarrangedStreams | 32 |
| اسم | بطاقة تعريف | يكتب |
|---|---|---|
| غير متصل | 0x01 | دون اتصال |
| غير متصل | 0x02 | دون اتصال |
| UnconnectedPong | 0x1c | دون اتصال |
| متصل | 0x00 | عبر الإنترنت [من/إلى Datagram] |
| متصل بونج | 0x03 | عبر الإنترنت [من/إلى Datagram] |
| OpenConnectionRequestone | 0x05 | دون اتصال |
| openconnectionReplyone | 0x06 | دون اتصال |
| OpenConnectionRequesttwo | 0x07 | دون اتصال |
| openconnectionReplytwo | 0x08 | دون اتصال |
| ConnectionRequest | 0x09 | عبر الإنترنت [من/إلى Datagram] |
| quotesystemrequirespublickey | 0x0A | دون اتصال |
| OurSystemRequiressecurity | 0x0B | كلاهما [؟] |
| ConnectionAtmptFailed | 0x11 | دون اتصال |
| بالفعل | 0x12 | دون اتصال |
| اتصالات الاتصال | 0x10 | عبر الإنترنت [من/إلى Datagram] |
| NewincomingConnection | 0x13 | عبر الإنترنت [من/إلى Datagram] |
| disconnectionnotification | 0x15 | متصل |
| ConnectionLost | 0x16 | كلاهما [؟] |
| غير متوافقت | 0x19 | متصل |
انتظر حزمة غير متصلة من العميل.
انتظر حزمة OpenConnectionRequestone من عميل.
انتظر حزمة OpenConnectionRequestTwo من العميل.
انتظر بيانات البيانات من العميل.
إرسال حزمة غير متصلة إلى الخادم.
إرسال حزمة OpenConnectionRequestone إلى الخادم.
إرسال حزمة OpenConnectionRequestTwo إلى الخادم.
إرسال بيانات البيانات إلى الخادم.
يتم استخدام هذه الحزمة لتحديد ما إذا كان الخادم متصلاً أم لا.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| فقط ReplyonOpenconnections | بول | ن/أ | إذا تم تعيينه على TRUE ، فسيقوم الخادم بإرسال رد فقط إذا كان اتصال العميل بالخادم مفتوحًا حاليًا. هذا يساعد على منع إرسال ردود على العملاء الذين أغلقوا اتصالاتهم. سيكون معرف الرسالة الناتج للطلب UnconnectedPingOpenConnections . إذا تم ضبطه على خطأ ، فلن يحتاج المعرف إلى التغيير. |
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| عملاء | uint64 | كبير إنديان | الطابع الزمني للعميل المستخدم لحساب الكمون |
| سحر | UINT8 [16] | ن/أ | تسلسل سحري لتحديد الحزمة |
| العميل | uint64 | كبير إنديان | معرف فريد للعميل |
هذه الحزمة هي الاستجابة لحزمة بينغ غير متصلة.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| خوادم | uint64 | كبير إنديان | الطابع الزمني الخادم المستخدم لحساب الكمون |
| ServerGuid | uint64 | كبير إنديان | معرف فريد للخادم |
| سحر | UINT8 [16] | ن/أ | تسلسل سحري لتحديد الحزمة |
| Despondata | uint16 سلسلة | كبير إنديان | عادة ما تستخدم بيانات الاستجابة لمعلومات الخادم |
تُستخدم هذه الحزمة للحفاظ على الاتصال حيًا بين العميل والخادم.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| عملاء | uint64 | كبير إنديان | الطابع الزمني للعميل المستخدم لحساب الكمون |
هذه الحزمة هي الاستجابة لحزمة بينغ المتصلة.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| عملاء | uint64 | كبير إنديان | الطابع الزمني للعميل من بينغ |
| خوادم | uint64 | كبير إنديان | الطابع الزمني الخادم المستخدم لحساب الكمون |
يتم استخدام هذه الحزمة لبدء عملية المصافحة بين العميل والخادم.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| سحر | UINT8 [16] | ن/أ | تسلسل سحري لتحديد الحزمة |
| بروتوكولون | uint8 | ن/أ | نسخة البروتوكول التي يدعمها العميل |
| mtusize | وسادة مع الصفر | ن/أ | حجم وحدة الإرسال القصوى (MTU) حجم العميل |
عند استخدام pad-with-Zero ، أضف إلى حجم MTU موضع القراءة الحالي بالإضافة إلى 28 (حجم رأس UDP) للقراءة. للكتابة ، احصل على حجم MTU المُطرّف مع موضع كتابة المخزن المؤقت الحالي (أو حجمه) بالإضافة إلى 28 (حجم رأس UDP) بالإضافة إلى حجم المخزن المؤقت الحالي. للتحقق من صحة المخزن المؤقت للحزمة ، تحقق مما إذا كان حجمه هو 28 (حجم رأس UDP) بالإضافة إلى حجم المخزن المؤقت الحالي.
هذه الحزمة هي الاستجابة لطلب اتصال مفتوح.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| سحر | UINT8 [16] | ن/أ | تسلسل سحري لتحديد الحزمة |
| ServerGuid | uint64 | كبير إنديان | معرف فريد للخادم |
| ServerHassecurity | بول | ن/أ | ما إذا كان الخادم يتطلب الأمان أم لا |
| mtusize | uint16 | كبير إنديان | الحد الأقصى لحجم وحدة الإرسال (MTU) للخادم |
هذه الحزمة هي استجابة لطلب اتصال مفتوح مع معلومات أمان إضافية.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| سحر | UINT8 [16] | ن/أ | تسلسل سحري لتحديد الحزمة |
| ServerGuid | uint64 | كبير إنديان | معرف فريد للخادم |
| ServerHassecurity | بول | ن/أ | ما إذا كان الخادم يتطلب الأمان أم لا |
| Hascookie | بول | ن/أ | ما إذا كانت الحزمة تتضمن ملف تعريف ارتباط |
| ملف تعريف الارتباط | uint32 | كبير إنديان | قيمة ملفات تعريف الارتباط |
| ServerPublicKey | UINT8 [294] | ن/أ | المفتاح العام المستخدم للتشفير |
| mtusize | uint16 | كبير إنديان | الحد الأقصى لحجم وحدة الإرسال (MTU) للخادم |
يتم استخدام هذه الحزمة لإكمال عملية المصافحة بين العميل والخادم.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| سحر | UINT8 [16] | ن/أ | تسلسل سحري لتحديد الحزمة |
| ServerAddress | UINT8 [7-29] | ن/أ | عنوان IP الخادم وسرد المنفذ |
| mtusize | uint16 | كبير إنديان | حجم وحدة الإرسال القصوى (MTU) حجم العميل |
| العميل | uint64 | كبير إنديان | معرف فريد للعميل |
يتم استخدام هذه الحزمة لإكمال عملية المصافحة بين العميل والخادم.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| سحر | UINT8 [16] | ن/أ | تسلسل سحري لتحديد الحزمة |
| ملف تعريف الارتباط | uint32 | كبير إنديان | قيمة ملفات تعريف الارتباط |
| يحتوي على Challenge | بول | ن/أ | ما إذا كان النظام يتطلب تحدي المصافحة |
| تحدي | UINT8 [64] | ن/أ | تحدي مصافحة النظام بايت |
| ServerAddress | UINT8 [7-29] | ن/أ | عنوان IP الخادم وسرد المنفذ |
| mtusize | uint16 | كبير إنديان | حجم وحدة الإرسال القصوى (MTU) حجم العميل |
| العميل | uint64 | كبير إنديان | معرف فريد للعميل |
ملاحظة: إذا كانت حزمة OpenConnectionReplyOne تحتوي على أمان ، لكن هذه الحزمة لا تحتوي على تحد ، فيجب على العميل على الفور إرسال حزمة RemotesystemRepublicKey لإخطار الخادم بأنه لم يكن هناك تحد في حزمة OpenConnecteRequestTwo.
يمكنك كتابة طريقتك الخاصة لحساب نتائج الاتصال ولكن هذا هو الطريقة القياسية.
حساب Connectionoutcome :
bitwise and ولتحقق مما إذا كانت الضوابط أدناه مطلوبة باستخدام contains address contains guid Boolean.clientGuid مرتبطًا بالفعل بعميل لديه عنوان عميل مختلف ، فقم بتعيين حالة الاتصال إلى 3.clientGuid مختلف ، فقم بتعيين حالة الاتصال إلى 4.بمجرد حساب
ConnectionOutcome، ستحتاج إلى التحقق مما إذا كان يساوي 1 ثم إرسال حزمةOpenConnectionReplyTwo.
إذا لم يكن
ConnectionOutcome0 ، فأرسل الحزمةAlreadyConnected.
هذه الحزمة هي الاستجابة لطلب اتصال مفتوح حزمة.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| سحر | UINT8 [16] | ن/أ | تسلسل سحري لتحديد الحزمة |
| ServerGuid | uint64 | كبير إنديان | معرف فريد للخادم |
| ClientAddress | UINT8 [7-29] | ن/أ | عنوان IP للعميل وسرد المنفذ |
| mtusize | uint16 | كبير إنديان | الحد الأقصى لحجم وحدة الإرسال (MTU) للخادم |
| يتطلب encryption | قليل | ن/أ | ما إذا كان الاتصال يتطلب التشفير أم لا |
| تشفير | UINT8 [128] | ن/أ | مفتاح التشفير للعميل - يتم كتابته أو قراءة ما إذا كان حقل requiresEncryption تم ضبطه على TRUE. |
تُستخدم هذه الحزمة لإنشاء اتصال بين العميل والخادم مع تمكين أو تعطيل الأمان.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| العميل | uint64 | كبير إنديان | معرف فريد للعميل |
| عملاء | uint64 | كبير إنديان | الطابع الزمني للعميل عندما يطلب الاتصال |
| الأمن | بول | ن/أ | ما إذا كان الاتصال يتطلب الأمان أم لا |
| العميل المضاد | UINT8 [32] | ن/أ | إثبات مصادقة العميل |
| Doentity | بول | ن/أ | ما إذا كانت الحزمة تتطلب إثبات الهوية |
| مقاومة للهوية | UINT8 [294] | ن/أ | دليل على هوية العميل |
ملاحظة: إذا كان إثبات الهوية غير صالح وتم تعيين
doIdentityعلى True ، فأرسل على الفور حزمةRemoteSystemRequiresPublicKeyمع معرف نوع منClientIdentityIsInvalid. إذا تم تعيينdoIdentityعلى FALSE ولم يكن هناك دليل على الهوية ، فأرسل حزمةRemoteSystemRequiresPublicKeyمع معرف نوع منClientIdentityIsMissing.
يتم استخدام هذه الحزمة لرمي الأخطاء المتعلقة بطلبات المفاتيح العامة لمصادقة العميل وتحديد الهوية.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| نوع | uint8 | ن/أ | نوع طلب المفتاح العام |
| اسم | بطاقة تعريف |
|---|---|
| ServerPublicKeyismissing | 0 |
| العميل | 1 |
| العميل | 2 |
يتم إرسال هذه الحزمة عندما لا يتطلب الخادم الأمان ولكنه لا يزال إلزاميًا.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| ClientAddress | UINT8 [7-29] | ن/أ | عنوان IP للعميل وسرد المنفذ |
| ServerGuid | uint64 | كبير إنديان | معرف فريد للخادم |
يتم إرسال هذه الحزمة عندما يكون عدد المحاولات التي تحاول الانضمام إلى الخادم أعلى من مبلغ معين (يعتمد على تنفيذك) أو لا يحتوي العميل على عنوان مخصص ؛ هذا هو ما تقوم بفحصه وإرساله إذا تم استيفاء المتطلبات قبل إرسال حزمة OpenConnectionRequestOne .
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
يتم إرسال هذه الحزمة عندما يكون العميل متصلاً بالفعل.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| سحر | UINT8 [16] | ن/أ | تسلسل سحري لتحديد الحزمة |
| العميل | uint64 | كبير إنديان | معرف فريد للعميل |
هذه الحزمة هي الاستجابة لطلب اتصال مع تمكين الأمان.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| ClientAddress | UINT8 [7-29] | ن/أ | عنوان IP للعميل وسرد المنفذ |
| ClientIndex | uint16 | كبير إنديان | معرف فريد مخصص للعميل |
| ServerMachineadDresses | العنوان [10] | ن/أ | عناوين الجهاز المحلي الخادم |
| عملاء | uint64 | كبير إنديان | الطابع الزمني للعميل |
| خوادم | uint64 | كبير إنديان | الطابع الزمني للخادم |
يتم إرسال هذه الحزمة إلى جميع العملاء الآخرين عندما يتصل عميل جديد بالخادم.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| ServerAddress | UINT8 [7-29] | ن/أ | عنوان IP الخادم وسرد المنفذ |
| ClientMachineadDresses | العنوان [10] | ن/أ | عناوين الجهاز المحلي العميل |
| عملاء | uint64 | كبير إنديان | الطابع الزمني للعميل |
| خوادم | uint64 | كبير إنديان | الطابع الزمني للخادم |
بعد إرسال أو استقبال هذه الحزمة إلى الخادم ، تحتاج إلى الحفاظ على الاتصال حيًا عن طريق إرسال حزم ConnectedPing دورية. هذه الحزم هي في الأساس وسيلة لقول "مهلا ، ما زلت هنا وأتصل بالخادم". يرسل الخادم أيضًا حزم ConnectedPong استجابةً للتأكد من أن الاتصال لا يزال نشطًا. تساعد عملية Ping-Pong هذه في منع الاتصال من التوقيت بسبب عدم النشاط أو مشكلات الشبكة.
يتم إرسال هذه الحزمة عند فصل العميل عن الخادم.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
يتم إرسال هذه الحزمة عند فقد اتصال بالعميل.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| العميل | uint64 | كبير إنديان | معرف فريد للعميل |
| ClientAddress | UINT8 [7-29] | ن/أ | عنوان IP للعميل وسرد المنفذ |
يتم إرسال هذه الحزمة عندما يحاول العميل الاتصال بخادم مع إصدار بروتوكول غير متوافق.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| بروتوكولون | uint8 | ن/أ | إصدار البروتوكول الذي يدعمه الخادم |
| سحر | UINT8 [16] | ن/أ | تسلسل سحري لتحديد الحزمة |
| ServerGuid | uint64 | كبير إنديان | معرف فريد للخادم |
يتم استخدام هذه الحزمة لإرسال واستلام البيانات بين العملاء والخادم. يمكن أن يكون أحد الأنواع الثلاثة: ValidDatagram أو AckedDatagram أو NackedDatagram.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| Isvalid | قليل | ن/أ | دائما صحيح |
| ISACK | قليل | ن/أ | إذا كان هذا صحيحًا ، فإن الحزمة هي ackeddatagram |
| isnack | قليل | ن/أ | إذا كان ذلك صحيحًا ، فإن الحزمة هي nackedDatagram |
إذا كان كلاهما
isAckوisNackخطأين ، فإن الحزمة هي appaldatagram.
هذه الحزمة هي استجابة لـ apportDatagram تشير إلى أن الخادم قد تلقى البيانات.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| يتطلب bandas | قليل | ن/أ | إذا كان هذا صحيحًا ، تتضمن الحزمة B وكقيم |
| ب | يطفو | كبير إنديان | لا تستخدم |
| مثل | يطفو | كبير إنديان | معدل وصول البيانات |
| نطاقات | يتراوح | ن/أ | مجموعة من قيم النطاق التي تم استلامها |
هذه الحزمة هي استجابة لـ apportDatagram التي تشير إلى أن الخادم لم يتلق جميع البيانات المتوقعة.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| نطاقات | يتراوح | ن/أ | مجموعة من قيم النطاق التي لم يتم استلامها |
يستخدم هذا الهيكل لتمثيل نطاقات AckedDatagrams والنطاقات المفقودة من NackedDatagrams.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| مقاس | uint16 | كبير إنديان | عدد النطاقات في الصفيف |
| Issingle | بول | ن/أ | إذا كان Min يساوي الحد الأقصى ، فسيتم تعيين هذا على True |
| دقيقة | uint24 | ليتل إنديان | الحد الأدنى للقيمة في النطاق |
| الأعلى | uint24 | ليتل إنديان | الحد الأقصى للقيمة في النطاق - لا يتم كتبه إذا كان عزباء |
يتم استخدام هذه الحزمة لإرسال واستلام البيانات بين العملاء والخادم.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| iSpacketPair | قليل | ن/أ | إذا كان هذا صحيحًا ، فإن الحزمة هي واحدة من حزمتين مرتبطتين |
| iscontinuoussend | قليل | ن/أ | إذا كان ذلك صحيحًا ، فإن الحزمة عبارة عن حزمة إرسال مستمرة |
| يتطلب bandas | قليل | ن/أ | إذا كان هذا صحيحًا ، تتضمن الحزمة B وكقيم |
| حاجيات | uint24 | ليتل إنديان | رقم تسلسل Datagram |
| كبسولات | datagramcapsule [] | ن/أ | مجموعة من الكبسولات في الحزمة |
التحقق من قنوات الترتيب الفاسدة : (يجب أن يكون بيانات البيانات الصالحة "متسلسلًا وترتيبًا (لا يوجد إيصال ACK))
إذا كان arrangmentChannel أكبر أو على قدم المساواة مع عدد التدفقات المرتبة المتوفرة ، وهو 2 ^ 5 ، فسيتم تمييزه (تخطي وافعل ما هو مطلوب).
كل نوع ترتيب DATAGRAM صالح لقيمة MAX Array هو عدد التدفقات المرتبة ويجب ألا تكون أكبر أو تساوي.
إيجاد عدد ثقب في بيانات البيانات المستلمة : (يجب أن يكون بيانات البيانات الصالحة Reliable or in sequence قبل المضي قدمًا)
ستحتاج إلى التحقق من عدد الفتحات في بيانات بيانات صالحة Reliable or in sequence والسبب هو التحقق من طلبهم ويعمل كتحقق مما إذا كان هناك نوع من بيانات بيانات DAGAGRAM المفقودة المفقودة أو rangeNumber الخاطئ تم استخدامه في الإرسال أو أي سبب آخر.
receivedPacketsBaseIndex : يزيد فقط إذا كان بيانات بيانات DATAGRAM Reliable or in sequence
receivedPacketQueue : إنه شيء يقوم بتخزين rangeNumber بيانات البيانات الصالحة كمفتاح في القائمة وقيمته ليس صحيحًا ، فقد يكون هذا خطأ ، ولكن بعد تلبية بعض التدوينات التي سيتم ذكرها أدناه (تعني كاذبة أننا حصلنا عليها بشكل جيد وصحيح أننا لم نحصل عليها ببراعة) وأنها هي بنية البيانات هي DS_Queue (تحقق من المحاكاة الأصلية بالنسبة إلى).
للعثور على عدد الفتحة ، قم بطرح rangeNumber DATAGRAM التي تم استلامها باستخدام receivedPacketsBaseIndex وأن الزيادات في الممتلكات في كل مرة لا يوجد فيها عدد من الثقب ( receivedPacketsBaseIndex يزيد فقط إذا Reliable or in sequence ).
receivedPacketQueue إذا كان موجودًا وأضف (مسبقًا) زيادة receivedPacketsBaseIndex .uint24 التي bitwise right shifted بمقدار 1 ، فهي عبارة عن حزمة مكررة (تخطي وافعل ما هو مطلوب).receivedPacketQueuereceivedPacketQueue ولم يكن متساويًا للخطأ ، فقم بملء الفتحة عن طريق استبدال مفتاح عدد الفتحة في receivedPacketQueue مع مفتاح أن القيمة تساوي كاذبة.إذا لم يتم الوفاء بهذه الشروط المذكورة بعد ذلك:
bitwise and uint32 Max Value إذا لزم الأمر) أكبر من حجم receivedPacketQueue ، فاملأه عن طريق دفع القيم الحقيقية في قائمة الانتظار. بعد ذلك ، يمكنك إنشاء حلقة والتحقق مما إذا كان الحجم receivedPacketQueue أكبر من 0 ، والقيمة الأولى لـ receivedPacketQueue خاطئة ثم قم بإزالة العنصر الأخير من receivedPacketQueue ثم زيادة receivedPacketsBaseIndex .
بعد ذلك يمكنك التعامل مع مخططات بيانات صالحة بشكل طبيعي.
يمثل هذا الهيكل كبسولة في alvaldatagram.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| مصداقية | 3 بت | كبير إنديان | نوع الموثوقية المستخدمة |
| issegressed | قليل | ن/أ | إذا كان ذلك صحيحًا ، يتم تقسيم الحزمة |
| مقاس | uint16 | كبير إنديان | حجم حقل المخزن المؤقت هناك في البتات |
| ReliableCapsuleIndex | uint24 | ليتل إنديان | الفهرس المستخدم للحزم الموثوقة (يعني استخدام الموثوقية لهذا) |
| sequencedcapsuleIndex | uint24 | ليتل إنديان | الفهرس المستخدم للحزم المتسلسلة (يعني استخدام الموثوقية لهذا) |
| ترتيب | capsulearrangement | ن/أ | ترتيب الكبسولة المستخدمة للحزم المتسلسلة والمرتبة (يعني استخدام الموثوقية لهذا) |
| شريحة | كبسولات | ن/أ | جزء من الكبسولة المستخدمة عندما يتم تجزئة الكبسولة |
| المخزن المؤقت | المخزن المؤقت | ن/أ | بيانات عازلة تحتوي على البيانات المطلوبة من خلال الشبكات |
يمثل هذا الهيكل ترتيب كبسولة في appalDatagram.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| QuartedCapsuleIndex | uint24 | ليتل إنديان | فهرس الكبسولة المرتبة |
| ترتيب | uint8 | ن/أ | القناة المستخدمة للترتيب |
يمثل هذا الهيكل تجزئة كبسولة في alvaldatagram.
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| مقاس | uint32 | كبير إنديان | حجم الجزء |
| بطاقة تعريف | uint16 | كبير إنديان | معرف فريد مرتبط بالقطاع |
| فِهرِس | uint32 | كبير إنديان | فهرس القطاع |
يتم تعيين كل بيانات DAGAGRAM المرسلة في RAKNET نوع موثوقية يحدد كيفية التعامل مع البيانات بواسطة البروتوكول. يسرد الجدول التالي أنواع الموثوقية المتاحة وخصائصها:
| اسم | بطاقة تعريف | موثوق | مرتبة | متسلسل | الخصائص/الميزات |
|---|---|---|---|---|---|
| غير موثوق | 0 | لا | لا | لا | يرسل هذا النوع من الموثوقية بيانات البيانات دون أي ضمانات بأنها ستصل إلى الوجهة. ليس مضمونًا لتسليمهم بأي أمر محدد أو على الإطلاق |
| غير راسخ | 1 | لا | نعم | نعم | يرسل هذا النوع من الموثوقية بيانات البيانات دون أي ضمانات بأنها ستصل إلى الوجهة ولكنها تضمن تسليمها في التسلسل الذي تم إرسالهم |
| موثوق | 2 | نعم | لا | لا | يرسل TypeID الموثوقية هذا المخططات المضمونة لتسليمها بالترتيب الذي تم إرساله. إذا فقدت مخطط بيانات ، فسيقوم Raknet بإعادة إرساله حتى يتم الاعتراف به من قبل المتلقي |
| ReliableArranged | 3 | نعم | نعم | لا | يرسل TypeID الموثوقية هذا المخططات المضمونة لتسليمها بالترتيب الذي تم إرساله. إذا فقدت مخطط البيانات ، فلن يتم إعادة تقسيمه إلى Raknet وجميع مخططات البيانات قبل ذلك لم يتم الاعتراف به |
| ReliaribleSequended | 4 | نعم | نعم | نعم | يرسل TypeID الموثوقية هذا المخططات المضمونة لتسليمها بالترتيب الذي تم إرساله ويضمن تسليمها بالتتابع |
| غير موثوق به معاكشيب | 5 | لا | لا | لا | يرسل TypeID الموثوقية هذا البيانات دون أي ضمانات بأنها ستصل إلى الوجهة ، لكن المتلقي يرسل إيصال إقرار عند استلام بيانات البيانات هذه |
| موثوقة معاكريسيب | 6 | نعم | لا | لا | يرسل TypeID الموثوقية هذا المخططات المضمونة التي يتم تسليمها بالترتيب الذي تم إرساله ، ويرسل المتلقي إيصال إقرار عند استلام بيانات البيانات هذا |
| ReliableArrangedwithackReceipt | 7 | نعم | نعم | لا | يرسل نوع الموثوقية هذا datagrams مضمونة لتسليمها بالترتيب الذي تم إرساله ولكن جميع مخططات البيانات قبل ذلك لم يتم الاعتراف به ، ويرسل المتلقي إيصال إقرار عند استلام مخطط البيانات هذا |
هنا يمكنك العثور على كل تعريف موثوقية يتم استخدامه في أماكن أخرى في الوثائق.
Sequenced الموثوقية وترتيب موثوق وموثوق بها مع ACK recepitيستخدم Raknet إعادة تقسيم التكرار الانتقائي لضمان توصيل موثوق من بيانات البيانات. عند إرسال مخطط البيانات ، يتم تعيين رقم تسلسل. إذا لم يتم الاعتراف بمخطط البيانات خلال فترة مهلة معينة ، فسيقوم Raknet بإعادة إرسال بيانات البيانات باستخدام نفس رقم التسلسل. عندما يتلقى المتلقي بيانات بيانات مكررة مع نفس رقم التسلسل ، يمكنه تجاهله ، لأنه قد أقر بالفعل رقم التسلسل.
يتم استخدام Ackqueue و Nackqueue لتتبع أي مخططات البيانات التي تم الاعتراف بها والتي لم تفعل ذلك. يخزن Ackqueue قائمة بأرقام تسلسل بيانات البيانات التي تم الاعتراف بها بنجاح ، بينما يقوم Nackqueue بتخزين قائمة بأرقام تسلسل بيانات البيانات التي لم يتم الاعتراف بها وتحتاج إلى إعادة إرسالها. عندما يتم استلام بيانات البيانات برقم تسلسل تم الاعتراف به بالفعل ، يمكن التخلص منه.
PacketPair هي تقنية تستخدمها Raknet لتحسين كفاءة عمليات إعادة نقل البيانات. عندما يتم الاعتراف بمخطط البيانات ، يرسل Raknet بيانات البيانات التالية في التسلسل أيضًا. يتيح ذلك للمستقبل البدء في معالجة بيانات البيانات التالية على الفور ، مما يقلل من الكمون وتحسين الإنتاجية.
ContinuousEnd هي ميزة Raknet تتيح إرسال DataGrams باستمرار دون انتظار الاعتراف. يمكن أن يحسن هذا الأداء في بعض الحالات ، ولكنه يمكن أن يؤدي أيضًا إلى فقدان الحزم وإعادة الإرسال ، لأن المرسل لا ينتظر التعليقات قبل إرسال بيانات البيانات التالية.
يستخدم Raknet آلية إعادة التجميع لإعادة بناء بيانات البيانات المجزأة التي قد يتم استلامها خارج الترتيب. عند تجزئة مخطط البيانات ، يتم تعيين معرف فريد من نوعه. عندما يتلقى المتلقي جزءًا ، يتم تخزينه حتى يتم استلام جميع الأجزاء ذات المعرف نفسه. بمجرد استلام جميع الأجزاء ، يتم إعادة تجميعها في بيانات البيانات الأصلية.
التحكم في التدفق هو آلية raknet المستخدمة لإدارة معدل انتقال البيانات بين المرسل والمستقبل. إنه يضمن أن يتمكن المتلقي من التعامل مع البيانات الواردة بوتيرة يمكن معالجتها ، مما يمنع الساحق أو التغلب على المخزن المؤقت للمستقبل. يساعد التحكم في التدفق على الحفاظ على توازن بين سرعة نقل المرسل وقدرة معالجة المتلقي ، مما يؤدي إلى تحسين الكفاءة الكلية للاتصال واستقرارها.
يحمل مدير الازدحام التحكم في الازدحام ، والتحقق من أرقام النطاق المتخطي لإرسال Nacks ، وأشياء أخرى.
تودو: أضف المستند
التحكم في الازدحام هو تقنية Raknet المستخدمة لمنع احتقان الشبكة من خلال موازنة معدلات نقل البيانات. يتم استخدام تقنيات مثل التحكم في احتقان TCP ، وإسقاط الحزم ، والحد من الأسعار ، وتشكيل حركة المرور ، و جودة الخدمة ، وموازنة التحميل. تضمن هذه التقنيات توصيل بيانات موثوق بها ونقل فعال في Raknet.
يعزز التجزئة في Raknet تسليم البيانات عن طريق تقسيم الرسائل الكبيرة إلى شرائح أصغر. تضمن هذه الأجزاء ، التي تشير إلى الموضع والحجم ، إعادة التجميع الناجح على نهاية المتلقي. من خلال مقارنة حجم المخزن المؤقت بحجم وحدة الإرسال القصوى (MTU) ، إذا تجاوز المخزن المؤقت MTU ، فسيتم تقسيمه إلى شرائح للإرسال. تمنع هذه الآلية في Raknet فقدان البيانات ، وتدير الحمولات الكبيرة ، وتضمن نقل موثوق في التطبيقات الشبكية.
يمثل "B" سعة الارتباط أو الحد الأقصى للبيانات التي يمكن إرسالها في الثانية على رابط الشبكة. يتم تحديد سعة الارتباط من خلال عوامل متعددة ، بما في ذلك البنية التحتية للشبكة ، وتكوين الشبكة ، والموارد المتاحة. باستخدام قيمة التعويم ، يمكن تمثيل سعة الشبكة بدقة ودقيقة ، مما يتيح الاستخدام الأفضل للموارد المتاحة.
يمثل "AS" معدل وصول البيانات ، وهو المعدل الذي يتم فيه إنشاء البيانات وإرسالها بواسطة المرسل. يسمح استخدام قيمة التعويم بتمثيل أكثر دقة لمعدل الوصول ، والذي يمكن أن يختلف بناءً على متطلبات التطبيق وشروط الشبكة. من خلال مقارنة معدل الوصول بسعة الارتباط ، يمكن للمرسل تحديد مقدار البيانات التي يمكن إرسالها عبر رابط الشبكة دون التسبب في ازدحام أو تدهور الأداء.
لتحديد حجم الكبسولة ، يمكنك اتباع هذه الخطوات:
reliableCapsuleIndex .sequencedCapsuleIndex .arrangedCapsuleIndex ، ثم بخطوة واحدة لترتيب arrangementChannel .size ، و 2 خطوات id ، و 4 خطوات index القطاع. معرف userpacketenum هو 0x86 ، والذي يمثل بداية المكان الذي يمكنك البدء فيه باستخدام معرفات الحزمة المخصصة.
ما هو موصى به هو إنشاء PacketAggregator مع الأخذ في الاعتبار أن لديك تطبيق مكتمل ثم إرساله واستلامه.
يمكنك وضع معرف من اختيارك ، مثل: UserPacketEnumID + معرفك الخاص (يجب ألا يجعل UserPacketEnumID يتجاوز uint8 limit )
على سبيل المثال: UserPacketEnumID + 22 = 0x9c
بنية حزمة بسيطة تعرض ما يمكن أن يكون عليه PacketAggregator :
| مجال | يكتب | endianness | ملحوظة |
|---|---|---|---|
| بطاقة تعريف | uint8 | ن/أ | معرف فريد من الحزمة |
| الضغط | uint8 | خوارزمية الضغط [يمكن أن تكون لا شيء ، openssl ، zlib ، gzip ، snappy ، أي شيء] | |
| تيارات | المخزن المؤقت [] | تمثل مجموعة من تدفقات الحزم (كل عنصر في صفيف التدفقات مخزنًا مؤقتًا للحزمة مشفرة/يتم فك compressionAlgorithm |
بعد ذلك سترسله في مخزن الكبسولة/s datagram الصالحة
لإرسال حزمة غير راكنيت ، حدد أولاً ما إذا كان هناك حاجة للتجزئة من خلال مقارنة ما إذا كان حجم المخزن المؤقت للكبسولة أكبر من حجم MTU ناقصًا 2 ، بالإضافة إلى 3 ، بالإضافة إلى 4 مرات 1 (لطول رأس بيانات بيانات البيانات) ، وطرح 11 إذا كان الأمان قيد الاستخدام. ثم ، قم بطرح القيمة المحددة بحجم الكبسولة. إذا كان التجزئة ضروريًا ، فقم بتجميع دفق الكبسولة قبل إضافته إلى قائمة انتظار بيانات DATAGRAM للإرسال. إذا لم يكن هناك حاجة إلى تجزئة ، فأضفه مباشرة إلى قائمة الانتظار. تذكر أن الحزم المقطوعة يجب ألا تكون غير موثوقة ؛ إذا كانوا كذلك ، قم بتحويلها إلى حزم موثوقة لضمان تسليم ناجح ومرس لجميع قطع غيار الحزم.
طريقة تقسيمها إلى أجزاء:
احصل على حجم الكبسولة وأيضًا حجم المخزن المؤقت للكبسولة ، ثم الحجم الذي استخدمته للتحقق مما إذا كان أكبر من حجم المخزن المؤقت للكبسولة وتحديده.
to get the count of how many segments is needed to be made: subtract the capsule buffer size with 1 then divide it with the size that you used to check if is greater than the capsule buffer size then sum them with 1 (not two times) or you can ceil instead of subtracting 1 and adding 1 at the end
then define a current segment index outside the loop and is 0 by default
then do a loop that will use the count of how many segments then the segmentation process will start:
after that define a variable representing start offset and it is equals to current segment index multiplied by the size that you used to check if is greater than the capsule buffer size
after that define a variable representing bytes to send that is equals to capsule buffer size subtracted by start offset
check if bytes to send is greater than the size that you used to check if is greater than the capsule buffer size and if true set the bytes to send value to the size that you used to check...
after that create a new variable representing the end offset
check if the bytes to send is not the size that you used to check if is greater than the capsule buffer size then set the end offset to the capsule buffer size subtracted by the current segment index multiplied by the size that you used to check if is greater than the capsule buffer size
if the check fails then the end offset will be the bytes to send
after that slice the capsule buffer with the start offset and end offset then you can do the feilds in the capsule.
you will need an array that has the capsules that contains the segments that will then be sent in queue.
the segment id will be the sender last segment id property that will increment outside the loop every time.
Here are a list of resources to help you better understand the RakNet protocol: