raw(7)

الاسم
raw - مقابس IPv4 الخام في لينكس

موجز
#include <sys/socket.h>
#include <netinet/in.h>
raw_socket = socket(AF_INET, SOCK_RAW, int protocol);

الوصف
تسمح المقابس الخام بتنفيذ بروتوكولات IPv4 جديدة في مساحة المستخدم. يستقبل أو يرسل المقبس الخام الرزمة الخام دون تضمين ترويسات مستوى الوصلة.

يولد طبقة IPv4 ترويسة IP عند إرسال رزمة ما لم يتم تمكين خيار المقبس IP_HDRINCL على المقبس. عند تمكينه، يجب أن تحتوي الرزمة على ترويسة IP. للاستقبال، تُضمن ترويسة IP دائمًا في الرزمة.

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

تُمرر جميع الرزم أو الأخطاء المطابقة لرقم protocol المحدد للمقبس الخام إلى هذا المقبس. للحصول على قائمة البروتوكولات المسموح بها، راجع قائمة IANA لأرقام البروتوكولات المعينة في http://www.iana.org/assignments/protocol-numbers/ و getprotobyname(3).

بروتوكول IPPROTO_RAW يعني تمكين IP_HDRINCL ويكون قادرًا على إرسال أي بروتوكول IP محدد في الترويسة الممررة. استقبال جميع بروتوكولات IP عبر IPPROTO_RAW غير ممكن باستخدام المقابس الخام.
    حقول ترويسة IP المعدلة عند الإرسال بواسطة IP_HDRINCL
    مجموع تدقيق IP | يُملأ دائمًا
    عنوان المصدر | يُملأ عندما يكون صفرًا
    معرف الرزمة | يُملأ عندما يكون صفرًا
    الطول الإجمالي | يُملأ دائمًا

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

إذا لم يتم تعيين IP_HDRINCL، فيمكن تعيين خيارات ترويسة IP على المقابس الخام باستخدام setsockopt(2)؛ راجع ip(7) لمزيد من المعلومات.

بدءًا من لينكس 2.2، يمكن تعيين جميع حقول وخيارات ترويسة IP باستخدام خيارات مقبس IP. هذا يعني أن المقابس الخام عادةً ما تكون ضرورية فقط للبروتوكولات الجديدة أو البروتوكولات التي لا تحتوي على واجهة مستخدم (مثل ICMP).

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

  تنسيق العنوان
لإرسال واستقبال الرزم (sendto(2)، recvfrom(2)، وما شابه)، تستخدم المقابس الخام بنية العنوان القياسية sockaddr_in المعرفة في ip(7). يمكن استخدام حقل sin_port لتحديد رقم بروتوكول IP، ولكن يتم تجاهله للإرسال في لينكس 2.2 والإصدارات الأحدث، ويجب دائمًا تعيينه إلى 0 (راجع الأخطاء). للرزم الواردة، يتم تعيين sin_port إلى صفر.

  خيارات المقبس
يمكن تعيين خيارات المقبس الخام باستخدام setsockopt(2) وقراءتها باستخدام getsockopt(2) عن طريق تمرير علم العائلة IPPROTO_RAW.

ICMP_FILTER
    تمكين مرشح خاص للمقابس الخام المرتبطة ببروتوكول IPPROTO_ICMP. تحتوي القيمة على بت مضبوط لكل نوع رسالة ICMP يجب تصفيته. المبدئي هو عدم تصفية أي رسائل ICMP.

بالإضافة إلى ذلك، جميع خيارات مقبس ip(7) IPPROTO_IP الصالحة لمقابس الرزم مدعومة.

  معالجة الأخطاء
تُمرر الأخطاء الناشئة من الشبكة إلى المستخدم فقط عندما يكون المقبس متصلاً أو يتم تمكين علم IP_RECVERR. للمقابس المتصلة، يتم تمرير EMSGSIZE و EPROTO فقط للتوافق. مع IP_RECVERR، تُحفظ جميع أخطاء الشبكة في قائمة انتظار الأخطاء.

الأخطاء

EACCES
    حاول المستخدم الإرسال إلى عنوان بث دون تعيين علم البث على المقبس.

EFAULT
    تم توفير عنوان ذاكرة غير صالح.

EINVAL
    معطى غير صالح.

EMSGSIZE
    الحزمة كبيرة جدًا. إما أن اكتشاف MTU للمسار مفعل (علامة المقبس IP_MTU_DISCOVER) أو أن حجم الحزمة يتجاوز الحد الأقصى المسموح به لحجم حزمة IPv4 البالغ 64 كيلوبايت.

EOPNOTSUPP
    تم تمرير علامة غير صالحة إلى استدعاء مقبس (مثل MSG_OOB).

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

EPROTO
    وصل خطأ ICMP يبلغ عن مشكلة في المعامل.

الإصدارات
IP_RECVERR و ICMP_FILTER جديدان في لينكس 2.2. هما امتدادات لينكس ولا ينبغي استخدامهما في البرامج المحمولة.

فعّل لينكس 2.0 بعض التوافق من علة إلى علة مع BSD في كود المقبس الخام عند تعيين خيار المقبس SO_BSDCOMPAT؛ منذ لينكس 2.2، لم يعد لهذا الخيار ذلك التأثير.

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

يمكن ربط مقبس خام بعنوان محلي محدد باستخدام استدعاء bind(2). إذا لم يكن مربوطًا، فسيتم استقبال جميع الحزم ببروتوكول IP المحدد. بالإضافة إلى ذلك، يمكن ربط مقبس خام بجهاز شبكة محدد باستخدام SO_BINDTODEVICE؛ انظر socket(7).

مقبس IPPROTO_RAW هو للإرسال فقط. إذا كنت تريد حقًا استقبال جميع حزم IP، فاستخدم مقبس packet(7) مع بروتوكول ETH_P_IP. لاحظ أن مقابس الحزم لا تعيد تجميع أجزاء IP، على عكس المقابس الخام.

إذا كنت تريد استقبال جميع حزم ICMP لمقبس مخطط بيانات، فغالبًا ما يكون من الأفضل استخدام IP_RECVERR على ذلك المقبس المعين؛ انظر ip(7).

قد تتنصت المقابس الخام على جميع بروتوكولات IP في لينكس، حتى البروتوكولات مثل ICMP أو TCP التي تحتوي على وحدة بروتوكول في النواة. في هذه الحالة، تُمرر الحزم إلى كل من وحدة النواة والمقبس (المقابس) الخام. لا ينبغي الاعتماد على هذا في البرامج المحمولة، فالعديد من تطبيقات مقبس BSD الأخرى لها قيود هنا.

لا يغير لينكس أبدًا الرؤوس الممررة من المستخدم (باستثناء ملء بعض الحقول المصفرة كما هو موصوف لـ IP_HDRINCL). هذا يختلف عن العديد من التطبيقات الأخرى للمقابس الخام.

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

يجب أن يأخذ الإرسال على المقابس الخام بروتوكول IP من sin_port؛ فُقدت هذه القدرة في لينكس 2.2. الحل البديل هو استخدام IP_HDRINCL.

العلل
امتدادات الوكيل الشفاف غير موصوفة.

عند تعيين خيار IP_HDRINCL، لن يتم تجزئة مخططات البيانات وستكون محدودة بـ MTU للواجهة.

فُقد تعيين بروتوكول IP للإرسال في sin_port في لينكس 2.2. يُستخدم دائمًا البروتوكول الذي رُبط به المقبس أو الذي حُدد في استدعاء socket(2) الأولي.

انظر أيضًا
recvmsg(2), sendmsg(2), capabilities(7), ip(7), socket(7)

RFC 1191 لاكتشاف MTU للمسار. RFC 791 وملف الرأس <linux/ip.h> لبروتوكول IP.

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

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

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