udp(7)

الاسم
udp - بروتوكول مخططات بيانات المستخدم للإصدار الرابع من بروتوكول الإنترنت

موجز
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>

udp_socket = socket(AF_INET, SOCK_DGRAM, 0);

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

عند إنشاء مقبس UDP، تكون عناوينه المحلية والبعيدة غير محددة. يمكن إرسال مخططات البيانات فوراً باستخدام sendto(2) أو sendmsg(2) مع عنوان وجهة صالح كوسيط. عند استدعاء connect(2) على المقبس، يُضبط عنوان الوجهة المبدئي ويمكن الآن إرسال مخططات البيانات باستخدام send(2) أو write(2) دون تحديد عنوان وجهة. لا يزال من الممكن الإرسال إلى وجهات أخرى بتمرير عنوان إلى sendto(2) أو sendmsg(2). لاستقبال الحزم، يمكن ربط المقبس بعنوان محلي أولاً باستخدام bind(2). وإلا، ستُخصص طبقة المقبس آلياً منفذاً محلياً حراً من النطاق المحدد بواسطة /proc/sys/net/ipv4/ip_local_port_range وتربط المقبس بـ INADDR_ANY.

جميع عمليات الاستقبال تُرجع حزمة واحدة فقط. عندما تكون الحزمة أصغر من المخزن المؤقت المُمرر، يُعاد فقط ذلك القدر من البيانات؛ وعندما تكون أكبر، تُقتطع الحزمة ويُضبط العلم MSG_TRUNC. MSG_WAITALL غير مدعوم.

يمكن إرسال أو استقبال خيارات IP باستخدام خيارات المقبس الموصوفة في ip(7). تُعالج بواسطة النواة فقط عند تمكين معامل /proc المناسب (لكنها تُمرر إلى المستخدم حتى عند إيقاف تشغيلها). انظر ip(7).

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

مبدئياً، يقوم UDP في لينكس باكتشاف MTU (وحدة الإرسال القصوى) للمسار. هذا يعني أن النواة ستتتبع MTU لعنوان IP هدف محدد وتُعيد EMSGSIZE عندما يتجاوز كتابة حزمة UDP هذا الحد. عند حدوث ذلك، يجب على التطبيق تقليل حجم الحزمة. يمكن أيضًا إيقاف اكتشاف MTU للمسار باستخدام خيار المقبس IP_MTU_DISCOVER أو الملف /proc/sys/net/ipv4/ip_no_pmtu_disc؛ انظر ip(7) للتفاصيل. عند إيقافه، سيجزئ UDP حزم UDP الصادرة التي تتجاوز MTU للواجهة. ومع ذلك، لا يُوصى بتعطيله لأسباب تتعلق بالأداء والموثوقية.

  تنسيق العنوان
يستخدم UDP تنسيق عنوان IPv4 sockaddr_in الموصوف في ip(7).

  معالجة الأخطاء
جميع الأخطاء الفادحة ستُمرر إلى المستخدم كقيمة إرجاع خطأ حتى عندما لا يكون المقبس متصلاً. يشمل ذلك الأخطاء غير المتزامنة المستلمة من الشبكة. قد تحصل على خطأ لحزمة سابقة أُرسلت على نفس المقبس. يختلف هذا السلوك عن العديد من تطبيقات مقابس BSD الأخرى التي لا تمرر أي أخطاء ما لم يكن المقبس متصلاً. سلوك لينكس مفروض بواسطة RFC 1122.

للتوافق مع الشيفرة القديمة، في لينكس 2.0 و 2.2 كان من الممكن ضبط خيار SO_BSDCOMPAT SOL_SOCKET لاستقبال الأخطاء البعيدة فقط عندما يكون المقبس متصلاً (باستثناء EPROTO و EMSGSIZE). الأخطاء المولدة محلياً تُمرر دائماً. دعم خيار المقبس هذا أُزيل في النوى اللاحقة؛ انظر socket(7) لمزيد من المعلومات.

عند تمكين خيار IP_RECVERR، تُخزن جميع الأخطاء في طابور أخطاء المقبس، ويمكن استقبالها بواسطة recvmsg(2) مع ضبط العلم MSG_ERRQUEUE.

  واجهات /proc
يمكن الوصول إلى إعدادات معاملات UDP على مستوى النظام بواسطة الملفات في الدليل /proc/sys/net/ipv4/.

udp_mem (منذ لينكس 2.6.25)
    هذا متجه من ثلاثة أعداد صحيحة تتحكم في عدد الصفحات المسموح بها للطابور بواسطة جميع مقابس UDP.

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

    pressure
        أُدخلت هذه القيمة لاتباع تنسيق tcp_mem (انظر tcp(7)).

    max عدد الصفحات المسموح بها للطابور بواسطة جميع مقابس UDP.

    القيم المبدئية لهذه العناصر الثلاثة تُحسب عند الإقلاع من مقدار الذاكرة المتاحة.

udp_rmem_min (عدد صحيح؛ القيمة المبدئية: PAGE_SIZE؛ منذ لينكس 2.6.25)
    الحجم الأدنى، بالبايت، للمخازن المؤقتة للاستقبال المستخدمة بواسطة مقابس UDP في التعديل. كل مقبس UDP قادر على استخدام الحجم لاستقبال البيانات، حتى لو تجاوز إجمالي صفحات مقابس UDP ضغط udp_mem.

udp_wmem_min (عدد صحيح؛ القيمة المبدئية: PAGE_SIZE؛ منذ لينكس 2.6.25)
    الحجم الأدنى، بالبايت، للمخزن المؤقت للإرسال المستخدم بواسطة مقابس UDP في التعديل. كل مقبس UDP قادر على استخدام الحجم لإرسال البيانات، حتى لو تجاوز إجمالي صفحات مقابس UDP ضغط udp_mem.

  خيارات المقبس
لضبط أو الحصول على خيار مقبس UDP، استدع getsockopt(2) للقراءة أو setsockopt(2) لكتابة الخيار مع ضبط وسيط مستوى الخيار على IPPROTO_UDP. ما لم يُذكر خلاف ذلك، optval هو مؤشر إلى int.

فيما يلي قائمة بخيارات المقبس الخاصة بـ UDP. للحصول على تفاصيل حول بعض خيارات المقبس الأخرى التي تنطبق أيضًا على مقابس UDP، انظر socket(7).

UDP_CORK (منذ لينكس 2.5.44)
    إذا كان هذا الخيار مفعّلاً، فإن جميع مخرجات البيانات على هذا المقبس تُجمّع في مخطط بيانات واحد يُرسل عند تعطيل الخيار. لا ينبغي استخدام هذا الخيار في كود يُقصد به أن يكون محمولاً.

UDP_SEGMENT (منذ لينكس 4.18)
    يفعّل تفريغ تجزئة UDP. يقلل تفريغ التجزئة من تكلفة send(2) عن طريق نقل بيانات تعادل عدة مخططات بيانات كحزمة واحدة كبيرة عبر مسار إرسال النواة، حتى عندما يتجاوز ذلك MTU. في أقرب وقت ممكن، تُقسّم الحزمة الكبيرة حسب حجم المقطع إلى سلسلة من مخططات البيانات. تُؤجّل خطوة تفريغ التجزئة هذه إلى العتاد إذا كان مدعومًا، وإلا تُنفّذ برمجيًا. يأخذ هذا الخيار قيمة في النطاق [0, USHRT_MAX] تُحدد حجم المقطع: حجم حمولة مخطط البيانات، باستثناء رأس UDP. يجب اختيار حجم المقطع بحيث يُرسل 64 مخطط بيانات على الأكثر في استدعاء واحد وأن تفي مخططات البيانات بعد التجزئة بنفس قواعد MTU التي تنطبق على مخططات البيانات المُرسلة بدون هذا الخيار. يعتمد تفريغ التجزئة على تفريغ المجموع الاختباري، حيث تُحسب مجاميع مخططات البيانات الاختبارية بعد التجزئة. يمكن أيضًا تعيين الخيار لاستدعاءات sendmsg(2) الفردية عن طريق تمريره كـ cmsg(3). قيمة صفر تُعطّل الميزة. لا ينبغي استخدام هذا الخيار في كود يُقصد به أن يكون محمولاً.

UDP_GRO (منذ لينكس 5.0)
    يفعّل تفريغ استقبال UDP. إذا كان مفعّلاً، قد يستقبل المقبس بيانات تعادل عدة مخططات بيانات كمخزن واحد كبير، مع cmsg(3) يحمل حجم المقطع. هذا الخيار هو عكس تفريغ التجزئة. يقلل تكلفة الاستقبال عن طريق معالجة بيانات تعادل عدة مخططات بيانات كحزمة واحدة كبيرة في مسار استقبال النواة، حتى عندما يتجاوز ذلك MTU. لا ينبغي استخدام هذا الخيار في كود يُقصد به أن يكون محمولاً.

  Ioctls
يمكن الوصول إلى هذه ioctls باستخدام ioctl(2). الصيغة الصحيحة هي:

    int value;
    error = ioctl(udp_socket, ioctl_type, &value);

FIONREAD (SIOCINQ)
    يأخذ مؤشرًا إلى عدد صحيح كوسيط. يُرجع حجم مخطط البيانات المعلق التالي في العدد الصحيح بالبايت، أو 0 عندما لا يوجد مخطط بيانات معلق. تحذير: باستخدام FIONREAD، من المستحيل التمييز بين الحالة التي لا يوجد فيها مخطط بيانات معلق والحالة التي يحتوي فيها مخطط البيانات المعلق التالي على صفر بايت من البيانات. من الأكثر أمانًا استخدام select(2) أو poll(2) أو epoll(7) للتمييز بين هذه الحالات.

TIOCOUTQ (SIOCOUTQ)
    يُرجع عدد بايتات البيانات في قائمة الإرسال المحلية. مدعوم فقط مع لينكس 2.4 وما فوق.

بالإضافة إلى ذلك، جميع ioctls الموثقة في ip(7) و socket(7) مدعومة.

الأخطاء
جميع الأخطاء الموثقة لـ socket(7) أو ip(7) قد تُرجع بواسطة إرسال أو استقبال على مقبس UDP.

ECONNREFUSED
    لم يُربط أي مستقبل بعنوان الوجهة. قد يكون هذا ناتجًا عن حزمة سابقة أُرسلت عبر المقبس.

الإصدارات
IP_RECVERR هي ميزة جديدة في لينكس 2.2.

انظر أيضًا
ip(7), raw(7), socket(7), udplite(7)

ملف مصدر النواة Documentation/networking/ip-sysctl.rst.

RFC 768 لبروتوكول مخطط بيانات المستخدم.
RFC 1122 لمتطلبات المضيف.
RFC 1191 لوصف اكتشاف MTU للمسار.

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.