| socket(7) | Miscellaneous Information Manual | socket(7) |
الاسم¶
socket - واجهة مقبس لينكس
موجز¶
#include <sys/socket.h>
sockfd = socket(int socket_family, int socket_type, int protocol);
الوصف¶
تصف صفحة الدليل هذه واجهة مستخدم طبقة مقبس شبكات لينكس. مقابس متوافقة مع BSD هي الواجهة الموحدة بين عملية المستخدم ومكدسات بروتوكول الشبكة في النواة. تُجمع وحدات البروتوكول في عائلات البروتوكول مثل AF_INET و AF_IPX و AF_PACKET، و أنواع المقابس مثل SOCK_STREAM أو SOCK_DGRAM. راجع socket(2) لمزيد من المعلومات حول العائلات والأنواع.
دوال طبقة المقبس¶
تُستخدم هذه الدوال بواسطة عملية المستخدم لإرسال أو استقبال الحزم وللقيام بعمليات المقبس الأخرى. لمزيد من المعلومات، راجع صفحات الدليل الخاصة بكل منها.
يُنشئ socket(2) مقبساً، ويوصل connect(2) مقبساً بعنوان مقبس بعيد، وتربط دالة bind(2) مقبساً بعنوان مقبس محلي، ويخبر listen(2) المقبس بأن الاتصالات الجديدة يجب أن تُقبل، ويُستخدم accept(2) للحصول على مقبس جديد باتصال وارد جديد. يعيد socketpair(2) مقبسين مجهولين متصلين (مُطبق فقط لعدد قليل من العائلات المحلية مثل AF_UNIX)
تُرسل send(2) و sendto(2) و sendmsg(2) البيانات عبر المقبس، وتستقبل recv(2) و recvfrom(2) و recvmsg(2) البيانات من المقبس. ينتظر poll(2) و select(2) وصول البيانات أو الجاهزية لإرسالها. بالإضافة إلى ذلك، يمكن استخدام عمليات الإدخال/الإخراج القياسية مثل write(2) و writev(2) و sendfile(2) و read(2) و readv(2) لقراءة وكتابة البيانات.
يعيد getsockname(2) عنوان المقبس المحلي ويعيد getpeername(2) عنوان المقبس البعيد. تُستخدم getsockopt(2) و setsockopt(2) لضبط أو جلب خيارات طبقة المقبس أو البروتوكول. يمكن استخدام ioctl(2) لضبط أو قراءة بعض الخيارات الأخرى.
يُستخدم close(2) لإغلاق المقبس. ويغلق shutdown(2) أجزاء من اتصال مقبس مزدوج الاتجاه بالكامل.
عمليات البحث (Seeking)، أو استدعاء pread(2) أو pwrite(2) بموضع غير صفري غير مدعومة في المقابس.
من الممكن إجراء إدخال/إخراج غير حاجب على المقابس عبر ضبط وسم O_NONBLOCK على واصف ملف المقبس باستخدام fcntl(2). عندها ستعيد كل العمليات التي قد تُحجب (عادةً) الخطأ EAGAIN (يجب إعادة المحاولة لاحقاً)؛ وسيعيد connect(2) الخطأ EINPROGRESS. يمكن للمستخدم عندها انتظار أحداث مختلفة عبر poll(2) أو select(2).
| أحداث الإدخال/الإخراج | ||
| الحدث | وسم Poll | الحدوث |
| قراءة | POLLIN | وصلت بيانات جديدة. |
| قراءة | POLLIN | وُوفق على إعداد الاتصال (للمقابس الموجهة بالاتصال) |
| قراءة | POLLHUP | بُدئ بطلب قطع الاتصال من الطرف الآخر. |
| قراءة | POLLHUP | انقطع الاتصال (فقط للبروتوكولات الموجهة بالاتصال). عند الكتابة في المقبس تُرسل أيضاً SIGPIPE. |
| كتابة | POLLOUT | المقبس لديه مساحة كافية في مخزن الإرسال لكتابة بيانات جديدة. |
| قراءة/كتابة | POLLIN | POLLOUT | أُنهي استدعاء connect(2) خارجي. |
| قراءة/كتابة | POLLERR | حدث خطأ غير متزامن. |
| قراءة/كتابة | POLLHUP | أغلق الطرف الآخر اتجاهاً واحداً. |
| استثناء | POLLPRI | وصلت بيانات عاجلة. تُرسل عندها SIGURG. |
كبديل لـ poll(2) و select(2) يمكن جعل النواة تخطر التطبيق بالأحداث عبر إشارة SIGIO. لذلك يجب ضبط وسم O_ASYNC على واصف ملف المقبس عبر fcntl(2) ويجب تثبيت معالج إشارة صالح لـ SIGIO عبر sigaction(2). راجع مناقشة الإشارات أدناه.
هياكل عناوين المقبس¶
لكل نطاق مقبس تنسيقه الخاص لعناوين المقبس، مع هيكل عنوان خاص بالنطاق. يبدأ كل من هذه الهياكل بحقل "عائلة" صحيح (بنوع sa_family_t) يشير إلى نوع هيكل العنوان. يسمح هذا لنداءات النظام المختلفة (مثل connect(2) و bind(2) و accept(2) و getsockname(2) و getpeername(2))، والتي هي عامة لجميع نطاقات المقابس، بتحديد نطاق عنوان مقبس معين.
للسماح بتمرير أي نوع من عناوين المقابس إلى واجهات برمجة تطبيقات المقابس، عُرّف النوع struct sockaddr. الغرض من هذا النوع هو بحت للسماح بقولبة (casting) أنواع عناوين المقابس الخاصة بالنطاق إلى نوع "عام"، لتجنب تحذيرات المترجم حول عدم تطابق الأنواع في استدعاءات واجهة برمجة المقابس.
بالإضافة إلى ذلك، توفر واجهة برمجة المقابس نوع البيانات struct sockaddr_storage. هذا النوع مناسب لاستيعاب جميع هياكل عناوين المقابس الخاصة بالنطاق المدعومة؛ فهو كبير بما يكفي ومحاذى بشكل صحيح. (على وجه الخصوص، هو كبير بما يكفي لاحتواء عناوين مقابس IPv6). يتضمن الهيكل الحقل التالي، الذي يمكن استخدامه لتحديد نوع عنوان المقبس المخزن فعلياً في الهيكل:
sa_family_t ss_family;
هيكل sockaddr_storage مفيد في البرامج التي يجب أن تتعامل مع عناوين المقابس بطريقة عامة (مثل البرامج التي يجب أن تتعامل مع كل من عناوين مقابس IPv4 و IPv6).
خيارات المقبس¶
خيارات المقبس المدرجة أدناه يمكن ضبطها باستخدام setsockopt(2) وقراءتها باستخدام getsockopt(2) مع ضبط مستوى المقبس على SOL_SOCKET لجميع المقابس. ما لم يذكر خلاف ذلك، optval هو مؤشر لـ int.
- SO_ACCEPTCONN
- يعيد قيمة تشير إلى ما إذا كان هذا المقبس قد وُسم لقبول الاتصالات بـ listen(2) أم لا. القيمة 0 تشير إلى أن هذا ليس مقبس استماع، والقيمة 1 تشير إلى أنه مقبس استماع. خيار المقبس هذا للقراءة فقط.
- SO_ATTACH_FILTER (منذ لينكس 2.2)
- SO_ATTACH_BPF (منذ لينكس 3.19)
- إرفاق برنامج BPF كلاسيكي (SO_ATTACH_FILTER) أو BPF ممتد (SO_ATTACH_BPF) بالمقبس لاستخدامه كمرشح للحزم الواردة. ستُهمل الحزمة إذا أعاد برنامج المرشح صفراً. إذا أعاد برنامج المرشح قيمة غير صفرية أقل من حجم بيانات الحزمة، فستُبتر الحزمة إلى الحجم المعاد. إذا كانت القيمة التي أعادها المرشح أكبر من أو تساوي حجم بيانات الحزمة، يُسمح للحزمة بالمرور دون تعديل.
- المعامل لـ SO_ATTACH_FILTER هو هيكل sock_fprog، المُعرّف في <linux/filter.h>:
-
struct sock_fprog {
unsigned short len;
struct sock_filter *filter; };
- المعامل لـ SO_ATTACH_BPF هو واصف ملف يعيده نداء النظام bpf(2) ويجب أن يشير إلى برنامج من النوع BPF_PROG_TYPE_SOCKET_FILTER.
- قد تُضبط هذه الخيارات عدة مرات لمقبس معين، وفي كل مرة يُستبدل برنامج المرشح السابق. قد تُستدعى النسخ الكلاسيكية والممتدة على نفس المقبس، ولكن سيُستبدل المرشح السابق دائماً بحيث لا يحتوي المقبس أبداً على أكثر من مرشح واحد مُعرّف.
- كلا من BPF الكلاسيكي والممتد مشروحان في ملف مصدر النواة Documentation/networking/filter.rst
- SO_ATTACH_REUSEPORT_CBPF
- SO_ATTACH_REUSEPORT_EBPF
- للاستخدام مع خيار SO_REUSEPORT، تسمح هذه الخيارات للمستخدم بضبط برنامج BPF كلاسيكي (SO_ATTACH_REUSEPORT_CBPF) أو BPF ممتد (SO_ATTACH_REUSEPORT_EBPF) يحدد كيفية تخصيص الحزم للمقابس في مجموعة reuseport (أي جميع المقابس التي لديها SO_REUSEPORT مضبوطاً وتستخدم نفس العنوان المحلي لاستقبال الحزم).
- يجب أن يعيد برنامج BPF الكلاسيكي فهرساً بين 0 و N-1 يمثل المقبس الذي يجب أن يستقبل الحزمة (حيث N هو عدد المقابس في المجموعة). إذا أعاد برنامج BPF فهرساً غير صالح، فسيرجع اختيار المقبس إلى آلية SO_REUSEPORT العادية.
- تُرقم المقابس بترتيب إضافتها إلى المجموعة (أي ترتيب استدعاءات bind(2) لمقابس UDP أو ترتيب استدعاءات listen(2) لمقابس TCP).
- يمكن لبرنامج BPF الممتد أن يكون من نوعين:
- BPF_PROG_TYPE_SOCKET_FILTER
- في هذه الحالة، يجب أن يعيد برنامج BPF الممتد فهرساً بين 0 و N-1، مثل برنامج BPF الكلاسيكي.
- BPF_PROG_TYPE_SK_REUSEPORT (منذ لينكس 4.19)
- في هذه الحالة، يجب أن يعيد إجراءً (SK_PASS أو SK_DROP) ويمكن استخدام المساعد bpf_sk_select_reuseport لاختيار المقبس الذي يجب أن يستقبل الحزمة.
- سترث المقابس الجديدة المضافة إلى مجموعة reuseport برنامج BPF. عندما يُزال مقبس من مجموعة reuseport (عبر close(2))، سيُنقل آخر مقبس في المجموعة إلى موضع المقبس المغلق.
- قد تُضبط هذه الخيارات بشكل متكرر في أي وقت على أي مقبس في المجموعة لاستبدال برنامج BPF الحالي المستخدم من قبل جميع المقابس في المجموعة.
- يأخذ SO_ATTACH_REUSEPORT_CBPF نفس نوع المعامل لـ SO_ATTACH_FILTER ويأخذ SO_ATTACH_REUSEPORT_EBPF نفس نوع المعامل لـ SO_ATTACH_BPF.
- دعم UDP لهذه الميزة متاح منذ لينكس 4.5؛ ودعم TCP متاح منذ لينكس 4.6.
- SO_BINDTODEVICE
- ربط هذا المقبس بجهاز معين مثل “eth0”، كما هو محدد في اسم الواجهة الممرر. إذا كان الاسم سلسلة فارغة أو حجم الخيار صفراً، يُزال ربط المقبس بالجهاز. الخيار الممرر هو سلسلة اسم واجهة متغيرة الحجم ومنتهية بصفر وبحد أقصى لحجم IFNAMSIZ. إذا رُبط مقبس بواجهة، فإن الحزم المستلمة من تلك الواجهة المحددة فقط هي التي تُعالج بواسطة المقبس. لاحظ أن هذا يعمل فقط لبعض أنواع المقابس، خاصة مقابس AF_INET. وهو غير مدعوم لمقابس الحزم (استخدم bind(2) العادي هناك).
- قبل لينكس 3.8، كان يمكن ضبط خيار المقبس هذا، ولكن لم يكن بالإمكان جلبه بـ getsockopt(2). منذ لينكس 3.8، أصبح قابلاً للقراءة. يجب أن يحتوي معامل optlen على حجم المخزن المتاح لاستقبال اسم الجهاز ويوصى بأن يكون IFNAMSIZ بايت. يُبلّغ عن طول اسم الجهاز الحقيقي في معامل optlen.
- SO_BROADCAST
- ضبط أو جلب وسم البث (broadcast). عند التمكين، يُسمح لمقابس حزم البيانات بإرسال حزم إلى عنوان بث. ليس لهذا الخيار أي تأثير على المقابس الموجهة بالتدفق.
- SO_BSDCOMPAT
- تمكين التوافقية مع علل BSD. استُخدم هذا بواسطة وحدة بروتوكول UDP في لينكس 2.0 و 2.2. في حال تمكينه، فإن أخطاء ICMP المستلمة لمقبس UDP لن تُمرر إلى برنامج المستخدم. في إصدارات النواة اللاحقة، أُلغي دعم هذا الخيار تدريجياً: يتجاهله لينكس 2.4 بصمت، ويولد لينكس 2.6 تحذيراً في النواة (printk()) إذا استخدمه برنامج ما. مكن لينكس 2.0 أيضاً خيارات توافق علل BSD (تغيير الترويسة العشوائي، تخطي وسم البث) للمقابس الخام مع هذا الخيار، ولكن أُزيل ذلك في لينكس 2.2.
- SO_DEBUG
- تمكين تنقيح المقبس. يُسمح به فقط للعمليات التي تملك قدرة CAP_NET_ADMIN أو معرف مستخدم فعال بقيمة 0.
- SO_DETACH_FILTER (منذ لينكس 2.2)
- SO_DETACH_BPF (منذ لينكس 3.19)
- يمكن استخدام هذين الخيارين، وهما مترادفان، لإزالة برنامج BPF الكلاسيكي أو الممتد المرفق بمقبس عبر SO_ATTACH_FILTER أو SO_ATTACH_BPF. قيمة الخيار تُتجاهل.
- SO_DOMAIN (منذ لينكس 2.6.32)
- يجلب نطاق المقبس كعدد صحيح، ويعيد قيمة مثل AF_INET6. راجع socket(2) للتفاصيل. خيار المقبس هذا للقراءة فقط.
- SO_ERROR
- جلب ومسح خطأ المقبس المعلق. خيار المقبس هذا للقراءة فقط. يتوقع عدداً صحيحاً.
- SO_DONTROUTE
- عدم الإرسال عبر بوابة، الإرسال فقط إلى المضيفين المتصلين مباشرة. يمكن تحقيق نفس التأثير عبر ضبط وسم MSG_DONTROUTE في عملية send(2) للمقبس. يتوقع وسماً منطقياً صحيحاً.
- SO_INCOMING_CPU (قابل للجلب منذ لينكس 3.19، وقابل للضبط منذ لينكس 4.4)
- يضبط أو يجلب ألفة وحدة المعالجة المركزية للمقبس. يتوقع وسماً صحيحاً.
-
int cpu = 1; setsockopt(fd, SOL_SOCKET, SO_INCOMING_CPU, &cpu,
sizeof(cpu));
- بما أن جميع حزم التدفق الواحد (أي جميع الحزم لنفس الرباعية) تصل على طابور استقبال (RX) واحد مرتبط بوحدة معالجة مركزية معينة، فإن حالة الاستخدام النموذجية هي توظيف عملية استماع واحدة لكل طابور استقبال، بحيث يُعالج التدفق الوارد بواسطة مستمع على نفس وحدة المعالجة المركزية التي تعالج طابور الاستقبال. يوفر هذا سلوك NUMA الأمثل ويبقي خبيئات وحدة المعالجة المركزية نشطة.
- SO_INCOMING_NAPI_ID (قابل للجلب منذ لينكس 4.12)
- يعيد معرفاً فريداً على مستوى النظام يسمى NAPI ID مرتبط بطابور استقبال (RX) استُلمت عليه آخر حزمة مرتبطة بذلك المقبس.
- يمكن للتطبيق استخدام هذا لتقسيم التدفقات الواردة بين خيوط العمل (worker threads) بناءً على طابور الاستقبال (RX queue) الذي استُقبلت عليه الحزم المرتبطة بتلك التدفقات. يتيح ذلك ربط كل خيط عمل بطابور استقبال عتادي في بطاقة الشبكة (NIC) وخدمة جميع طلبات الاتصال المستلمة على ذلك الطابور. هذا الربط بين خيط التطبيق وطابور بطاقة الشبكة العتادي يسهل تدفق البيانات من بطاقة الشبكة إلى التطبيق.
- SO_KEEPALIVE
- تمكين إرسال رسائل الإبقاء على الاتصال (keep-alive) في المقابس الموجهة للاتصال. يتوقع علامة منطقية صحيحة.
- SO_LINGER
- يضبط خيار SO_LINGER أو يجلبه. المعطى هو هيكل linger.
-
struct linger {
int l_onoff; /* التريث نشط */
int l_linger; /* عدد ثواني التريث */ };
- عند التمكين، لن يعود الاستدعاء close(2) أو shutdown(2) حتى تُرسل جميع الرسائل الموجودة في الطابور للمقبس بنجاح أو الوصول إلى مهلة التريث. خلاف ذلك، يعود الاستدعاء فوراً ويُنفذ الإغلاق في الخلفية. عندما يُغلق المقبس كجزء من exit(2)، فإنه يتريث دائماً في الخلفية.
- SO_LOCK_FILTER
- عند الضبط، سيمنع هذا الخيار تغيير المرشحات المرتبطة بالمقبس. تتضمن هذه المرشحات أي مرشح ضُبط باستخدام خيارات المقبس SO_ATTACH_FILTER و SO_ATTACH_BPF و SO_ATTACH_REUSEPORT_CBPF و SO_ATTACH_REUSEPORT_EBPF.
- حالة الاستخدام النموذجية هي قيام عملية ذات صلاحيات بإعداد مقبس خام (raw socket) (وهي عملية تتطلب قدرة CAP_NET_RAW)، وتطبيق مرشح تقييدي، وضبط الخيار SO_LOCK_FILTER، ثم إما التخلي عن صلاحياتها أو تمرير واصف ملف المقبس إلى عملية غير مخولة عبر مقبس نطاق UNIX.
- بمجرد تمكين خيار SO_LOCK_FILTER، ستفشل محاولات تغيير أو إزالة المرشح المرفق بالمقبس، أو تعطيل خيار SO_LOCK_FILTER مع الخطأ EPERM.
- SO_MARK (منذ لينكس 2.6.25)
- يضبط العلامة (mark) لكل حزمة تُرسل عبر هذا المقبس (على غرار هدف MARK في netfilter ولكنها تعتمد على المقبس). يمكن استخدام تغيير العلامة للتوجيه المعتمد على العلامات بدون netfilter أو لترشيح الحزم. يتطلب ضبط هذا الخيار قدرة CAP_NET_ADMIN أو CAP_NET_RAW (منذ لينكس 5.17).
- SO_OOBINLINE
- إذا مُكّن هذا الخيار، توضع البيانات خارج النطاق (out-of-band) مباشرة في مجرى بيانات الاستقبال. خلاف ذلك، لا تُمرر البيانات خارج النطاق إلا عند ضبط العلامة MSG_OOB أثناء الاستقبال.
- SO_PASSCRED
- تمكين أو تعطيل استقبال رسالة التحكم SCM_CREDENTIALS. لمزيد من المعلومات، انظر unix(7).
- SO_PASSSEC
- تمكين أو تعطيل استقبال رسالة التحكم SCM_SECURITY. لمزيد من المعلومات، انظر unix(7).
- SO_PEEK_OFF (منذ لينكس 3.4)
- يضبط هذا الخيار، المدعوم حالياً لمقابس unix(7) فقط، قيمة "إزاحة الاستراق" (peek offset) لاستدعاء النظام recv(2) عند استخدامه مع علامة MSG_PEEK.
- عند ضبط هذا الخيار على قيمة سالبة (يُضبط على -1 لجميع المقابس الجديدة)، يُقدم السلوك التقليدي: استدعاء recv(2) مع علامة MSG_PEEK سيسترق البيانات من مقدمة الطابور.
- عند ضبط الخيار على قيمة أكبر من أو تساوي الصفر، فإن الاستراق التالي للبيانات الموجودة في طابور المقبس سيحدث عند إزاحة البايت المحددة بقيمة الخيار. وفي الوقت نفسه، ستزداد "إزاحة الاستراق" بعدد البايتات التي استُرقت من الطابور، بحيث يعيد الاستراق اللاحق البيانات التالية في الطابور.
- إذا أُزيلت البيانات من مقدمة الطابور عبر استدعاء recv(2) (أو ما شابه) بدون علامة MSG_PEEK، فستنقص "إزاحة الاستراق" بعدد البايتات التي أُزيلت. بمعنى آخر، استقبال البيانات بدون علامة MSG_PEEK سيؤدي إلى تعديل "إزاحة الاستراق" للحفاظ على الموضع النسبي الصحيح في البيانات المصطفة، بحيث يسترجع الاستراق اللاحق البيانات التي كان سيسترجعها لو لم تُزل البيانات.
- بالنسبة لمقابس حزم البيانات (datagram)، إذا كانت "إزاحة الاستراق" تشير إلى منتصف حزمة، فستُوسم البيانات المعادة بعلامة MSG_TRUNC.
- يوضح المثال التالي استخدام SO_PEEK_OFF. لنفرض أن مقبس دفق يحتوي على بيانات الإدخال المصطفة التالية:
-
aabbccddeeff
- تسلسل استدعاءات recv(2) التالي سيكون له التأثير الموضح في التعليقات:
-
int ov = 4; // اضبط إزاحة الاستراق على 4 setsockopt(fd, SOL_SOCKET, SO_PEEK_OFF, &ov, sizeof(ov)); recv(fd, buf, 2, MSG_PEEK); // يسترق "cc"؛ الإزاحة تُضبط على 6 recv(fd, buf, 2, MSG_PEEK); // يسترق "dd"؛ الإزاحة تُضبط على 8 recv(fd, buf, 2, 0); // يقرأ "aa"؛ الإزاحة تُضبط على 6 recv(fd, buf, 2, MSG_PEEK); // يسترق "ee"؛ الإزاحة تُضبط على 8
- SO_PEERCRED
- يعيد بيانات استيثاق (credentials) العملية النظيرة المتصلة بهذا المقبس. لمزيد من التفاصيل، انظر unix(7).
- SO_PEERSEC(2const)
- SO_PRIORITY
- يضبط الأولوية المحددة في البروتوكول لجميع الحزم التي ستُرسل على هذا المقبس. يستخدم لينكس هذه القيمة لترتيب طوابير الشبكة: قد تُعالج الحزم ذات الأولوية الأعلى أولاً اعتماداً على نظام جدولة الطوابير (queueing discipline) للجهاز المحدد. يتطلب ضبط أولوية خارج النطاق من 0 إلى 6 قدرة CAP_NET_ADMIN.
- SO_PROTOCOL (منذ لينكس 2.6.32)
- يسترجع بروتوكول المقبس كعدد صحيح، ويعيد قيمة مثل IPPROTO_SCTP. انظر socket(2) للتفاصيل. خيار المقبس هذا للقراءة فقط.
- SO_RCVBUF
- يضبط أو يجلب الحد الأقصى لخبيئة استقبال المقبس بالبايت. تضاعف النواة هذه القيمة (لتوفير مساحة للأعمال الإدارية العامة) عندما تُضبط باستخدام setsockopt(2)، وتُعاد هذه القيمة المضاعفة بواسطة getsockopt(2). تُضبط القيمة المبدئية بواسطة الملف /proc/sys/net/core/rmem_default، ويُضبط الحد الأقصى المسموح به بواسطة الملف /proc/sys/net/core/rmem_max. الحد الأدنى للقيمة (المضاعفة) لهذا الخيار هو 256.
- SO_RCVBUFFORCE (منذ لينكس 2.6.14)
- باستخدام خيار المقبس هذا، يمكن لعملية ذات صلاحيات (CAP_NET_ADMIN) القيام بنفس مهمة SO_RCVBUF، ولكن يمكن تجاوز حد rmem_max.
- SO_RCVLOWAT
- SO_SNDLOWAT
- يحدد الحد الأدنى لعدد البايتات في الخبيئة حتى تقوم طبقة المقبس بتمرير البيانات إلى البروتوكول (SO_SNDLOWAT) أو إلى المستخدم عند الاستقبال (SO_RCVLOWAT). تُبدأ هاتان القيمتان بالرقم 1. الخيار SO_SNDLOWAT غير قابل للتغيير في لينكس (يفشل setsockopt(2) مع الخطأ ENOPROTOOPT). الخيار SO_RCVLOWAT قابل للتغيير فقط منذ لينكس 2.4.
- قبل لينكس 2.6.28، لم تكن الاستدعاءات select(2) و poll(2) و epoll(7) تحترم إعداد SO_RCVLOWAT في لينكس، وكانت تشير إلى أن المقبس قابل للقراءة حتى لو توفر بايت واحد فقط من البيانات. القراءة اللاحقة من المقبس كانت ستتوقف (block) حتى تتوفر بايتات بقدر SO_RCVLOWAT. منذ لينكس 2.6.28، تشير select(2) و poll(2) و epoll(7) إلى أن المقبس قابل للقراءة فقط إذا توفر على الأقل عدد بايتات SO_RCVLOWAT.
- SO_RCVTIMEO
- SO_SNDTIMEO
- تحديد مهلات الاستقبال أو الإرسال قبل الإبلاغ عن خطأ. المعطى هو struct timeval. إذا توقفت دالة إدخال أو إخراج لهذه الفترة الزمنية، وكان قد أُرسلت أو استُقبلت بيانات، فستكون القيمة المعادة لتلك الدالة هي كمية البيانات المنقولة؛ إذا لم تُنقل أي بيانات وتم الوصول إلى المهلة، فستُعاد القيمة -1 مع ضبط errno على EAGAIN أو EWOULDBLOCK، أو EINPROGRESS (بالنسبة لـ connect(2)) تماماً كما لو كان المقبس قد حُدد ليكون غير متوقف (nonblocking). إذا ضُبطت المهلة على الصفر (المبدئي)، فلن تنتهي مهلة العملية أبداً. للمهلات تأثير فقط على استدعاءات النظام التي تنفذ عمليات إدخال/إخراج للمقبس (مثل accept(2) و connect(2) و read(2) و recvmsg(2) و send(2) و sendmsg(2))؛ وليس للمهلات تأثير على select(2) و poll(2) و epoll_wait(2)، وما إلى ذلك.
- SO_REUSEADDR
- يشير إلى أن القواعد المستخدمة في التحقق من صحة العناوين المقدمة في استدعاء bind(2) يجب أن تسمح بإعادة استخدام العناوين المحلية. بالنسبة لمقابس AF_INET، يعني هذا أن المقبس قد يربط (bind)، إلا عندما يكون هناك مقبس استماع نشط مربوط بالعنوان. عندما يُربط مقبس الاستماع بـ INADDR_ANY مع منفذ محدد، فلا يمكن الربط بهذا المنفذ لأي عنوان محلي. المعطى هو علامة منطقية صحيحة.
- SO_REUSEPORT (منذ لينكس 3.9)
- يسمح لعدة مقابس AF_INET أو AF_INET6 بالارتباط بنفس عنوان المقبس تماماً. يجب ضبط هذا الخيار في كل مقبس (بما في ذلك المقبس الأول) قبل استدعاء bind(2) على المقبس. لمنع اختطاف المنافذ، يجب أن يكون لجميع العمليات التي تربط بنفس العنوان نفس معرف المستخدم الفعلي (UID). يمكن استخدام هذا الخيار مع كل من مقابس TCP و UDP.
- بالنسبة لمقابس TCP، يسمح هذا الخيار بتحسين توزيع حمل accept(2) في خادم متعدد الخيوط باستخدام مقبس استماع متميز لكل خيط. يوفر هذا توزيعاً محسناً للحمل مقارنة بالتقنيات التقليدية مثل استخدام خيط واحد يقوم بـ accept(2) ويوزع الاتصالات، أو وجود خيوط متعددة تتنافس للقيام بـ accept(2) من نفس المقبس.
- بالنسبة لمقابس UDP، يمكن أن يوفر استخدام هذا الخيار توزيعاً أفضل لحزم البيانات الواردة إلى عدة عمليات (أو خيوط) مقارنة بالتقنية التقليدية التي تتنافس فيها عدة عمليات لاستقبال حزم البيانات على نفس المقبس.
- SO_RXQ_OVFL (منذ لينكس 2.6.33)
- يشير إلى وجوب إرفاق رسالة مساعدة (cmsg) بقيمة 32 بت غير موقعة بكتل خبيئة المقبس (skbs) المستلمة تشير إلى عدد الحزم التي أسقطها المقبس منذ إنشائه.
- SO_SELECT_ERR_QUEUE (منذ لينكس 3.10)
- عند ضبط هذا الخيار على مقبس، فإن حالة خطأ في المقبس تؤدي إلى إشعار ليس فقط عبر مجموعة exceptfds في select(2). وبالمثل، يعيد poll(2) أيضاً POLLPRI كلما أُعيد حدث POLLERR.
- خلفية: أُضيف هذا الخيار عندما كان الاستيقاظ عند حالة خطأ يحدث فقط عبر مجموعتي readfds و writefds في select(2). أُضيف الخيار للسماح بمراقبة حالات الخطأ عبر معطى exceptfds دون الحاجة لاستلام إشعارات (عبر readfds) للبيانات العادية التي يمكن قراءتها من المقبس في نفس الوقت. بعد تغييرات في لينكس 4.16، لم يعد استخدام هذه العلامة لتحقيق الإشعارات المطلوبة ضرورياً. ومع ذلك، أُبقي على هذا الخيار للتوافق مع الإصدارات السابقة.
- SO_SNDBUF
- يضبط أو يجلب الحد الأقصى لخبيئة إرسال المقبس بالبايت. تضاعف النواة هذه القيمة (لتوفير مساحة للأعمال الإدارية العامة) عندما تُضبط باستخدام setsockopt(2)، وتُعاد هذه القيمة المضاعفة بواسطة getsockopt(2). تُضبط القيمة المبدئية بواسطة الملف /proc/sys/net/core/wmem_default ويُضبط الحد الأقصى المسموح به بواسطة الملف /proc/sys/net/core/wmem_max. الحد الأدنى للقيمة (المضاعفة) لهذا الخيار هو 2048.
- SO_SNDBUFFORCE (منذ لينكس 2.6.14)
- باستخدام خيار المقبس هذا، يمكن لعملية ذات صلاحيات (CAP_NET_ADMIN) القيام بنفس مهمة SO_SNDBUF، ولكن يمكن تجاوز حد wmem_max.
- SO_TIMESTAMP
- تمكين أو تعطيل استلام رسالة التحكم SO_TIMESTAMP. تُرسل رسالة تحكم الطابع الزمني بمستوى SOL_SOCKET ونوع SCM_TIMESTAMP في cmsg_type. حقل cmsg_data هو struct timeval يشير إلى وقت استقبال آخر حزمة مُررت للمستخدم في هذا الاستدعاء. انظر cmsg(3) لمزيد من التفاصيل حول رسائل التحكم.
- SO_TIMESTAMPNS (منذ لينكس 2.6.22)
- تمكين أو تعطيل استلام رسالة التحكم SO_TIMESTAMPNS. تُرسل رسالة تحكم الطابع الزمني بمستوى SOL_SOCKET ونوع SCM_TIMESTAMPNS في cmsg_type. حقل cmsg_data هو struct timespec يشير إلى وقت استقبال آخر حزمة مُررت للمستخدم في هذا الاستدعاء. الساعة المستخدمة للطابع الزمني هي CLOCK_REALTIME. انظر cmsg(3) لمزيد من التفاصيل حول رسائل التحكم.
- لا يمكن للمقبس الخلط بين SO_TIMESTAMP و SO_TIMESTAMPNS: فالوضعان متنافيان.
- SO_TYPE
- يجلب نوع المقبس كعدد صحيح (مثل SOCK_STREAM). خيار المقبس هذا للقراءة فقط.
- SO_BUSY_POLL (منذ لينكس 3.11)
- يضبط الوقت التقريبي بالميكروثانية لعملية استطلاع الانشغال (busy poll) عند الاستقبال المتوقف عندما لا تتوفر بيانات. يتطلب زيادة هذه القيمة قدرة CAP_NET_ADMIN. يُتحكم في القيمة المبدئية لهذا الخيار بواسطة الملف /proc/sys/net/core/busy_read.
- تحدد القيمة في الملف /proc/sys/net/core/busy_poll المدة التي سيقوم فيها select(2) و poll(2) باستطلاع الانشغال عند العمل على مقابس ضُبط فيها SO_BUSY_POLL ولم يُعثر على أحداث للإبلاغ عنها.
- في كلتا الحالتين، لن يُجرى استطلاع الانشغال إلا عندما يكون المقبس قد استقبل بيانات لآخر مرة من جهاز شبكة يدعم هذا الخيار.
- بينما قد يحسن استطلاع الانشغال من زمن الوصول (latency) لبعض التطبيقات، يجب توخي الحذر عند استخدامه لأن ذلك سيزيد من استهلاك المعالج واستهلاك الطاقة.
الإشارات¶
عند الكتابة على مقبس موجه للاتصال أُغلق (من قبل الطرف المحلي أو البعيد)، تُرسل الإشارة SIGPIPE إلى العملية الكاتبة ويُعاد الخطأ EPIPE. لا تُرسل الإشارة عندما يحدد استدعاء الكتابة علامة MSG_NOSIGNAL.
عند الطلب باستخدام FIOSETOWN fcntl(2) أو SIOCSPGRP ioctl(2)، تُرسل الإشارة SIGIO عند وقوع حدث إدخال/إخراج. من الممكن استخدام poll(2) أو select(2) في معالج الإشارة لمعرفة أي مقبس وقع عليه الحدث. كبديل (في لينكس 2.2)، يمكن ضبط إشارة وقت حقيقي باستخدام F_SETSIG fcntl(2)؛ سيُستدعى معالج إشارة الوقت الحقيقي مع واصف الملف في حقل si_fd لهيكل siginfo_t الخاص به. انظر fcntl(2) لمزيد من المعلومات.
في بعض الظروف (مثل وصول عمليات متعددة إلى مقبس واحد)، قد تكون الحالة التي تسببت في SIGIO قد اختفت بالفعل عندما تستجيب العملية للإشارة. إذا حدث هذا، يجب على العملية الانتظار مرة أخرى لأن لينكس سيعيد إرسال الإشارة لاحقاً.
واجهات /proc¶
يمكن الوصول إلى معلمات شبكة المقابس الجوهرية عبر الملفات الموجودة في الدليل /proc/sys/net/core/.
- rmem_default
- يحتوي على الإعداد المبدئي بالبايت لخبيئة استقبال المقبس.
- rmem_max
- يحتوي على الحد الأقصى لحجم خبيئة استقبال المقبس بالبايت والذي يمكن للمستخدم ضبطه باستخدام خيار المقبس SO_RCVBUF.
- wmem_default
- يحتوي على الإعداد المبدئي بالبايت لخبيئة إرسال المقبس.
- wmem_max
- يحتوي على الحد الأقصى لحجم خبيئة إرسال المقبس بالبايت والذي يمكن للمستخدم ضبطه باستخدام خيار المقبس SO_SNDBUF.
- message_cost
- message_burst
- اضبط مرشح دلو العلامات (token bucket filter) المستخدم للحد من تحميل رسائل التحذير الناتجة عن أحداث الشبكة الخارجية.
- netdev_max_backlog
- الحد الأقصى لعدد الحزم في طابور الإدخال الشامل.
- optmem_max
- الحد الأقصى لحجم البيانات المساعدة وبيانات تحكم المستخدم مثل iovecs لكل مقبس.
Ioctls¶
يمكن الوصول إلى هذه العمليات باستخدام ioctl(2):
error = ioctl(ip_socket, ioctl_type, &value_result);
- SIOCGSTAMP
- يعيد struct timeval مع طابع زمن الاستقبال لآخر حزمة مُررت للمستخدم. هذا مفيد لقياسات وقت الرحلة الكاملة (round trip time) بدقة. انظر setitimer(2) لوصف struct timeval. يجب استخدام ioctl هذا فقط إذا لم تُضبط خيارات المقبس SO_TIMESTAMP و SO_TIMESTAMPNS على المقبس. خلاف ذلك، فإنه يعيد الطابع الزمني لآخر حزمة استُقبلت أثناء عدم ضبط SO_TIMESTAMP و SO_TIMESTAMPNS، أو يفشل إذا لم تُستقبل مثل هذه الحزمة، (أي يعيد ioctl(2) القيمة -1 مع ضبط errno على ENOENT).
- SIOCSPGRP
- اضبط العملية أو مجموعة العمليات التي ستتلقى إشارات SIGIO أو SIGURG عندما يصبح الإدخال/الإخراج متاحًا أو تتوفر بيانات عاجلة. المُعطى عبارة عن مؤشر إلى pid_t. لمزيد من التفاصيل، راجع وصف F_SETOWN في fcntl(2).
- FIOASYNC
- غيّر علم O_ASYNC لتمكين أو تعطيل وضع الإدخال/الإخراج غير المتزامن للمقبس. يعني وضع الإدخال/الإخراج غير المتزامن إرسال إشارة SIGIO أو الإشارة المضبوطة بـ F_SETSIG عند وقوع حدث إدخال/إخراج جديد.
- المُعطى هو علم منطقي صحيح. (هذه العملية مرادفة لاستخدام fcntl(2) لضبط علم O_ASYNC.)
- SIOCGPGRP
- احصل على العملية أو مجموعة العمليات الحالية التي تتلقى إشارات SIGIO أو SIGURG، أو 0 في حال لم يُضبط أي منها.
عمليات fcntl(2) الصالحة:
الإصدارات¶
قُدم SO_BINDTODEVICE في لينكس 2.0.30. و SO_PASSCRED جديد في لينكس 2.2. قُدمت واجهات /proc في لينكس 2.2. دُعم SO_RCVTIMEO و SO_SNDTIMEO منذ لينكس 2.3.41. سابقًا، كانت المُهل الزمنية ثابتة في إعدادات مخصصة للبروتوكول، ولم يكن بالإمكان قراءتها أو كتابتها.
ملاحظات¶
يفترض لينكس أن نصف مخزن الإرسال/الاستقبال يُستخدم لهياكل النواة (kernel) الداخلية؛ لذا فإن القيم في ملفات /proc المقابلة هي ضعف ما يمكن ملاحظته على السلك.
يسمح لينكس بإعادة استخدام المنفذ فقط مع خيار SO_REUSEADDR عندما يكون هذا الخيار قد ضُبط في كل من البرنامج السابق الذي نفذ bind(2) على المنفذ وفي البرنامج الذي يريد إعادة استخدام المنفذ. يختلف هذا عن بعض التطبيقات (مثل FreeBSD) حيث يحتاج البرنامج اللاحق فقط لضبط خيار SO_REUSEADDR. عادة ما يكون هذا الاختلاف غير مرئي، لأن برامج الخوادم، على سبيل المثال، صُممت لتضبط هذا الخيار دائمًا.
انظر أيضًا¶
wireshark(1), bpf(2), connect(2), getsockopt(2), setsockopt(2), socket(2), pcap(3), address_families(7), capabilities(7), ddp(7), ip(7), ipv6(7), packet(7), tcp(7), udp(7), unix(7), tcpdump(8)
ترجمة¶
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>
هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.
| 8 فبراير 2026 | صفحات دليل لينكس 6.18 |