كتابة موثوقة تماما أمر الإرسال المتعدد النظام في بايثون

StackOverflow https://stackoverflow.com/questions/176179

سؤال

يجب أن تكتب موثوقة تماما أمر الإرسال المتعدد نظام من الصفر في بيثون.لا يمكنني استخدام أي من المكتبات الخارجية.أنا السماح لاستخدام المركزي المنظم.

يبدو أن هناك اثنين فورية النهج:

  1. كتابة نظام فعال ، ربط معرف فريد لكل multicasted الرسالة ، وجود المنظم المتعدد تسلسل أرقام معرف الرسالة هي التي تتلقاها ، و إرسال ذهابا وإيابا ACK و NACK هو.
  2. الكتابة غير فعالة الفيضانات ، حيث كل multicaster ببساطة إعادة يرسل كل رسالة تتلقاها مرة واحدة (إلا إذا تم إرسالها من قبل هذا خاص multicaster.)

أنا السماح لاستخدام الخيار الثاني ، وأنا أميل إلى ذلك.

أنا حاليا المتعدد UDP الرسائل (التي يبدو أن الخيار الوحيد،) ولكن هذا يعني أن بعض الرسائل قد تضيع.هذا يعني أنني يجب أن تكون قادرة على تحديد فريد لكل أرسلت UDP الرسالة, بحيث يمكن إعادة إرسالها وفقا #2.يجب أن تولد حقا فريدة من نوعها أرقام (على سبيل المثالباستخدام عنوان المرسل و عداد) و حزمة لهم في كل UDP الرسالة المرسلة ؟ كيف لي أن أفعل ذلك ؟ و كيف يمكنني الحصول على واحد UDP رسالة في بيثون ، وليس تيار من البيانات (أي socket.recv)?

هل كانت مفيدة؟

المحلول

الفيضانات النهج يمكن أن يسبب سوء الحالة سوءا.إذا الرسائل انخفض بسبب ارتفاع أحمال الشبكة ، بعد كل عقدة إرسال كل رسالة سيجعل الوضع أسوأ.

أفضل نهج يعتمد على طبيعة البيانات التي تقوم بإرسالها.على سبيل المثال:

  1. بيانات الوسائط المتعددة:لا إعادة المحاولة ، انخفض الحزمة هو إسقاط الإطار الذي لا يهم عند الإطار التالي يحصل هناك على أي حال.
  2. فترة محددة من البيانات:المتلقي عقدة يحتفظ توقيت إعادة تعيين كل مرة تلقي تحديث.إذا كان انتهاء الوقت ، وتطلب المفقود التحديث من عقدة رئيسية.المحاولات يمكن الإرسال إلى طلب عقدة.

إذا لم يكن أي من هذه الحالات ينطبق على (كل الحزمة التي تلقاها كل عقدة و الحزمة توقيت لا يمكن التنبؤ بها ، لذا المستفيدين لا يمكن الكشف عن غاب الحزم من تلقاء نفسها) ، ثم الخيارات الخاصة بك وتشمل:

  1. صراحة ACK من كل عقدة لكل حزمة.المرسل إعادة المحاولة (الإرسال) أي الحزم لا ACKed.
  2. المستندة إلى TCP / شبكة النهج ، حيث كل عقدة يدويا يكرر تلقى الحزم إلى الجار العقد ، والاعتماد على TCP آليات لضمان التسليم.

أنت يمكن أن تعتمد على المستفيدين يلاحظ غاب حزم عند استقبال واحد في وقت لاحق مع رقم تسلسل, ولكن هذا يتطلب المرسل للحفاظ على حزمة حولها حتى إضافي واحد على الأقل الحزمة يتم إرسالها.مما يتطلب إيجابية ACKs هو أكثر موثوقية (و يمكن اثباتها).

نصائح أخرى

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

إذا كنت تتوقع هذا الحجم إلى عدد كبير من الأهداف لكل عقدة كمية كبيرة من البيانات ثم قد تجد أن النفقات العامة إضافة ACK/ناك إلى كل حزمة كافية سلبا الحد من الإنتاجية ، وخاصة عند إضافة الإرسال إلى المزيج.

كما فرانك Szczerba وقال بيانات الوسائط المتعددة لديه فائدة أن يكون قادرا على التعافي من الحزم المفقودة.إذا كان لديك أي سيطرة على البيانات التي ترسلها عليك أن تحاول تصميم الحمولات بحيث يمكنك الحد من التعرض إسقاط الحزم.

إذا كانت البيانات التي كنت ترسل لا يمكن أن يتسامح مع إسقاط الحزم و أنت تحاول تحجيم عالية استخدام الشبكة ثم ربما udp ليست أفضل بروتوكول.تنفيذ سلسلة من tcp وكلاء (حيث كل عقدة retransmits, الإرسال, إلى العقد متصلة - على غرار الفيضانات الخاص بك فكرة) سيكون أكثر موثوقية آلية.

مع كل ذلك قال: هل يعتبر صحيح باستخدام الإرسال المتعدد على هذا الطلب ؟


فقط رأيت "الواجبات" الوسم...هذه الاقتراحات قد لا تكون مناسبة المنزلية المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top