UDP (User Datagram Protocol) هو بروتوكول لنقل البيانات بدون اتصال يعمل عبر IP ويوفر زمن وصول أدنى عند إرسال البيانات. على عكس TCP، لا يضمن UDP التسليم أو ترتيب الحزم أو الحماية من الازدواجية. وفقًا لـ IETF RFC 768 (2024)، UDP يعالج أكثر من 40% من حركة المرور العالمية على الإنترنت بفضل مكالمات الفيديو والبث المباشر واستعلامات DNS.
الخلاصة
UDP (User Datagram Protocol) هو أحد البروتوكولات الرئيسية لطبقة النقل في نموذج TCP/IP، صممه David Reed في عام 1980. يوفر آلية نقل بيانات بسيطة: يرسل التطبيق بيانات، ولا يتتبع البروتوكول ما إذا وصلت إلى المستلم.
يتكون رأس UDP من أربعة حقول فقط: منفذ المصدر ومنفذ الوجهة والطول والمجموع الاختباري. كل حقل يستهلك 2 بايت، لذا فإن الحجم الإجمالي للرأس هو 8 بايت. للمقارنة، رأس TCP بدون خيارات يبلغ 20 بايت، ومع الخيارات — حتى 60 بايت.
البروتوكول لا يدعم التجزئة على مستواه الخاص — إذا تجاوزت البيانات MTU (وحدة الإرسال القصوى)، يتم تجزئتها على مستوى IP. إذا فقد جزء واحد، يتم تجاهل البيانات بالكامل، لأن UDP لا يمكنه طلب إعادة إرسال الأجزاء الفردية. يجب على المطورين التحكم في حجم البيانات — للشبكات المحمولة، غالبًا ما تكون MTU 1400 بايت، لذا يجب ألا يتجاوز الحجم الأقصى هذه القيمة.
يقوم التطبيق الذي يستخدم UDP بإنشاء مقبس من نوع SOCK_DGRAM، ويحدد المنفذ وعنوان IP الوجهة ويرسل البيانات. يضيف البروتوكول رأسًا بسيطًا ويمرر الحزمة إلى طبقة IP. يستمع المستقبل على منفذه ويستخرج البيانات من الرسائل الواردة.
لا يقوم UDP بالتحكم في الازدحام — يمكن للتطبيق إرسال البيانات بأقصى سرعة تدعمها الشبكة. قد يؤدي هذا إلى ازدحام القناة، ولكن في السيناريوهات في الوقت الفعلي، هذا التصرف مبرر: لمكالمة الفيديو، تدفق البيانات مع فقد محتمل أهم من إيقاف الإرسال.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()
في هذا المثال، يتم إنشاء مقبس SOCK_DGRAM لـ UDP. يرسل sendto البيانات دون إنشاء اتصال — يكفي معرفة IP ومنفذ المستلم. يقوم recvfrom على جانب الخادم بإرجاع كل من البيانات وعنوان المرسل للرد. يتم تكوين مقابس UDP على المنصات المحمولة بشكل مشابه ولكنها تتطلب أذونات إضافية: على iOS، يجب إضافة NSAppTransportSecurity للاتصالات UDP غير المشفرة، وعلى Android، إذن INTERNET في البيان.
اختيار UDP مبرر في السيناريوهات حيث السرعة أهم من الموثوقية. لا يضيع البروتوكول وقتًا في إنشاء الاتصال والتأكيدات وإعادة الإرسال — وهذا يوفر زمن وصول أدنى، لكنه يتطلب من المطور معالجة الفقد بشكل مستقل.
| المزايا | العيوب |
|---|---|
| زمن وصول منخفض — بدون مصافحة | لا يوجد ضمان للتسليم |
| رأس أصغر — 8 بايت | لا يوجد تحكم في الازدحام |
| دعم البث العام والبث المتعدد | احتمال ازدواجية الحزم |
| استقلال البيانات — بدون طوابير | حجم البيانات محدود بـ MTU |
في تطبيقات الجوال، يُستخدم UDP من خلال أطر عمل مثل WebRTC، التي تضيف التحكم في الفقد ومعدل البت التكيفي ومخزن التذبذب فوق UDP. هذا يوفر فوائد السرعة دون عيوب البروتوكول المجرد.
جانب مهم آخر لـ UDP هو غياب التحكم في الازدحام. في TCP، تقوم خوارزميات Slow Start و Congestion Avoidance بتقليل سرعة الإرسال عند فقدان الحزم لتجنب ازدحام الشبكة. يفتقر UDP إلى مثل هذه الآليات، لذلك يجب على المطورين تنفيذ استراتيجيات التحكم في السرعة الخاصة بهم — على سبيل المثال، معدل البت التكيفي في مكالمات الفيديو أو تحديد المعدل في خوادم الألعاب لمنع الازدحام الزائد للشبكة.
UDP لا غنى عنه في السيناريوهات حيث تحمل زمن الوصول أهم من تحمل فقدان الحزم. دعنا نستكشف المجالات الرئيسية لاستخدام البروتوكول في تطوير الجوال والويب.
بروتوكولات RTP و RTSP، التي تعمل عبر UDP، تُستخدم لنقل تدفقات الصوت والفيديو في الوقت الفعلي. WebRTC — معيار مكالمات الفيديو في المتصفحات وتطبيقات الجوال — يستخدم UDP كوسيلة نقل رئيسية لبيانات الوسائط و TCP للإشارات. فقدان حزمة واحدة في فيديو 30 إطارًا في الثانية غير ملحوظ للمستخدم، على عكس تأخير إعادة الإرسال الذي يسبب تجمدًا ملحوظًا للصورة.
تتطلب ألعاب التصويب متعددة اللاعبين و MOBA زمن وصول أقل من 50 مللي ثانية للمزامنة الصحيحة. UDP ينقل مواقع اللاعبين والطلقات والأحداث أسرع من TCP، ويتم تجاهل فقدان الحزمة ببساطة — سيصل التحديث التالي خلال 16–33 مللي ثانية. تستخدم محركات الألعاب الشهيرة، بما في ذلك Unity و Unreal Engine، UDP عبر طبقات النقل الخاصة بها مع إضافة الموثوقية للأحداث الحرجة من خلال التأكيدات على مستوى التطبيق.
تستخدم استعلامات DNS UDP على المنفذ 53 لأن كل استعلام هو حزمة صغيرة واحدة (عادةً حتى 512 بايت). إذا لم يصل رد، يقوم العميل ببساطة بإعادة المحاولة بعد مهلة، وهو أسرع من إنشاء اتصال TCP بمصافحته ثلاثية الاتجاهات. DHCP يعمل أيضًا عبر UDP، لأن العميل ليس لديه عنوان IP بعد ولا يمكنه إنشاء اتصال TCP، بينما تسمح حزم UDP للبث العام بالعثور على خادم DHCP على الشبكة المحلية.
الاختيار بين UDP و TCP هو مقايضة بين السرعة والموثوقية. كل بروتوكول مثالي لفئة مهامه، وفهم اختلافاتهما يساعد في اتخاذ القرارات المعمارية الصحيحة عند تصميم الاتصال الشبكي في تطبيقات الجوال.
| المعيار | UDP | TCP |
|---|---|---|
| إنشاء الاتصال | غير مطلوب | مصافحة ثلاثية |
| الرأس | 8 بايت | 20–60 بايت |
| ضمان التسليم | لا | نعم، مع التأكيد |
| الترتيب | لا | نعم |
| التحكم في الازدحام | لا | نعم (AIMD، Slow Start) |
| حالات الاستخدام | البث، الألعاب، DNS | الويب، البريد، الملفات، API |
غالبًا ما تستخدم مشاريع الجوال نهجًا هجينًا: TCP للطلبات الموثوقة (المصادقة، تحميل البيانات) و UDP لتدفقات الوسائط. QUIC — بروتوكول حديث من Google يعمل عبر UDP — يجمع بين سرعة UDP وموثوقية TCP ويُستخدم بالفعل في HTTP/3.
دعنا نلقي نظرة على خادم UDP بسيط بلغة Python يستقبل الرسائل من العملاء ويرسل ردًا. يستمع الخادم على المنفذ 8888 ويعالج البيانات الواردة في حلقة لا نهائية.
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('تم بدء تشغيل خادم UDP على المنفذ 8888')
while True:
data, addr = server.recvfrom(1024)
print(f'تم الاستلام من {addr}: {data.decode()}')
server.sendto(b'OK', addr)
يقوم الخادم بإنشاء مقبس UDP، ويرتبط بالمنفذ 8888، وينتظر البيانات الواردة. recvfrom يُرجع البيانات وعنوان العميل، مما يسمح بالرد عبر sendto. على عكس TCP، لا يحتفظ الخادم بحالة الاتصال — تتم معالجة كل حزمة بشكل مستقل. هذا يجعل خوادم UDP قابلة للتوسع: يمكن لخادم واحد معالجة ملايين العملاء دون تخصيص ذاكرة لكل اتصال فردي، وهو أمر مهم لخوادم DNS وأنظمة مطابقة الألعاب.
في تطوير الجوال، يُستخدم UDP غالبًا من خلال مكتبات عالية المستوى. على سبيل المثال، CocoaAsyncSocket لنظام iOS يوفر مقابس UDP مع مفوضين و GCD للمعالجة غير المتزامنة للأحداث. على Android، فئة DatagramSocket هي جزء من المكتبة القياسية java.net ولا تتطلب تبعيات إضافية. بالنسبة لـ Flutter، توجد حزمة udp التي توفر واجهة بسيطة لإرسال واستقبال البيانات دون تكوين مقابس أصلية.
من المهم ملاحظة أن العديد من الشبكات المحمولة وجدران الحماية المؤسسية تحجب حركة UDP، خاصة على المنافذ فوق 1024. إذا كان تطبيقك يستخدم UDP، يجب عليك توفير احتياطي لـ TCP أو التحقق من توفر البروتوكول عبر خوادم STUN، كما يفعل WebRTC. على iOS، إطار النظام Network.framework مع NWConnection يدعم كلاً من TCP و UDP، ويختار تلقائيًا البروتوكول الأمثل بناءً على التوفر. للتطبيقات في الوقت الفعلي، يُوصى أيضًا بتنفيذ معدل بت تكيفي يقلل جودة التدفق عند فقدان الحزم، مما يضمن تشغيلًا مستمرًا حتى على القنوات غير المستقرة مع معدلات خطأ عالية.
الأسئلة الشائعة
UDP لا ينشئ اتصالًا ولا يضمن تسليم الحزم، مما يجعله أسرع من TCP. رأس UDP هو 8 بايت مقابل 20–60 بايت لـ TCP. UDP مناسب للبث والألعاب، بينما TCP لطلبات الويب ونقل الملفات.
البيانات هي حزمة مستقلة برأس UDP (منفذ المصدر، منفذ الوجهة، الطول، المجموع الاختباري). تتم معالجة كل حزمة بشكل مستقل، دون علاقة بالحزم السابقة. حجم البيانات محدود بـ MTU للشبكة وحسب المواصفات — حتى 65507 بايت.
UDP لا يوفر الموثوقية على مستوى النقل — يتم تنفيذها بواسطة التطبيق. يضيف المطورون أرقامًا تسلسلية ومجاميع اختبارية وطلبات إعادة إرسال وتصحيح الأخطاء. FEC (تصحيح الأخطاء الأمامي) يسمح باستعادة الحزم المفقودة دون إعادة إرسال.
UDP غير مناسب للسيناريوهات حيث سلامة البيانات حرجة: نقل الملفات، المعاملات المصرفية، REST API. في هذه الحالات، TCP يضمن وصول كل بايت بالترتيب الصحيح. لا يُوصى أيضًا بـ UDP على القنوات غير المستقرة مع معدلات فقد عالية.
QUIC هو بروتوكول نقل يعمل عبر UDP، طورته Google ووحدته IETF كـ RFC 9000. يجمع بين سرعة UDP وموثوقية TCP، ويدعم تعدد الإرسال دون حظر رأس الخط، ويحتوي على تشفير مدمج. HTTP/3 يستخدم QUIC كطبقة نقل له.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا