سؤال

إذا كان لديك موقف حيث من المحتمل أن يكون اتصال TCP بطيئًا جدًا ومن المحتمل أن يكون "اتصال" UDP غير موثوق به للغاية، فماذا تستخدم؟هناك العديد من بروتوكولات UDP القياسية والموثوقة، ما هي تجاربك معهم؟

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

أنا مهتم بالخيارات المتنوعة هنا، والتي يوجد منها TCP في أحد طرفي المقياس وUDP في الطرف الآخر.تتوفر العديد من خيارات UDP الموثوقة، وكل منها يجلب بعض عناصر TCP إلى UDP.

أعلم أن بروتوكول TCP غالبًا ما يكون الاختيار الصحيح، لكن وجود قائمة بالبدائل غالبًا ما يكون مفيدًا في مساعدة الشخص على التوصل إلى هذا الاستنتاج.أشياء مثل Enet وRUDP وما إلى ذلك المبنية على UDP لها إيجابيات وسلبيات مختلفة، هل استخدمتها، ما هي تجاربك؟

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

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

المحلول

من الصعب الإجابة على هذا السؤال دون بعض المعلومات الإضافية عن مجال المشكلة.على سبيل المثال، ما حجم البيانات الذي تستخدمه؟عدد المرات؟ما هي طبيعة البيانات؟(على سبيل المثال.هل هي فريدة من نوعها، بيانات لمرة واحدة؟أم أنها دفق من بيانات العينة؟وما إلى ذلك) ما هي المنصة التي تقوم بتطويرها؟(على سبيل المثال.سطح المكتب/الخادم/المدمج) لتحديد ما تعنيه بـ "بطيء جدًا" ، ما هي وسيلة الشبكة التي تستخدمها؟

لكن بعبارات عامة (جدًا!) أعتقد أنه سيتعين عليك أن تحاول جاهدًا التغلب على TCP من حيث السرعة، إلا إذا كان بإمكانك وضع بعض الافتراضات الصعبة حول البيانات التي تحاول إرسالها.

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

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

نصائح أخرى

ماذا عن SCTP.إنه بروتوكول قياسي بواسطة IETF (RFC 4960)

لديها القدرة على التقطيع والتي يمكن أن تساعد في السرعة.

تحديث:أ مقارنة بين TCP وSCTP يوضح أن العروض قابلة للمقارنة ما لم يمكن استخدام واجهتين.

تحديث:أ مقالة تمهيدية لطيفة.

إينيت - http://enet.bespin.org/

لقد عملت مع ENET كبروتوكول UDP موثوق وكتبت نسخة صديقة للمآخذ غير المتزامنة لعميل يستخدمه في خوادمه.إنه يعمل بشكل جيد جدًا ولكني لا أحب الحمل الذي يضيفه اختبار ping من نظير إلى نظير إلى الاتصالات الخاملة ؛عندما يكون لديك الكثير من الاتصالات، فإن إجراء اختبار الاتصال بها جميعًا بشكل منتظم يعد بمثابة الكثير من العمل المزدحم.

تمنحك ENET خيار إرسال "قنوات" متعددة من البيانات وأن تكون البيانات المرسلة غير موثوقة أو موثوقة أو متسلسلة.ويتضمن أيضًا اختبار ping من نظير إلى نظير المذكور أعلاه والذي يعمل بمثابة استمرارية الحياة.

لدينا بعض عملاء صناعة الدفاع الذين يستخدمون UDT (نقل البيانات المستند إلى UDP) (انظر http://udt.sourceforge.net/) ونحن سعداء جدا به.أرى أن لديه ترخيص BSD ودودًا أيضًا.

رودب - بروتوكول مخطط بيانات المستخدم الموثوق به

وهذا يوفر:

  • إقرار الحزم المستلمة
  • النوافذ والتحكم في الازدحام
  • إعادة إرسال الحزم المفقودة
  • التخزين المؤقت الزائد (أسرع من البث في الوقت الفعلي)

يبدو الأمر أكثر قابلية للتكوين قليلاً فيما يتعلق بالحفاظ على الحياة ثم ENet ولكنه لا يوفر لك العديد من الخيارات (على سبيل المثال.جميع البيانات موثوقة ومتسلسلة وليس فقط البتات التي تقررها).يبدو الأمر مستقيمًا إلى حد ما للتنفيذ.

كما أشار الآخرون، سؤالك عام جدًا، وما إذا كان شيء ما "أسرع" من TCP أم لا يعتمد كثيرًا على نوع التطبيق.

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

هناك حل وسط سهل. خوارزمية نيجل هو جزء من TCP الذي يساعد على ضمان عدم قيام المرسل بإرباك جهاز الاستقبال بتدفق كبير من البيانات، مما يؤدي إلى الازدحام وفقدان الحزمة.

إذا كنت بحاجة إلى تسليم موثوق ومنظم لـ TCP، وأيضًا استجابة سريعة لـ UDP، ولا داعي للقلق بشأن الازدحام الناتج عن إرسال تدفقات كبيرة من البيانات، فيمكنك تعطيل خوارزمية Nagle:

int opt = -1;
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)))
  printf("Error disabling Nagle's algorithm.\n");

يجب على أي شخص يقرر أن القائمة أعلاه ليست كافية ويريد تطوير UDP الموثوق به أن يلقي نظرة على مواصفات Google QUIC حيث أن هذا يغطي الكثير من الحالات المعقدة وهجمات رفض الخدمة المحتملة.لم أجرب تنفيذ هذا بعد، وقد لا تريد أو تحتاج إلى كل ما يقدمه، ولكن الوثيقة تستحق القراءة قبل الشروع في تصميم UDP جديد "موثوق".

نقطة انطلاق جيدة لـ QUIC هي هنا, ، في مدونة Chromium.

يمكن العثور على وثيقة تصميم QUIC الحالية هنا.

إذا كان لديك موقف حيث من المحتمل أن يكون اتصال TCP بطيئًا جدًا ومن المحتمل أن يكون "اتصال" UDP غير موثوق به للغاية، فماذا تستخدم؟هناك العديد من بروتوكولات UDP القياسية والموثوقة، ما هي تجاربك معهم؟

الكلمة الأساسية في الجملة الخاصة بك هي "يحتمل".أعتقد أنك تحتاج حقًا إلى أن تثبت لنفسك أن TCP، في الواقع، بطيء جدًا بالنسبة لاحتياجاتك إذا كنت بحاجة إلى الموثوقية في البروتوكول الخاص بك.

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

بروتوكول DCCP، موحد في آر إف سي 4340, قد يكون "بروتوكول التحكم في ازدحام مخططات البيانات" هو ما تبحث عنه.

يبدو تنفيذها في لينكس.

ربما آر إف سي 5405, ، ستكون "إرشادات استخدام Unicast UDP لمصممي التطبيقات" مفيدة لك.

هل فكرت في ضغط بياناتك؟

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

رودب.تنفذ العديد من خوادم المقبس للألعاب شيئًا مشابهًا.

أفضل طريقة لتحقيق الموثوقية باستخدام UDP هي بناء الموثوقية في برنامج التطبيق نفسه (على سبيل المثال، عن طريق إضافة آليات الإقرار وإعادة الإرسال).

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