Scroll to navigation

ip(7) Miscellaneous Information Manual 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.


struct sockaddr_in {

sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */ }; /* Internet address */ struct in_addr {
uint32_t s_addr; /* address in network byte order */ };

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 من struct in_addr يحتوي على عنوان واجهة المضيف بترتيب بايت الشبكة. يجب تعيين in_addr إلى إحدى قيم INADDR_* (مثل INADDR_LOOPBACK) باستخدام htonl(3) أو ضبطه باستخدام دوال المكتبة inet_aton(3)، inet_addr(3)، inet_makeaddr(3) أو مباشرة مع محلل الأسماء (انظر gethostbyname(3)).

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

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

عناوين خاصة ومحجوزة

هناك عدة عناوين خاصة:

دائمًا ما يشير إلى المضيف المحلي عبر جهاز الحلقة المحلية؛
يعني أي عنوان لربط المقبس؛
له نفس التأثير على bind(2) مثل INADDR_ANY لأسباب تاريخية. حزمة موجهة إلى 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) مخصصة للاستخدام المتعدد الإرسال.

خيارات المقبس

IP يدعم بعض خيارات المقبس الخاصة بالبروتوكول التي يمكن ضبطها باستخدام setsockopt(2) وقراءتها باستخدام getsockopt(2). مستوى خيار المقبس لـ IP هو IPPROTO_IP. علامة عددية منطقية تكون صفرًا عندما تكون خاطئة، وإلا صحيحة.

عند تحديد خيار مقبس غير صالح، يفشل getsockopt(2) و setsockopt(2) مع الخطأ ENOPROTOOPT.

الانضمام إلى مجموعة متعددة الإرسال. الوسيطة هي هيكل ip_mreqn.

struct ip_mreqn {

struct in_addr imr_multiaddr; /* IP multicast group
address */
struct in_addr imr_address; /* IP address of local
interface */
int imr_ifindex; /* interface index */ };

imr_multiaddr يحتوي على عنوان المجموعة متعددة الإرسال التي يريد التطبيق الانضمام إليها أو مغادرتها. يجب أن يكون عنوانًا صالحًا للإرسال المتعدد (أو يفشل setsockopt(2) مع الخطأ EINVAL). imr_address هو عنوان الواجهة المحلية التي يجب على النظام الانضمام من خلالها إلى المجموعة متعددة الإرسال؛ إذا كان مساويًا لـ INADDR_ANY، يختار النظام واجهة مناسبة. imr_ifindex هو فهرس الواجهة التي يجب أن تنضم/تغادر مجموعة imr_multiaddr، أو 0 للإشارة إلى أي واجهة.
هيكل ip_mreqn متاح فقط منذ لينكس 2.2. للتوافق، لا يزال الهيكل القديم ip_mreq (الموجود منذ لينكس 1.2) مدعومًا؛ يختلف عن ip_mreqn فقط بعدم تضمين حقل imr_ifindex. (تحدد النواة أي هيكل يُمرر بناءً على الحجم الممرر في optlen.)
IP_ADD_MEMBERSHIP صالح فقط لـ setsockopt(2).
الانضمام إلى مجموعة متعددة الإرسال والسماح باستقبال البيانات فقط من مصدر محدد. الوسيطة هي بنية ip_mreq_source.

struct ip_mreq_source {

struct in_addr imr_multiaddr; /* IP multicast group
address */
struct in_addr imr_interface; /* IP address of local
interface */
struct in_addr imr_sourceaddr; /* IP address of
multicast source */ };

بنية ip_mreq_source مشابهة لـ ip_mreqn الموصوفة تحت IP_ADD_MEMBERSHIP. حقل imr_multiaddr يحتوي على عنوان مجموعة الإرسال المتعدد التي يريد التطبيق الانضمام إليها أو مغادرتها. حقل imr_interface هو عنوان الواجهة المحلية التي يجب على النظام الانضمام من خلالها إلى مجموعة الإرسال المتعدد. أخيرًا، حقل imr_sourceaddr يحتوي على عنوان المصدر الذي يريد التطبيق استقبال البيانات منه.
يمكن استخدام هذا الخيار عدة مرات للسماح باستقبال البيانات من أكثر من مصدر.
إعلام النواة بعدم حجز منفذ مؤقت عند استخدام bind(2) برقم منفذ 0. سيتم اختيار المنفذ لاحقًا آليًا في وقت connect(2)، بطريقة تسمح بمشاركة منفذ مصدر طالما أن الرباعي فريد.
إيقاف استقبال بيانات الإرسال المتعدد من مصدر محدد في مجموعة معينة. هذا صالح فقط بعد اشتراك التطبيق في مجموعة الإرسال المتعدد باستخدام إما IP_ADD_MEMBERSHIP أو IP_ADD_SOURCE_MEMBERSHIP.
الوسيطة هي بنية ip_mreq_source كما هو موصوف تحت IP_ADD_SOURCE_MEMBERSHIP.
مغادرة مجموعة إرسال متعدد. الوسيطة هي بنية ip_mreqn أو ip_mreq مشابهة لـ IP_ADD_MEMBERSHIP.
مغادرة مجموعة خاصة بالمصدر—أي إيقاف استقبال البيانات من مجموعة إرسال متعدد معينة تأتي من مصدر معين. إذا اشترك التطبيق في مصادر متعددة داخل نفس المجموعة، فستظل البيانات من المصادر المتبقية تُسلم. لإيقاف استقبال البيانات من جميع المصادر مرة واحدة، استخدم IP_DROP_MEMBERSHIP.
الوسيطة هي بنية ip_mreq_source كما هو موصوف تحت IP_ADD_SOURCE_MEMBERSHIP.
إذا تم تفعيله، يسمح هذا الخيار المنطقي بالربط بعنوان IP غير محلي أو غير موجود (بعد). هذا يسمح بالاستماع على مقبس، دون الحاجة إلى أن تكون واجهة الشبكة الأساسية أو عنوان IP الديناميكي المحدد قيد التشغيل في الوقت الذي يحاول فيه التطبيق الربط به. هذا الخيار هو المكافئ لكل مقبس لواجهة ip_nonlocal_bind /proc الموصوفة أدناه.
إذا تم تفعيله، يقوم المستخدم بتوفير رأس IP أمام بيانات المستخدم. صالح فقط لمقابس SOCK_RAW؛ انظر raw(7) لمزيد من المعلومات. عند تفعيل هذه العلامة، يتم تجاهل القيم المعينة بواسطة IP_OPTIONS و IP_TTL و IP_TOS.
تعيين أو الحصول على نطاق المنفذ المحلي المبدئي لكل مقبس. يمكن استخدام هذا الخيار لتقييد نطاق المنفذ المحلي العام، المعرف بواجهة ip_local_port_range /proc الموصوفة أدناه، لمقبس معين.
يأخذ الخيار قيمة uint32_t مع تعيين الـ 16 بت العليا للحد الأعلى للنطاق، والـ 16 بت السفلى للحد الأدنى للنطاق. حدود النطاق شاملة. يجب أن تكون القيم ذات 16 بت بترتيب بايت المضيف.
يجب أن يكون الحد الأدنى أقل من الحد الأعلى عندما لا يكون كلا الحدين صفرًا. وإلا، يفشل تعيين الخيار مع EINVAL.
إذا كان أي من الحدين خارج نطاق المنفذ المحلي العام، أو كان صفرًا، فإن ذلك الحد ليس له تأثير.
لإعادة تعيين الإعداد، مرر صفرًا لكل من الحد الأعلى والحد الأدنى.
يوفر هذا الخيار الوصول إلى واجهة برمجة التطبيقات المتقدمة لتصفية الحالة الكاملة. الوسيطة هي بنية ip_msfilter.

struct ip_msfilter {

struct in_addr imsf_multiaddr; /* IP multicast group
address */
struct in_addr imsf_interface; /* IP address of local
interface */
uint32_t imsf_fmode; /* Filter-mode */
uint32_t imsf_numsrc; /* Number of sources in
the following array */
struct in_addr imsf_slist[1]; /* Array of source
addresses */ };

يوجد وحدتان ماكرو، MCAST_INCLUDE و MCAST_EXCLUDE، يمكن استخدامهما لتحديد وضع التصفية. بالإضافة إلى ذلك، توجد وحدة الماكرو IP_MSFILTER_SIZE(n) لتحديد مقدار الذاكرة اللازمة لتخزين بنية ip_msfilter مع n من المصادر في قائمة المصادر.
للحصول على الوصف الكامل لتصفية مصدر البث المتعدد، راجع RFC 3376.
استرجاع قيمة MTU الحالية المعروفة للمسار للمقبس الحالي. تُرجع عددًا صحيحًا.
IP_MTU صالح فقط لـ getsockopt(2) ويمكن استخدامه فقط عندما يكون المقبس متصلاً.
تعيين أو استلام إعداد اكتشاف MTU للمسار لمقبس. عند التمكين، سينفذ Linux اكتشاف MTU للمسار كما هو محدد في RFC 1191 على مقابس SOCK_STREAM. بالنسبة للمقابس غير SOCK_STREAM، يفرض IP_PMTUDISC_DO تعيين علامة عدم التجزئة على جميع الحزم الصادرة. تقع على عاتق المستخدم مسؤولية تجزئة البيانات إلى أجزاء بحجم MTU وإعادة الإرسال إذا لزم الأمر. سيرفض النواة (مع EMSGSIZE) مخططات البيانات الأكبر من MTU المعروف للمسار. سيقوم IP_PMTUDISC_WANT بتجزئة مخطط البيانات إذا لزم الأمر وفقًا لـ MTU للمسار، أو سيعين علامة عدم التجزئة بخلاف ذلك.
يمكن تبديل الإعداد المبدئي على مستوى النظام بين IP_PMTUDISC_WANT و IP_PMTUDISC_DONT عن طريق كتابة (قيم صفرية وغير صفرية على التوالي) إلى ملف /proc/sys/net/ipv4/ip_no_pmtu_disc.
قيمة اكتشاف MTU للمسار المعنى
IP_PMTUDISC_WANT استخدام الإعدادات لكل مسار.
IP_PMTUDISC_DONT عدم إجراء اكتشاف MTU للمسار أبدًا.
IP_PMTUDISC_DO إجراء اكتشاف MTU للمسار دائمًا.
IP_PMTUDISC_PROBE تعيين DF ولكن تجاهل MTU للمسار.
عند تمكين اكتشاف PMTU، يتتبع النواة آليًا MTU للمسار لكل مضيف وجهة. عندما يكون متصلاً بنظير محدد باستخدام connect(2)، يمكن استرجاع MTU المعروف حاليًا للمسار بسهولة باستخدام خيار المقبس IP_MTU (على سبيل المثال، بعد حدوث خطأ EMSGSIZE). قد يتغير MTU للمسار بمرور الوقت. بالنسبة للمقابس غير المتصلة ذات الوجهات المتعددة، يمكن أيضًا الوصول إلى MTU الجديد لوجهة معينة باستخدام قائمة انتظار الأخطاء (انظر IP_RECVERR). سيتم وضع خطأ جديد في قائمة الانتظار لكل تحديث وارد لـ MTU.
أثناء تقدم اكتشاف MTU، قد يتم إسقاط الحزم الأولية من مقابس مخططات البيانات. يجب أن تكون التطبيقات التي تستخدم UDP على دراية بهذا وألا تأخذه في الاعتبار لاستراتيجية إعادة إرسال الحزم الخاصة بها.
لبدء عملية اكتشاف MTU للمسار على المقابس غير المتصلة، من الممكن البدء بحجم مخطط بيانات كبير (رؤوس يصل طولها إلى 64 كيلوبايت) وتركه يتقلص بواسطة تحديثات MTU للمسار.
للحصول على تقدير مبدئي لـ MTU للمسار، قم بتوصيل مقبس مخطط بيانات بعنوان الوجهة باستخدام connect(2) واسترجع MTU عن طريق استدعاء getsockopt(2) مع خيار IP_MTU.
من الممكن تنفيذ استقصاء MTU وفقًا لـ RFC 4821 مع مقابس SOCK_DGRAM أو SOCK_RAW عن طريق تعيين قيمة IP_PMTUDISC_PROBE (متاح منذ Linux 2.6.22). هذا مفيد بشكل خاص لأدوات التشخيص مثل tracepath(8) التي ترغب في إرسال حزم استقصاء أكبر عمدًا من MTU الملاحظ للمسار.
يمكن استخدام هذا الخيار لتعديل سياسة تسليم رسائل البث المتعدد. الوسيطة هي عدد صحيح منطقي (المبدئي هو 1). إذا ضُبطت على 1، سيستلم المقبس الرسائل من جميع المجموعات المنضمة عالميًا على النظام بأكمله. وإلا، سيسلم الرسائل فقط من المجموعات المنضمة صراحة (مثلًا عبر خيار IP_ADD_MEMBERSHIP) على هذا المقبس المعين.
اضبط الجهاز المحلي لمقبس البث المتعدد. الوسيطة لـ setsockopt(2) هي بنية ip_mreqn أو (منذ لينكس 3.5) بنية ip_mreq مشابهة لـ IP_ADD_MEMBERSHIP، أو بنية in_addr. (يحدد النواة أي بنية تُمرر بناءً على الحجم الممرر في optlen.) لـ getsockopt(2)، الوسيطة هي بنية in_addr.
اضبط أو اقرأ وسيطة عدد صحيح منطقي تحدد ما إذا كان ينبغي إعادة حزم البث المتعدد المرسلة إلى المقابس المحلية.
اضبط أو اقرأ قيمة وقت الحياة لحزم البث المتعدد الصادرة لهذا المقبس. من المهم جدًا لحزم البث المتعدد ضبط أصغر TTL ممكن. المبدئي هو 1 مما يعني أن حزم البث المتعدد لا تغادر الشبكة المحلية ما لم يطلب برنامج المستخدم ذلك صراحة. الوسيطة هي عدد صحيح.
إذا كان مفعلًا (الوسيطة غير صفرية)، يُعطل إعادة تجميع الحزم الصادرة في طبقة netfilter. الوسيطة هي عدد صحيح.
هذا الخيار صالح فقط لمقابس SOCK_RAW.
اضبط أو احصل على خيارات IP التي ستُرسل مع كل حزمة من هذا المقبس. الوسيطات هي مؤشر إلى مخزن ذاكرة يحتوي على الخيارات وطول الخيار. استدعاء setsockopt(2) يضبط خيارات IP المرتبطة بمقبس. الحجم الأقصى للخيار لـ IPv4 هو 40 بايت. انظر RFC 791 للخيارات المسموح بها. عندما تحتوي حزمة طلب الاتصال الأولية لمقبس SOCK_STREAM على خيارات IP، ستُضبط خيارات IP آليًا على الخيارات من الحزمة الأولية مع عكس رؤوس التوجيه. لا يُسمح للحزم الواردة بتغيير الخيارات بعد إنشاء الاتصال. معالجة جميع خيارات توجيه المصدر الواردة معطلة مبدئيًا ويمكن تفعيلها باستخدام واجهة accept_source_route /proc. لا تزال الخيارات الأخرى مثل الطوابع الزمنية تُعالج. لمقابس البيانات، يمكن للمستخدم المحلي فقط ضبط خيارات IP. استدعاء getsockopt(2) مع IP_OPTIONS يضع خيارات IP الحالية المستخدمة للإرسال في المخزن المقدم.
إذا كان IPSEC الموسوم أو NetLabel مهيئًا على المضيفين المرسل والمستقبل، يفعل هذا الخيار استقبال سياق الأمان لمقبس النظير في رسالة مساعدة من النوع SCM_SECURITY تُسترجع باستخدام recvmsg(2). هذا الخيار مدعوم فقط لمقابس UDP؛ لمقابس TCP أو SCTP، انظر وصف خيار SO_PEERSEC أدناه.
القيمة المعطاة كمعامل لـ setsockopt(2) والراجعة كنتيجة لـ getsockopt(2) هي علامة منطقية صحيحة.
سياق الأمان المُعاد في الرسالة المساعدة SCM_SECURITY هو بنفس التنسيق الموصوف تحت خيار SO_PEERSEC أدناه.
ملاحظة: إعادة استخدام نوع الرسالة SCM_SECURITY لخيار المقبس IP_PASSSEC كان على الأرجح خطأ، لأن رسائل التحكم الأخرى في IP تستخدم مخطط ترقيم خاص بها في فضاء اسم IP وغالبًا ما تستخدم قيمة خيار المقبس كنوع الرسالة. لا يوجد تعارض حاليًا لأن خيار IP بنفس قيمة SCM_SECURITY هو IP_HDRINCL وهذا لا يُستخدم أبدًا لنوع رسالة تحكم.
مرر رسالة مساعدة IP_PKTINFO تحتوي على بنية pktinfo تزود بعض المعلومات عن الحزمة الواردة. هذا يعمل فقط للمقابس الموجهة للبيانات. الوسيطة هي علامة تخبر المقبس ما إذا كان ينبغي تمرير رسالة IP_PKTINFO أم لا. يمكن إرسال/استرجاع الرسالة نفسها فقط كرسالة تحكم مع حزمة باستخدام recvmsg(2) أو sendmsg(2).

struct in_pktinfo {

unsigned int ipi_ifindex; /* Interface index */
struct in_addr ipi_spec_dst; /* Local address */
struct in_addr ipi_addr; /* Header Destination
address */ };

ipi_ifindex هو الفهرس الفريد للواجهة التي استُقبلت عليها الحزمة. ipi_spec_dst هو العنوان المحلي للحزمة و ipi_addr هو عنوان الوجهة في رأس الحزمة. إذا مُررت IP_PKTINFO إلى sendmsg(2) وكان ipi_spec_dst غير صفري، فسيُستخدم كعنوان مصدر محلي للبحث في جدول التوجيه ولإعداد خيارات توجيه مصدر IP. عندما يكون ipi_ifindex غير صفري، يستبدل العنوان المحلي الرئيسي للواجهة المحددة بواسطة الفهرس ipi_spec_dst للبحث في جدول التوجيه.
غير مدعوم لمقابس SOCK_STREAM.
فعل تمرير رسالة خطأ موثوقة موسعة. عندما يُفعل على مقبس بيانات، ستُصطف جميع الأخطاء المُنشأة في قائمة انتظار أخطاء لكل مقبس. عندما يستلم المستخدم خطأ من عملية مقبس، يمكن استقبال الأخطاء باستدعاء recvmsg(2) مع تعيين علامة MSG_ERRQUEUE. ستمرر بنية sock_extended_err التي تصف الخطأ في رسالة مساعدة من النوع IP_RECVERR والمستوى IPPROTO_IP. هذا مفيد لمعالجة الأخطاء الموثوقة على المقابس غير المتصلة. جزء البيانات المستلمة من قائمة انتظار الأخطاء يحتوي على حزمة الخطأ.
رسالة التحكم IP_RECVERR تحتوي على بنية sock_extended_err:

#define SO_EE_ORIGIN_NONE    0
#define SO_EE_ORIGIN_LOCAL   1
#define SO_EE_ORIGIN_ICMP    2
#define SO_EE_ORIGIN_ICMP6   3
struct sock_extended_err {

uint32_t ee_errno; /* error number */
uint8_t ee_origin; /* where the error originated */
uint8_t ee_type; /* type */
uint8_t ee_code; /* code */
uint8_t ee_pad;
uint32_t ee_info; /* additional information */
uint32_t ee_data; /* other data */
/* More data may follow */ }; struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);

يحتوي ee_errno على رقم errno للخطأ المُصطف. ee_origin هو رمز المنشأ لمكان نشأة الخطأ. الحقول الأخرى خاصة بالبروتوكول. يُعيد الماكرو SO_EE_OFFENDER مؤشرًا إلى عنوان كائن الشبكة الذي نشأ منه الخطأ، معطىً مؤشرًا إلى الرسالة المساعدة. إذا كان هذا العنوان غير معروف، يحتوي العضو sa_family من sockaddr على AF_UNSPEC والحقول الأخرى من sockaddr غير مُعرَّفة.
يستخدم IP بنية sock_extended_err كما يلي: يُضبط ee_origin على SO_EE_ORIGIN_ICMP للأخطاء المُستقبلة كحزمة ICMP، أو على SO_EE_ORIGIN_LOCAL للأخطاء المُولَّدة محليًا. يجب تجاهل القيم غير المعروفة. يُضبط ee_type و ee_code من حقلي النوع والرمز لرأس ICMP. يحتوي ee_info على MTU المُكتشفة لأخطاء EMSGSIZE. تحتوي الرسالة أيضًا على sockaddr_in للعقدة التي سببت الخطأ، والتي يمكن الوصول إليها باستخدام الماكرو SO_EE_OFFENDER. حقل sin_family لعنوان SO_EE_OFFENDER هو AF_UNSPEC عندما كان المصدر غير معروف. عندما نشأ الخطأ من الشبكة، تُمرَّر جميع خيارات IP (IP_OPTIONS، IP_TTL، إلخ) المُفعَّلة على المقبس والموجودة في حزمة الخطأ كرسائل تحكم. يُعاد حمولة الحزمة المسببة للخطأ كحمولة عادية. لاحظ أن TCP ليس له قائمة انتظار أخطاء؛ MSG_ERRQUEUE غير مسموح به على مقابس SOCK_STREAM. IP_RECVERR صالح لـ TCP، ولكن جميع الأخطاء تُعاد فقط بواسطة إرجاع دالة المقبس أو SO_ERROR.
للمقابس الخام، يُفعّل IP_RECVERR تمرير جميع أخطاء ICMP المُستقبلة إلى التطبيق، وإلا تُبلغ الأخطاء فقط على المقابس المتصلة
يضبط أو يسترجع علامة منطقية صحيحة. القيمة المبدئية لـ IP_RECVERR هي إيقاف.
يمرر جميع خيارات IP الواردة إلى المستخدم في رسالة تحكم IP_OPTIONS. رأس التوجيه والخيارات الأخرى مملوءة بالفعل للمضيف المحلي. غير مدعوم لمقابس SOCK_STREAM.
يُفعّل هذا الخيار المنطقي الرسالة المساعدة IP_ORIGDSTADDR في recvmsg(2)، حيث يُعيد النواة عنوان الوجهة الأصلي للبيانات المُستقبلة. تحتوي الرسالة المساعدة على struct sockaddr_in. غير مدعوم لمقابس SOCK_STREAM.
إذا كان مُفعّلاً، تُمرَّر الرسالة المساعدة IP_TOS مع الحزم الواردة. تحتوي على بايت يُحدد حقل نوع الخدمة/الأولوية لرأس الحزمة. يتوقع علامة منطقية صحيحة. غير مدعوم لمقابس SOCK_STREAM.
عند ضبط هذه العلامة، تُمرَّر رسالة تحكم IP_TTL مع حقل وقت الحياة للحزمة المُستقبلة كعدد صحيح 32 بت. غير مدعوم لمقابس SOCK_STREAM.
مطابق لـ IP_RECVOPTS، لكنه يُعيد خيارات خام غير معالجة مع خيارات الطابع الزمني وسجل المسار غير المملوءة لهذه القفزة. غير مدعوم لمقابس SOCK_STREAM.
يمرر جميع الحزم التي سيتم إعادة توجيهها مع خيار تنبيه الموجه IP إلى هذا المقبس. صالح فقط للمقابس الخام. هذا مفيد، على سبيل المثال، لبرامج RSVP الخلفية في مساحة المستخدم. لا تُعاد توجيه الحزم المُلتقطة بواسطة النواة؛ تقع مسؤولية إرسالها مرة أخرى على عاتق المستخدم. يُتجاهل ربط المقبس، وتُصفى هذه الحزم فقط حسب البروتوكول. يتوقع علامة صحيحة.
يضبط أو يستقبل حقل نوع الخدمة (TOS) الذي يُرسل مع كل حزمة IP ناشئة من هذا المقبس. يُستخدم لترتيب أولويات الحزم على الشبكة. TOS هو بايت. هناك بعض علامات TOS القياسية المُعرَّفة: IPTOS_LOWDELAY لتقليل التأخيرات لحركة المرور التفاعلية، IPTOS_THROUGHPUT لتحسين الإنتاجية، IPTOS_RELIABILITY للتحسين من أجل الموثوقية، IPTOS_MINCOST يجب استخدامه لـ "بيانات الحشو" حيث لا يهم الإرسال البطيء. يمكن تحديد قيمة واحدة على الأكثر من قيم TOS هذه. البتات الأخرى غير صالحة ويجب مسحها. يُرسل Linux بيانات IPTOS_LOWDELAY أولاً بشكل مبدئي، لكن السلوك الدقيق يعتمد على نظام قائمة الانتظار المُهيأ. قد تتطلب بعض مستويات الأولوية العالية امتيازات المستخدم المتميز (قدرة CAP_NET_ADMIN).
يُفعّل ضبط هذا الخيار المنطقي الوكيل الشفاف على هذا المقبس. يسمح خيار المقبس هذا للتطبيق المُستدعي بالارتباط بعنوان IP غير محلي والعمل كعميل وخادم مع العنوان الأجنبي كنقطة نهاية محلية. ملاحظة: يتطلب هذا إعداد التوجيه بطريقة تُوجَّه فيها الحزم المتجهة إلى العنوان الأجنبي عبر صندوق TProxy (أي النظام المُستضيف للتطبيق الذي يستخدم خيار المقبس IP_TRANSPARENT). يتطلب تفعيل خيار المقبس هذا امتيازات المستخدم المتميز (قدرة CAP_NET_ADMIN).
يتطلب إعادة التوجيه TProxy مع هدف iptables TPROXY أيضًا ضبط هذا الخيار على المقبس المُعاد توجيهه.
يضبط أو يسترجع حقل وقت الحياة الحالي المُستخدم في كل حزمة تُرسل من هذا المقبس.
يزيل حظر مصدر بث متعدد مُحظور سابقًا. يُعيد EADDRNOTAVAIL عندما لا يكون المصدر المُعطى محظورًا.
الوسيطة هي بنية ip_mreq_source كما هو موصوف تحت IP_ADD_SOURCE_MEMBERSHIP.
إذا تم تكوين IPSEC المُوسوم أو NetLabel على كل من المُضيف المُرسل والمُستقبل، فإن خيار المقبس القابل للقراءة فقط هذا يُرجع سياق الأمان لمقبس النظير المتصل بهذا المقبس. مبدئيًا، سيكون هذا مماثلاً لسياق الأمان للعملية التي أنشأت مقبس النظير ما لم يتم تجاوزه بواسطة السياسة أو بواسطة عملية تمتلك الصلاحيات المطلوبة.
المعامل لـ getsockopt(2) هو مؤشر لمخزن مؤقت بالطول المحدد بالبايت والذي ستُنسخ إليه سلسلة سياق الأمان. إذا كان طول المخزن المؤقت أقل من طول سلسلة سياق الأمان، فإن getsockopt(2) يعيد -1، ويضبط errno على ERANGE، ويعيد الطول المطلوب عبر optlen. يجب على المستدعي تخصيص NAME_MAX بايت على الأقل للمخزن المؤقت في البداية، على الرغم من أن هذا غير مضمون ليكون كافيًا. قد يكون من الضروري تغيير حجم المخزن المؤقت إلى الطول المعاد وإعادة المحاولة.
قد تتضمن سلسلة سياق الأمان محرف null نهائياً في الطول المرجع، ولكن ليس مضموناً القيام بذلك: سياق الأمان "foo" قد يُمثل إما كـ {'f','o','o'} بطول 3 أو {'f','o','o','\0'} بطول 4، واللذان يعتبران قابلين للتبادل. السلسلة قابلة للطباعة، ولا تحتوي على محارف null غير نهائية، وهي بترميز غير محدد (على وجه الخصوص، ليس مضموناً أن تكون ASCII أو UTF-8).
دعم استخدام هذا الخيار للمقابس في عائلة العناوين AF_INET منذ لينكس 2.6.17 لمقابس TCP، ومنذ لينكس 4.17 لمقابس SCTP.
بالنسبة لـ SELinux، ينقل NetLabel فقط جزء MLS من سياق الأمان للنظير عبر الشبكة، مع تعيين باقي سياق الأمان مبدئيًا إلى القيم المُحددة في السياسة لمُعرّف الأمان الأولي (SID) لرسالة الشبكة. ومع ذلك، يمكن تكوين NetLabel لتمرير سياقات أمان كاملة عبر الحلقة المحلية. يقوم IPSEC المُوسوم دائمًا بتمرير سياقات أمان كاملة كجزء من إنشاء ارتباط الأمان (SA) ويبحث عنها بناءً على الارتباط لكل حزمة.

واجهات /proc

يدعم بروتوكول IP مجموعة من واجهات /proc لضبط بعض المعاملات العامة. يمكن الوصول إلى المعاملات عن طريق قراءة أو كتابة الملفات في الدليل /proc/sys/net/ipv4/. الواجهات الموصوفة كـ Boolean تأخذ قيمة صحيحة، حيث تعني القيمة غير الصفرية ("true") أن الخيار المقابل مفعل، والقيمة الصفرية ("false") تعني أن الخيار معطل.

[جديد مع لينكس 2.2.13؛ في إصدارات النواة السابقة كانت هذه الميزة تُحكم في وقت التجميع بواسطة خيار CONFIG_IP_ALWAYS_DEFRAG؛ هذا الخيار غير موجود في لينكس 2.4.x والإصدارات الأحدث]
عند تفعيل هذا العلم المنطقي (لا يساوي 0)، ستُجمع الشظايا الواردة (أجزاء من حزم IP نتجت عندما قرر مضيف ما بين المصدر والوجهة أن الحزم كبيرة جدًا وقطعها إلى أجزاء) قبل معالجتها، حتى لو كانت على وشك التوجيه.
يُفَعَّل فقط في حال تشغيل جدار حماية يمثل الرابط الوحيد لشبكتك أو بروكسي شفاف؛ لا تستخدمه أبدًا مع راوتر أو مضيف عادي. وإلا، فقد تتعطل الاتصالات المجزأة إذا انتقلت الأجزاء عبر روابط مختلفة. كما أن عملية إلغاء التجزئة تستهلك قدرًا كبيرًا من الذاكرة ووقت المعالج.
يُفعل هذا تلقائيًا عند ضبط التنكر أو الوكيل الشفاف.
غير موثق.
اضبط القيمة المبدئية لوقت الحياة (TTL) للحزم الخارجة. يمكن تغيير ذلك لكل مقبس باستخدام خيار IP_TTL.
تفعيل العنوان الديناميكي للمقبس وإعادة كتابة إدخال التنكر عند تغيير عنوان الواجهة. هذا مفيد لواجهات الاتصال الهاتفي ذات عناوين IP المتغيرة. 0 يعني عدم إعادة الكتابة، و 1 يشغله، و 2 يفعل الوضع المسهب.
تفعيل إعادة توجيه IP باستخدام علم منطقي (boolean). يمكن أيضًا ضبط إعادة توجيه IP على أساس كل واجهة.
يحتوي هذا الملف على عددين صحيحين يحددان نطاق المنافذ المحلية المبدئي المخصص للمقابس التي لم تُربط صراحة برقم منفذ—أي النطاق المستخدم لـ ephemeral ports. يُخصص منفذ عابر للمقبس في الحالات التالية:
يُحدد رقم المنفذ في عنوان المقبس كـ 0 عند استدعاء bind(2)؛
يُستدعى listen(2) على مقبس تدفق لم يُربط مسبقًا؛
استُدعي connect(2) على مقبس لم يُربط مسبقًا؛
استُدعيت sendto(2) على مقبس بيانات لم يُربَط مسبقًا.
يبدأ تخصيص المنافذ المؤقتة بالرقم الأول في ip_local_port_range وينتهي بالرقم الثاني. إذا استُنفد نطاق المنافذ المؤقتة، فإن استدعاء النظام ذا الصلة يُرجع خطأ (ولكن انظر BUGS).
لاحظ أن نطاق المنفذ في ip_local_port_range يجب ألا يتعارض مع المنافذ المستخدمة بواسطة التمويه (على الرغم من معالجة الحالة). أيضًا، قد تُسبب الاختيارات العشوائية مشاكل مع بعض مرشحات حزم جدار الحماية التي تضع افتراضات حول المنافذ المحلية قيد الاستخدام. يجب أن يكون الرقم الأول أكبر من 1024 على الأقل، أو الأفضل، أكبر من 4096، لتجنب التعارض مع المنافذ المعروفة ولتقليل مشاكل جدار الحماية.
إذا مُكنت، لا تقم باكتشاف Path MTU لمقابس TCP مبدئيا. قد يفشل اكتشاف Path MTU إذا كانت هناك جدران حماية غير مهيأة بشكل صحيح (تسقط جميع حزم ICMP) أو واجهات غير مهيأة بشكل صحيح (مثل وصلة نقطة لنقطة حيث لا يتفق الطرفان على MTU) في المسار. من الأفضل إصلاح الموجهات المعطلة في المسار بدلاً من إيقاف اكتشاف Path MTU عالميا، لأن عدم القيام بذلك يتسبب في تكلفة عالية للشبكة.
إذا ضُبطت، فستسمح للعمليات بـ bind(2) بعناوين IP غير محلية، وهو ما قد يكون مفيداً جداً، لكنه قد يؤدي إلى تعطل بعض التطبيقات.
الوقت بالثواني للاحتفاظ بقطعة IPv6 في الذاكرة.
فترة التجديد (بالثواني) لسر التجزئة (أو عمر سر التجزئة) لقطع IPv6.
إذا وصلت كمية شظايا IP المُخزنة في الطابور إلى ipfrag_high_thresh، يتم تقليم الطابور إلى ipfrag_low_thresh. يحتوي على عدد صحيح بعدد البايتات.
انظر arp(7).

Ioctls

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

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

الأخطاء

حاول المستخدم تنفيذ عملية بدون الأذونات اللازمة. تتضمن هذه: إرسال حزمة إلى عنوان بث بدون تعيين علامة SO_BROADCAST؛ إرسال حزمة عبر مسار prohibit؛ تعديل إعدادات جدار الحماية بدون امتيازات المستخدم الفائق (قدرة CAP_NET_ADMIN)؛ الربط بمنفذ مميز بدون امتيازات المستخدم الفائق (قدرة CAP_NET_BIND_SERVICE).
حاول الربط بعنوان قيد الاستخدام بالفعل.
طُلبت واجهة غير موجودة أو أن عنوان المصدر المطلوب لم يكن محليًا.
العملية على مقبس غير حاجب كانت ستحجب.
عملية اتصال على مقبس غير حاجز قيد التنفيذ بالفعل.
أُغلِق الاتصال أثناء عملية accept(2).
لا يوجد إدخال صالح في جدول التوجيه يطابق عنوان الوجهة. يمكن أن يحدث هذا الخطأ بسبب رسالة ICMP من موجه بعيد أو لجدول التوجيه المحلي.
تم تمرير وسيطة غير صالحة. بالنسبة لعمليات الإرسال، يمكن أن يحدث هذا بسبب الإرسال إلى مسار blackhole.
استُدعي connect(2) على مقبس متصل بالفعل.
البيانات أكبر من MTU على المسار ولا يمكن تجزئتها.
ذاكرة حرة غير كافية. هذا يعني غالبًا أن تخصيص الذاكرة محدود بحدود مخزن المقبس المؤقت، وليس بذاكرة النظام، ولكن هذا ليس متسقًا بنسبة 100%.
استُدعي SIOCGSTAMP على مقبس لم تصل إليه أي حزمة.
لم يُضبط نظام فرعي للنواة.
خيار مقبس غير صالح مُرِّرَ.
العملية محددة فقط على مقبس متصل، لكن المقبس لم يكن متصلاً.
ليس لدى المستخدم إذن لتعيين أولوية عالية، أو تغيير التكوين، أو إرسال إشارات إلى العملية أو المجموعة المطلوبة.
أُغلق الاتصال أو أُنهي بشكل غير متوقع من الطرف الآخر.
المقبس غير مهيأ أو تم طلب نوع مقبس غير معروف.

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

ملاحظات

IP_FREEBIND، IP_MSFILTER، IP_MTU، IP_MTU_DISCOVER، IP_RECVORIGDSTADDR، IP_PASSSEC، IP_PKTINFO، IP_RECVERR، IP_ROUTER_ALERT، و IP_TRANSPARENT هي خاصة بلينكس.

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

توفر بعض تطبيقات مقابس BSD الأخرى خياري المقبس IP_RCVDSTADDR و IP_RECVIF للحصول على عنوان الوجهة وواجهة مخططات البيانات المستلمة. لدى لينكس الخيار الأكثر عمومية IP_PKTINFO لنفس المهمة.

توفر بعض تطبيقات مقابس BSD أيضًا خيار IP_RECVTTL، ولكن يتم تمرير رسالة مساعدة من النوع IP_RECVTTL مع الحزمة الواردة. هذا يختلف عن خيار IP_TTL المستخدم في لينكس.

استخدام مستوى خيارات المقبس 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.

انظر أيضًا

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.txt.

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

ترجمة

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

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

2 مايو 2024 صفحات دليل لينكس 6.9.1