9.9. UDP -- أرسل حزمة وتمنّ الأفضل¶
إن UDP، أو بروتوكول مخطط بيانات المستخدم (User Datagram Protocol)، هو الأبسط من بين الخدمتين اللتين تقدمهما طبقة النقل. فكل عملية إرسال عبر UDP هي مخطط بيانات واحد -- كتلة مكتفية بذاتها من البايتات موجهة إلى عنوان IP ومنفذ، تُلقى في الشبكة بمفردها. ويسلّمه البروتوكول إن استطاع؛ وإن لم يستطع، فإنه لا يعيد المحاولة، ولا ينبّه المرسِل، ولا يحافظ على أي ترتيب بين مخططات البيانات.
9.9.1. ما الذي يضيفه UDP إلى IP¶
إن UDP طبقة رقيقة فوق IP. وهو يضيف ثلاثة أشياء إلى التسليم الخام عبر IP:
أرقام المنافذ عند كلا الطرفين، بحيث يمكن تسليم مخطط البيانات إلى البرنامج الصحيح على المضيف الوجهة، لا إلى المضيف فحسب (انظر المنافذ).
حقل الطول بحيث يعرف المستقبِل بالضبط كم بايتاً من الحمولة عليه أن يقرأ.
مجموع تحقّق صغير يشمل الترويسة والحمولة، بحيث يستطيع المستقبِل اكتشاف مخطط بيانات تالف وتجاهله.
هذا كل شيء. فكل ما عداه مما فعله IP أو لم يفعله، يُبقيه UDP على حاله. فمخططات البيانات لا يُعاد إرسالها. وقد تصل بترتيب غير صحيح. وقد تتكرر بسبب خصائص الشبكة الأساسية. وقد تُسقَط بصمت إذا كانت الشبكة مزدحمة، أو كان المخزن المؤقت عند الوجهة ممتلئاً، أو قرر أحد الموجّهات الموجودة في الطريق ذلك.
يُرسَل كل مخطط بيانات UDP على نحو مستقل. وإذا فُقد أحدها أثناء النقل، فلا شيء يُخبر المرسِل أو المستقبِل -- فتظل الفجوة صامتة.¶
9.9.2. لماذا قد يستخدمه أحد¶
إذا كان UDP غير موثوق إلى هذا الحد، فلماذا وُجد أصلاً؟ لثلاثة أسباب.
السرعة وقلة الأعباء. إن إرسال UDP هو حزمة واحدة تخرج؛ بلا مصافحة، ولا إقرارات، ولا حالة اتصال يجب الحفاظ عليها. وتكون تكلفة زمن الاستجابة وعرض النطاق الترددي في حدها الأدنى.
الرسائل المستقلة. بعض حركة المرور عبارة عن تدفق من تحديثات الحالة حيث تكون كل رسالة لقطة جديدة وتصبح القديمة بلا قيمة. فالكاميرا التي تنشر "ما زلت حياً، وها هي قراءتي الحالية" كل ثانية تهتم بتسليم كل قراءة جديدة، لا بإعادة تشغيل القراءات التي فُقدت.
البث المتعدد. يمكن إرسال مخطط بيانات UDP واحد إلى العديد من المستقبِلين في آنٍ واحد. (لا يستطيع TCP فعل ذلك؛ فكل اتصال TCP يكون بين نقطتي نهاية بالضبط.) وهو مفيد لاكتشاف الخدمات، وإرسال القياسات عن بُعد إلى العديد من المستمعين، وبث الفيديو.
حيث تكون الشبكة جيدة ويكون تحمّل المرسِل للفقدان عالياً، يكون UDP هو الجواب الصحيح. وحيث يجب ضمان التسليم والترتيب، يحتاج UDP إما إلى طبقة موثوقية أخرى فوقه، أو ينبغي للتطبيق أن يستخدم TCP بدلاً منه.
9.9.3. متى لا تستخدمه¶
من الجدير بالتوضيح أيضاً العكس. فإن UDP هو الخيار الخطأ عندما:
يهم كل بايت. بيانات التهيئة، وتحديثات الكود، والمعاملات الموقّعة -- أي حالة يجعل فيها بايت مفقود النتيجة خاطئة.
يهم الترتيب. فقد يصل مخطط البيانات UDP رقم 2 قبل مخطط البيانات رقم 1.
تكون الرسالة كبيرة. الحمولات الكبيرة يجب أن يقسّمها التطبيق إلى مخططات بيانات أصغر؛ فطبقة النقل لن تفعل ذلك. وإذا فُقد أي جزء واحد تكون الرسالة بأكملها ناقصة.
إذا انطبق أي من هذه، فالجأ إلى TCP بدلاً منه.
9.9.4. أمثلة ملموسة على كاميرا¶
أمثلة من جانب الكاميرا على حركة مرور UDP في الواقع:
الاكتشاف. تبث الكاميرا مخطط بيانات "من هنا" إلى الشبكة المحلية عند بدء التشغيل؛ فترد الأجهزة الأخرى.
القياس عن بُعد. مرة كل ثانية، ترسل الكاميرا مخطط بيانات صغيراً يحوي قراءات مستشعرها الحالية إلى مُجمِّع. ولا يهم فقدان عينة من حين لآخر لأن العينة التالية تصل بعد ثانية على أي حال.
مزامنة الوقت. يعمل NTP، بروتوكول وقت الشبكة، فوق UDP. فيرسل العميل طلباً صغيراً، ويرد الخادم بالوقت الحالي؛ وإذا فُقد الرد، فإن العميل يطلبه ببساطة مرة أخرى لاحقاً.
عمليات بحث DNS. إن سؤال الشبكة "ما عنوان IP الذي يقابل هذا الاسم؟" يعمل فوق UDP. (مغطّى في الأسماء وDNS.)
إن واجهة Python البرمجية لإرسال مخططات البيانات واستقبالها موجودة في مقابس UDP، بعد أن تكون بقية قصة طبقة النقل قد اكتملت.