ip(7)

الاسم
ip - تطبيق بروتوكول IPv4 في لينكس

موجز
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>  /* superset of previous */

tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
raw_socket = socket(AF_INET, SOCK_RAW, protocol);

الوصف
لينكس يطبق بروتوكول الإنترنت، الإصدار 4، الموصوف في RFC 791 و RFC 1122. ip يحتوي على تطبيق إرسال متعدد من المستوى 2 متوافق مع RFC 1112. كما يحتوي على موجه IP يشمل مرشح حزم.

واجهة البرمجة متوافقة مع BSD-sockets. لمزيد من المعلومات حول المقابس، انظر socket(7).

مقبس IP يُنشأ باستخدام socket(2):

    socket(AF_INET, socket_type, protocol);

أنواع المقابس الصالحة تشمل SOCK_STREAM لفتح مقبس تيار، SOCK_DGRAM لفتح مقبس مخطط بيانات، و SOCK_RAW لفتح مقبس raw(7) للوصول المباشر إلى بروتوكول IP.

protocol هو بروتوكول IP في رأس IP الذي سيُستقبل أو يُرسل. القيم الصالحة لـ protocol تشمل:

•   0 و IPPROTO_TCP لمقابس تيار tcp(7);

•   0 و IPPROTO_UDP لمقابس مخطط بيانات udp(7);

•   IPPROTO_SCTP لمقابس تيار sctp(7); و

•   IPPROTO_UDPLITE لمقابس مخطط بيانات udplite(7).

لـ SOCK_RAW يمكنك تحديد بروتوكول IANA IP صالح معرف في أرقام RFC 1700 المخصصة.

عندما تريد عملية استقبال حزم أو اتصالات واردة جديدة، يجب عليها ربط مقبس بعنوان واجهة محلية باستخدام bind(2). في هذه الحالة، قد يُربط مقبس IP واحد فقط بأي زوج محلي (عنوان، منفذ) معين. عندما يُحدد INADDR_ANY في استدعاء الربط، سيُربط المقبس بجميع الواجهات المحلية. عندما يُستدعى listen(2) على مقبس غير مربوط، يُربط المقبس آلياً بمنفذ حر عشوائي مع تعيين العنوان المحلي إلى INADDR_ANY. عندما يُستدعى connect(2) على مقبس غير مربوط، يُربط المقبس آلياً بمنفذ حر عشوائي أو بمنفذ مشترك قابل للاستخدام مع تعيين العنوان المحلي إلى INADDR_ANY.

عنوان مقبس محلي TCP تم ربطه يكون غير متاح لبعض الوقت بعد الإغلاق، ما لم يُعيّن العلم SO_REUSEADDR. يجب توخي الحذر عند استخدام هذا العلم لأنه يجعل TCP أقل موثوقية.

  تنسيق العنوان
عنوان مقبس IP يُعرف كتركيبة من عنوان واجهة IP ورقم منفذ 16 بت. بروتوكول IP الأساسي لا يوفر أرقام منافذ، بل تُطبق بواسطة بروتوكولات مستوى أعلى مثل udp(7) و tcp(7). على المقابس الخام .sin_port يُضبط إلى بروتوكول IP.

انظر sockaddr_in(3type).

.sin_family يُضبط دائماً إلى AF_INET. هذا مطلوب؛ في لينكس 2.2 معظم دوال الشبكات تُرجع EINVAL عندما يكون هذا الإعداد مفقوداً. .sin_port يحتوي على المنفذ بترتيب بايت الشبكة. أرقام المنافذ تحت 1024 تُسمى منافذ مميزة (أو أحياناً: منافذ محجوزة). فقط عملية مميزة (على لينكس: عملية تملك القدرة CAP_NET_BIND_SERVICE في مساحة المستخدم الحاكمة لمساحة شبكتها) قد تستخدم bind(2) لهذه المقابس. لاحظ أن بروتوكول IPv4 الخام بحد ذاته ليس له مفهوم للمنفذ، بل تُطبق فقط بواسطة بروتوكولات أعلى مثل tcp(7) و udp(7).

.sin_addr هو عنوان مضيف IP. العضو .s_addr من بنية in_addr(3type) يحتوي على عنوان واجهة المضيف بترتيب بايت الشبكة. in_addr(3type) يجب أن يُسند إحدى قيم INADDR_* (مثلاً، INADDR_LOOPBACK) باستخدام htonl(3) أو يُضبط باستخدام دوال المكتبة inet_aton(3), inet_addr(3), inet_makeaddr(3) أو مباشرة مع محلل الأسماء (انظر gethostbyname(3)).

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

لاحظ أن العنوان والمنفذ يُخزنان دائماً بترتيب بايت الشبكة. على وجه الخصوص، هذا يعني أنك تحتاج لاستدعاء htons(3) على الرقم الذي يُسند لمنفذ. جميع دوال معالجة العنوان/المنفذ في المكتبة القياسية تعمل بترتيب بايت الشبكة.

  عناوين خاصة ومحجوزة
هناك عدة عناوين خاصة:

INADDR_LOOPBACK (127.0.0.1)
    دائمًا ما يشير إلى المضيف المحلي عبر جهاز الحلقة المحلية؛

INADDR_ANY (0.0.0.0)
    يعني أي عنوان لربط المقبس؛

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

العنصر الأعلى رقمًا
العنصر الأدنى رقمًا
    في أي شبكة فرعية IP محلية غير نقطة إلى نقطة بنوع وصلة يدعم البث، يتم تعيين العنوان الأعلى رقمًا (مثل عنوان .255 على شبكة فرعية بقناع شبكة 255.255.255.0) كعنوان بث. لا يمكن تعيينه بشكل مفيد لواجهة فردية، ويمكن معالجته فقط عبر مقبس تم تعيين خيار SO_BROADCAST عليه. احتفظت معايير الإنترنت تاريخيًا أيضًا بالعنوان الأدنى رقمًا (مثل عنوان .0 على شبكة فرعية بقناع شبكة 255.255.255.0) للبث، على الرغم من أنها تسميه "قديمًا" لهذا الغرض. (تشير بعض المصادر أيضًا إلى هذا باسم "عنوان الشبكة.") منذ Linux 5.14، يتم التعامل معه كعنوان أحادي عادي ويمكن تعيينه لواجهة.

احتفظت معايير الإنترنت تقليديًا أيضًا بعناوين متنوعة لاستخدامات معينة، على الرغم من أن Linux لم يعد يعامل بعضها بشكل خاص.

[0.0.0.1, 0.255.255.255]
[240.0.0.0, 255.255.255.254]
    العناوين في هذه النطاقات (0/8 و240/4) محجوزة عالميًا. منذ Linux 5.3 وLinux 2.6.25 على التوالي، يتم التعامل مع عناوين 0/8 و240/4، بخلاف INADDR_ANY وINADDR_BROADCAST، كعناوين أحادية عادية. قد لا تتفاعل الأنظمة التي تتبع السلوكيات التقليدية مع هذه العناوين المحجوزة تاريخيًا.

[127.0.0.1, 127.255.255.254]
    يتم التعامل مع العناوين في هذا النطاق (127/8) كعناوين حلقة محلية مماثلة لعنوان الحلقة المحلية الموحد INADDR_LOOPBACK (127.0.0.1)؛

[224.0.0.0, 239.255.255.255]
    العناوين في هذا النطاق (224/4) مخصصة للاستخدام المتعدد الإرسال.

  خيارات المقبس
انظر IPPROTO_IP(2const).

  واجهات /proc
انظر proc_sys_net_ipv4(5).

  Ioctls
جميع ioctls الموصوفة في socket(7) تنطبق على ip.

تم وصف ioctls لتكوين معلمات الجهاز العامة في netdevice(7).

الأخطاء

EACCES
    حاول المستخدم تنفيذ عملية بدون الأذونات اللازمة. تتضمن هذه: إرسال حزمة إلى عنوان بث بدون تعيين علامة SO_BROADCAST؛ إرسال حزمة عبر مسار prohibit؛ تعديل إعدادات جدار الحماية بدون امتيازات المستخدم الفائق (قدرة CAP_NET_ADMIN)؛ الربط بمنفذ مميز بدون امتيازات المستخدم الفائق (قدرة CAP_NET_BIND_SERVICE).

EADDRINUSE
    حاول الربط بعنوان قيد الاستخدام بالفعل.

EADDRNOTAVAIL
    طُلبت واجهة غير موجودة أو أن عنوان المصدر المطلوب لم يكن محليًا.

EAGAIN
    العملية على مقبس غير حاجب كانت ستحجب.

EALREADY
    عملية اتصال على مقبس غير حاجز قيد التنفيذ بالفعل.

ECONNABORTED
    أُغلِق الاتصال أثناء عملية accept(2).

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

EINVAL
    تم تمرير وسيطة غير صالحة. بالنسبة لعمليات الإرسال، يمكن أن يحدث هذا بسبب الإرسال إلى مسار blackhole.

EISCONN
    استُدعي connect(2) على مقبس متصل بالفعل.

EMSGSIZE
    البيانات أكبر من MTU على المسار ولا يمكن تجزئتها.

ENOBUFS
ENOMEM
    ذاكرة حرة غير كافية. هذا يعني غالبًا أن تخصيص الذاكرة محدود بحدود مخزن المقبس المؤقت، وليس بذاكرة النظام، ولكن هذا ليس متسقًا بنسبة 100%.

ENOENT
    استُدعي SIOCGSTAMP على مقبس لم تصل إليه أي حزمة.

ENOPKG
    لم يُضبط نظام فرعي للنواة.

ENOPROTOOPT
EOPNOTSUPP
    خيار مقبس غير صالح مُرِّرَ.

ENOTCONN
    العملية محددة فقط على مقبس متصل، لكن المقبس لم يكن متصلاً.

EPERM
    ليس لدى المستخدم إذن لتعيين أولوية عالية، أو تغيير التكوين، أو إرسال إشارات إلى العملية أو المجموعة المطلوبة.

EPIPE
    أُغلق الاتصال أو أُنهي بشكل غير متوقع من الطرف الآخر.

ESOCKTNOSUPPORT
    المقبس غير مهيأ أو تم طلب نوع مقبس غير معروف.

قد تُولَّد أخطاء أخرى بواسطة البروتوكولات العلوية؛ انظر tcp(7)، raw(7)، udp(7)، و socket(7).

ملاحظات
كن حذرًا جدًا مع خيار SO_BROADCAST - فهو ليس مميزًا في لينكس. من السهل إثقال الشبكة بالبث غير المدروس. بالنسبة لبروتوكولات التطبيقات الجديدة، من الأفضل استخدام مجموعة متعددة الإرسال بدلاً من البث. يُثبط البث. انظر RFC 6762 لمثال على بروتوكول (mDNS) يستخدم نهج الإرسال المتعدد الأكثر حداثة للتواصل مع مجموعة مفتوحة من المضيفين على الشبكة المحلية.

استخدام مستوى خيارات المقبس SOL_IP غير قابل للنقل؛ الأكوام المبنية على BSD تستخدم مستوى IPPROTO_IP.

INADDR_ANY (0.0.0.0) و INADDR_BROADCAST (255.255.255.255) محايدان لترتيب البايت. هذا يعني أن htonl(3) ليس له تأثير عليهما.

  التوافقية
للتوافق مع لينكس 2.0، لا يزال بناء الجملة القديم socket(AF_INET, SOCK_PACKET, protocol) مدعومًا لفتح مقبس packet(7). هذا مهمل ويجب استبداله بـ socket(AF_PACKET, SOCK_RAW, protocol) بدلاً من ذلك. الفرق الرئيسي هو هيكل العنوان الجديد sockaddr_ll لمعلومات طبقة الارتباط العامة بدلاً من sockaddr_pkt القديم.

العلل
هناك الكثير من قيم الخطأ غير المتسقة.

الخطأ المستخدم لتشخيص استنفاد نطاق المنافذ المؤقتة يختلف عبر استدعاءات النظام المختلفة (connect(2)، bind(2)، listen(2)، sendto(2)) التي يمكنها تعيين منافذ مؤقتة.

أوامر ioctl لتكوين خيارات الواجهة الخاصة بـ IP وجداول ARP غير موصوفة.

استلام عنوان الوجهة الأصلي مع MSG_ERRQUEUE في msg_name بواسطة recvmsg(2) لا يعمل في بعض نوى لينكس 2.2.

انظر أيضًا
IPPROTO_IP(2const)، recvmsg(2)، sendmsg(2)، byteorder(3)، capabilities(7)، icmp(7)، ipv6(7)، netdevice(7)، netlink(7)، raw(7)، socket(7)، tcp(7)، udp(7)، ip(8)

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

RFC 791 لمواصفات IP الأصلية. RFC 1122 لمتطلبات مضيف IPv4. RFC 1812 لمتطلبات موجه IPv4.

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

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

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