tcp(7)

الاسم
tcp - بروتوكول TCP

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

tcp_socket = socket(AF_INET, SOCK_STREAM, 0);

الوصف
هذا تنفيذ لبروتوكول TCP المحدد في RFC 793 وRFC 1122 وRFC 2001 مع امتدادات NewReno وSACK. يوفر اتصالًا موثوقًا، موجّهًا بالتدفق، وكامل الازدواج بين مقبسين فوق ip(7)، لكلا الإصدارين v4 وv6. يضمن بروتوكول TCP وصول البيانات بالترتيب ويعيد إرسال الحزم المفقودة. كما يولّد ويتحقق من مجموع التحقق (checksum) لكل حزمة لاكتشاف أخطاء الإرسال. لا يحافظ بروتوكول TCP على حدود السجلات.

لا يملك مقبس TCP المُنشأ حديثًا أي عنوان بعيد أو محلي ولا يكون محددًا بالكامل. لإنشاء اتصال TCP صادر، استخدِم connect(2) لإنشاء اتصال بمقبس TCP آخر. لاستقبال اتصالات واردة جديدة، اربط المقبس أولاً bind(2) بعنوان ومنفذ محليين ثم استدعِ listen(2) لوضع المقبس في حالة الإنصات. بعد ذلك، يمكن قبول مقبس جديد لكل اتصال وارد باستخدام accept(2). يكون المقبس الذي استُدعي عليه accept(2) أو connect(2) بنجاح محددًا بالكامل ويمكنه نقل البيانات. لا يمكن نقل البيانات عبر مقابس الإنصات أو المقابس التي لم تُوصَل بعد.

يدعم لينكس امتدادات الأداء العالي لبروتوكول TCP وفق RFC 1323. وتشمل هذه الحماية ضد أرقام التسلسل الملفوفة (PAWS)، وتحجيم النافذة، والطوابع الزمنية. يتيح تحجيم النافذة استخدام نوافذ TCP كبيرة (> 64 كيلوبايت) لدعم الارتباطات ذات التأخير العالي أو عرض النطاق الترددي الواسع. وللاستفادة منها، يجب زيادة أحجام خبيئة الإرسال والاستقبال. يمكن ضبطها عالميًا من خلال ملفات /proc/sys/net/ipv4/tcp_wmem و/proc/sys/net/ipv4/tcp_rmem، أو على المقابس الفردية باستخدام خيارات المقبس SO_SNDBUF وSO_RCVBUF مع استدعاء setsockopt(2).

تُحَدَّد الأحجام القصوى لخبايئ المقابس المصرح عنها عبر آليتي SO_SNDBUF وSO_RCVBUF بالقيم الموجودة في ملفات /proc/sys/net/core/rmem_max و/proc/sys/net/core/wmem_max. لاحظ أن TCP يخصص فعليًا ضعف حجم الخبيئة المطلوب في استدعاء setsockopt(2)، وبالتالي فإن استدعاء getsockopt(2) اللاحق لن يعيد نفس حجم الخبيئة المطلوب في استدعاء setsockopt(2). يستخدم TCP المساحة الإضافية لأغراض إدارية وهياكل النواة الداخلية، وتعكس قيم ملفات /proc الأحجام الأكبر مقارنة بنوافذ TCP الفعلية. في الاتصالات الفردية، يجب ضبط حجم خبيئة المقبس قبل استدعاءات listen(2) أو connect(2) ليدخل حيز التنفيذ. انظر socket(7) لمزيد من المعلومات.

يدعم بروتوكول TCP البيانات العاجلة. تُستخدَم البيانات العاجلة لتنبيه المستلم بأن رسالة مهمة جزء من تدفق البيانات وأنه ينبغي معالجتها في أسرع وقت ممكن. لإرسال بيانات عاجلة، حدد الخيار MSG_OOB لـ send(2). عند استقبال بيانات عاجلة، ترسل النواة إشارة SIGURG إلى العملية أو مجموعة العمليات التي ضُبِطت كـ "مالك" للمقبس باستخدام ioctls SIOCSPGRP أو FIOSETOWN (أو عملية fcntl(2) F_SETOWN المحددة في POSIX.1). عندما يكون خيار المقبس SO_OOBINLINE مفعلاً، تُوضَع البيانات العاجلة في تدفق البيانات العادي (يمكن للبرنامج اختبار موقعها باستخدام ioctl SIOCATMARK الموصوف أدناه)، وإلا فلا يمكن استقبالها إلا عند ضبط علم MSG_OOB لـ recv(2) أو recvmsg(2).

عند وجود بيانات خارج النطاق، يشير select(2) إلى أن واصف الملف لديه حالة استثنائية ويشير poll (2) إلى حدث POLLPRI.

قدّم لينكس 2.4 عددًا من التغييرات لتحسين معدل النقل والتحجيم، بالإضافة إلى وظائف محسنة. تتضمن بعض هذه الميزات دعم النسخ الصفري sendfile(2)، وإشعار الازدحام الصريح، وإدارة جديدة لمقابس TIME_WAIT، وخيارات إبقاء المقبس حيًا ودعم امتدادات SACK المكررة.

  تنسيقات العناوين
بُني TCP فوق بروتوكول IP (انظر ip(7)). تنطبق تنسيقات العناوين المحددة في ip(7) على TCP. يدعم TCP الاتصال من نقطة لنقطة فقط؛ والبث العام (broadcasting) والبث المتعدد (multicasting) غير مدعومين.

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

tcp_abc (عدد صحيح؛ المبدئي: 0؛ لينكس 2.6.15 إلى لينكس 3.8)
    التحكم في عدد البايتات المناسب (ABC)، المحدد في RFC 3465. ABC هي طريقة لزيادة نافذة الازدحام (cwnd) بشكل أبطأ استجابةً للإقرارات الجزئية. القيم الممكنة هي:

    0   زيادة cwnd مرة واحدة لكل إقرار (لا يوجد ABC)

    1   زيادة cwnd مرة واحدة لكل إقرار لقطعة كاملة الحجم

    2   السماح بزيادة cwnd بمقدار اثنين إذا كان الإقرار لقطعتين للتعويض عن الإقرارات المتأخرة.

tcp_abort_on_overflow (Boolean؛ المبدئي: معطل؛ منذ لينكس 2.4)
    تفعيل إعادة تعيين الاتصالات إذا كانت خدمة الإنصات بطيئة جدًا وغير قادرة على المواكبة وقبولها. وهذا يعني أنه في حالة حدوث تجاوز (overflow) بسبب انفجار في الطلبات، فسيسترد الاتصال عافيته. فعّل هذا الخيار فقط إذا كنت متأكدًا حقًا من أنه لا يمكن ضبط عفريت الإنصات لقبول الاتصالات بشكل أسرع. تفعيل هذا الخيار يمكن أن يضر بعملاء خادومك.

tcp_adv_win_scale (عدد صحيح؛ المبدئي: 2؛ منذ لينكس 2.4)
    حساب النفقات العامة للتخزين المؤقت كـ بايتات/2^tcp_adv_win_scale، إذا كان tcp_adv_win_scale أكبر من 0؛ أو بايتات-بايتات/2^(-tcp_adv_win_scale)، إذا كان tcp_adv_win_scale أقل من أو يساوي صفر.

    مساحة خبيئة استقبال المقبس مشتركة بين التطبيق والنواة. يحتفظ TCP بجزء من الخبيئة كنافذة TCP، وهذا هو حجم نافذة الاستقبال المُعلن عنها للطرف الآخر. تُستخدم بقية المساحة كخبيئة "التطبيق"، وتُستخدم لعزل الشبكة عن تأخيرات الجدولة والتطبيق. القيمة المبدئية لـ tcp_adv_win_scale وهي 2 تعني أن المساحة المستخدمة لخبيئة التطبيق هي ربع المساحة الإجمالية.

tcp_allowed_congestion_control (سلسلة؛ المبدئي: انظر النص؛ منذ لينكس 2.4.20)
    عرض/ضبط اختيارات خوارزمية التحكم في الازدحام المتاحة للعمليات غير المتميزة (انظر وصف خيار المقبس TCP_CONGESTION). تُفصل العناصر في القائمة بمسافات بيضاء وتنتهي بحرف سطر جديد. القائمة هي مجموعة فرعية من تلك المدرجة في tcp_available_congestion_control. القيمة المبدئية لهذه القائمة هي "reno" بالإضافة إلى الإعداد المبدئي لـ tcp_congestion_control.

tcp_autocorking (Boolean؛ المبدئي: مفعّل؛ منذ لينكس 3.14)
    إذا فُعّل هذا الخيار، تحاول النواة دمج الكتابات الصغيرة (من استدعاءات write(2) وsendmsg(2) المتتالية) قدر الإمكان، لتقليل العدد الإجمالي للحزم المرسلة. يتم الدمج إذا كانت هناك حزمة سابقة واحدة على الأقل للتدفق تنتظر في طوابير Qdisc أو طابور إرسال الجهاز. لا يزال بإمكان التطبيقات استخدام خيار المقبس TCP_CORK للحصول على سلوك مثالي عندما تعرف كيف/متى تفتح سدادة مقابسها.

tcp_available_congestion_control (سلسلة؛ للقراءة فقط؛ منذ لينكس 2.4.20)
    عرض قائمة بخوارزميات التحكم في الازدحام المسجلة. تُفصل العناصر في القائمة بمسافات بيضاء وتنتهي بحرف سطر جديد. تعد هذه القائمة مجموعة مقيدة للقائمة في tcp_allowed_congestion_control. قد تتوفر المزيد من خوارزميات التحكم في الازدحام كوحدات (modules)، ولكنها غير مُحمّلة.

tcp_app_win (عدد صحيح؛ المبدئي: 31؛ منذ لينكس 2.4)
    يحدد هذا المتغير عدد البايتات من نافذة TCP المحجوزة للنفقات العامة للتخزين المؤقت.

    يُحجز بحد أقصى (window/2^tcp_app_win, mss) بايت في النافذة لخبيئة التطبيق. تعني القيمة 0 عدم حجز أي مقدار.

tcp_base_mss (عدد صحيح؛ المبدئي: 512؛ منذ لينكس 2.6.17)
    القيمة الأولية لـ search_low التي ستستخدمها طبقة تحزيم البيانات لاكتشاف Path MTU (سبر MTU). إذا فُعّل سبر MTU، فهذا هو MSS الأولي الذي يستخدمه الاتصال.

tcp_bic (Boolean؛ المبدئي: معطل؛ لينكس 2.4.27/2.6.6 إلى لينكس 2.6.13)
    تفعيل خوارزمية التحكم في ازدحام BIC TCP. يُعد BIC-TCP تغييرًا في جانب المرسل فقط يضمن عدالة RTT خطية تحت النوافذ الكبيرة مع توفير كل من قابلية التوسع ومودة TCP المحدودة. يجمع البروتوكول بين مخططين يسمى أحدهما الزيادة المضافة والآخر زيادة البحث الثنائي. عندما تكون نافذة الازدحام كبيرة، تضمن الزيادة المضافة بزيادة كبيرة عدالة RTT الخطية بالإضافة إلى قابلية التوسع الجيدة. في ظل نوافذ الازدحام الصغيرة، يوفر البحث الثنائي زيادة في مودة TCP.

tcp_bic_low_window (عدد صحيح؛ المبدئي: 14؛ لينكس 2.4.27/2.6.6 إلى لينكس 2.6.13)
    ضبط نافذة العتبة (بالحزم) حيث يبدأ BIC TCP في ضبط نافذة الازدحام. تحت هذه العتبة، يتصرف BIC TCP بنفس طريقة TCP Reno المبدئي.

tcp_bic_fast_convergence (Boolean؛ المبدئي: مفعّل؛ لينكس 2.4.27/2.6.6 إلى لينكس 2.6.13)
    إجبار BIC TCP على الاستجابة بسرعة أكبر للتغيرات في نافذة الازدحام. يسمح لتدفقين يشتركان في نفس الاتصال بالتقارب بسرعة أكبر.

tcp_congestion_control (سلسلة؛ المبدئي: انظر النص؛ منذ لينكس 2.4.13)
    اضبط خوارزمية التحكم في الازدحام المبدئية التي ستُستخدم للاتصالات الجديدة. خوارزمية "reno" متاحة دائمًا، ولكن قد تتوفر خيارات إضافية اعتمادًا على ضبط النواة. تُعيّن القيمة المبدئية لهذا الملف كجزء من ضبط النواة.

tcp_dma_copybreak (عدد صحيح؛ مبدئي: 4096؛ منذ لينكس 2.6.24)
    الحد الأدنى، بالبايت، لحجم قراءات المقبس التي ستُرحّل إلى محرك نسخ DMA، إذا كان موجودًا في النظام وضُبطت النواة مع خيار CONFIG_NET_DMA.

tcp_dsack (Boolean؛ المبدئي: مفعّل؛ منذ لينكس 2.4)
    تفعيل دعم TCP Duplicate SACK وفق RFC 2883.

tcp_fastopen (قناع بتات؛ مبدئي: 0x1؛ منذ لينكس 3.7)
    يفعّل دعم RFC 7413 Fast Open. يُستخدم العلم كخريطة بتات بالقيم التالية:

    0x1 يفعّل دعم Fast Open من جانب العميل

    0x2 يفعّل دعم Fast Open من جانب الخادم

    0x4 يسمح لجانب العميل بإرسال البيانات في SYN بدون خيار Fast Open

    0x200
        يسمح لجانب الخادم بقبول بيانات SYN بدون خيار Fast Open

    0x400
        يفعّل Fast Open على جميع المستمعين بدون خيار مقبس TCP_FASTOPEN

tcp_fastopen_key (منذ لينكس 3.7)
    اضبط مفتاح Fast Open الخاص بـ RFC 7413 لجانب الخادم لتوليد كعكة Fast Open عندما يكون دعم Fast Open لجانب الخادم مفعلاً.

tcp_ecn (عدد صحيح؛ المبدئي: انظر أدناه؛ منذ لينكس 2.4)
    يفعّل RFC 3168 للإشعار الصريح بالازدحام (ECN).

    يمكن أن يحتوي هذا الملف على إحدى القيم التالية:

    0   يعطل ECN. لا يشرع في ECN ولا يقبله. كان هذا هو المبدئي حتى الإصدار 2.6.30 من لينكس.

    1   فعّل ECN عندما تطلبه الاتصالات الواردة واطلب أيضًا ECN في محاولات الاتصال الصادرة.

    2   يفعّل ECN عند طلبه بواسطة الاتصالات الواردة، ولكنه لا يطلب ECN في الاتصالات الصادرة. هذه القيمة مدعومة، وهي المبدئية، منذ لينكس 2.6.31.

    عند التفعيل، قد تتأثر الاتصال ببعض الوجهات بسبب أجهزة وسيطة قديمة وسيئة التصرف على طول المسار، مما يسبب قطع الاتصالات. ومع ذلك، لتسهيل وتشجيع النشر مع الخيار 1، وللالتفاف على مثل هذه المعدات المعطوبة، أُضيف خيار tcp_ecn_fallback.

tcp_ecn_fallback (منطقي؛ مبدئي: مفعّل؛ منذ لينكس 4.1)
    يفعّل تراجع RFC 3168، القسم 6.1.1.1. عند تفعيله، فإن رسائل SYN الصادرة لإعداد ECN التي تنتهي مهلتها ضمن مهلة إعادة إرسال SYN العادية سيُعاد إرسالها مع مسح CWR وECE.

tcp_fack (منطقي؛ مبدئي: مفعّل؛ منذ لينكس 2.2)
    تفعيل دعم إقرار التمرير لـ TCP.

tcp_fin_timeout (عدد صحيح؛ المبدئي: 60؛ منذ لينكس 2.2)
    يحدد هذا عدد الثواني لانتظار حزمة FIN النهائية قبل إغلاق المقبس قسراً. يعد هذا انتهاكاً صارماً لمواصفات TCP، ولكنه مطلوب لمنع هجمات حجب الخدمة. في لينكس 2.2، كانت القيمة المبدئية 180.

tcp_frto (عدد صحيح؛ مبدئي: انظر أدناه؛ منذ لينكس 2.4.21/2.6)
    يفعّل F-RTO، وهو خوارزمية استرداد محسنة لمهلات إعادة إرسال TCP (RTOs). وهي مفيدة بشكل خاص في البيئات اللاسلكية حيث يكون فقدان الحزم عادةً بسبب تداخل راديوي عشوائي بدلاً من ازدحام الموجهات الوسيطة. انظر RFC 4138 لمزيد من التفاصيل.

    يمكن أن يحتوي هذا الملف على إحدى القيم التالية:

    0   معطل. كان هذا هو المبدئي حتى الإصدار 2.6.23 من لينكس.

    1   نُسخة خوارزمية F-RTO الأساسية مفعّلة.

    2   يفعّل F-RTO المحسن بـ SACK إذا كان التدفق يستخدم SACK. يمكن استخدام النسخة الأساسية أيضًا عند استخدام SACK، على الرغم من وجود سيناريوهات في هذه الحالة يتفاعل فيها F-RTO بشكل سيء مع عد الحزم لتدفق TCP المفعّل بـ SACK. هذه القيمة هي المبدئية منذ لينكس 2.6.24.

    قبل لينكس 2.6.22، كان هذا المعامل قيمة منطقية، يدعم فقط القيمتين 0 و1 أعلاه.

tcp_frto_response (عدد صحيح؛ مبدئي: 0؛ منذ لينكس 2.6.22)
    عندما يكتشف F-RTO أن مهلة إعادة إرسال TCP كانت زائفة (أي أنه كان يمكن تجنب المهلة لو ضبط TCP مهلة إعادة إرسال أطول)، فإن لدى TCP عدة خيارات بشأن ما يجب فعله بعد ذلك. القيم الممكنة هي:

    0   قائم على تنصيف المعدل؛ استجابة سلسة ومحافظة، تؤدي إلى تنصيف نافذة الازدحام (cwnd) وعتبة البداية البطيئة (ssthresh) بعد زمن انتقال ذهاب وإياب (RTT) واحد.

    1   استجابة محافظة للغاية؛ لا يُنصح بها لأنها، رغم كونها صالحة، تتفاعل بشكل سيء مع بقية أجزاء TCP في لينكس؛ تنصّف cwnd و ssthresh فورًا.

    2   استجابة هجومية؛ تُلغي تدابير التحكم في الازدحام التي عُرف الآن أنها غير ضرورية (مع تجاهل إمكانية فقدان إعادة إرسال تتطلب أن يكون TCP أكثر حذرًا)؛ تُستعاد cwnd و ssthresh إلى القيم التي كانت عليها قبل المهلة.

tcp_keepalive_intvl (عدد صحيح؛ المبدئي: 75؛ منذ لينكس 2.4)
    عدد الثواني بين فحوصات keep-alive لـ TCP.

tcp_keepalive_probes (عدد صحيح؛ المبدئي: 9؛ منذ لينكس 2.2)
    العدد الأقصى لفحوصات keep-alive لـ TCP التي تُرسل قبل الاستسلام وإنهاء الاتصال إذا لم يُستلم رد من الطرف الآخر.

tcp_keepalive_time (عدد صحيح؛ المبدئي: 7200؛ منذ لينكس 2.2)
    عدد الثواني التي يحتاجها الاتصال ليكون خاملاً قبل أن يبدأ TCP في إرسال مجسات إبقاء الاتصال حيًا (keep-alive). تُرسل هذه المجسات فقط عند تفعيل خيار المقبس SO_KEEPALIVE. القيمة المبدئية هي 7200 ثانية (ساعتان). يُنهى الاتصال الخامل بعد حوالي 11 دقيقة إضافية (9 مجسات بفاصل زمني 75 ثانية) عند تفعيل إبقاء الاتصال حيًا.

    لاحظ أن آليات تتبع الاتصال الأساسية ومهلات التطبيقات قد تكون أقصر بكثير.

tcp_low_latency (منطقي؛ مبدئي: معطل؛ منذ لينكس 2.4.21/2.6؛ مهمل منذ لينكس 4.14)
    إذا فُعّل، تتخذ حزمة TCP قرارات تفضل زمن انتقال أقل بدلاً من إنتاجية أعلى. وإذا عُطّل هذا الخيار، تُفضّل الإنتاجية الأعلى. أحد الأمثلة على التطبيقات التي يجب فيها تغيير هذا المبدئي هو عنقود حوسبة بيوولف. منذ لينكس 4.14، لا يزال هذا الملف موجودًا، ولكن قيمته تُتجاهل.

tcp_max_orphans (عدد صحيح؛ المبدئي: انظر أدناه؛ منذ لينكس 2.4)
    الحد الأقصى لعدد مقابس TCP اليتيمة (غير الملحقة بأي واصف ملف مستخدم) المسموح بها في النظام. عندما يُتجاوز هذا العدد، يُصفّر الاتصال اليتيم ويُطبع تحذير. يوجد هذا الحد فقط لمنع هجمات حجب الخدمة البسيطة. لا يُنصح بخفض هذا الحد. قد تتطلب ظروف الشبكة زيادة عدد الأيتام المسموح بهم، ولكن لاحظ أن كل يتيم يمكن أن يستهلك ما يصل إلى ~64 كيلوبايت من الذاكرة غير القابلة للتبديل. تُضبط القيمة المبدئية الأولية لتساوي معامل النواة NR_FILE. يُعدّل هذا المبدئي الأولي اعتمادًا على الذاكرة في النظام.

tcp_max_syn_backlog (عدد صحيح؛ المبدئي: انظر أدناه؛ منذ لينكس 2.2)
    أقصى عدد لطلبات الاتصال في الطابور التي لم تتلقَ بعد إشعارًا بالاستلام من العميل المتصل. إذا تُجاوز هذا العدد، ستبدأ النواة في إسقاط الطلبات. تُزاد القيمة المبدئية البالغة 256 إلى 1024 عندما تكون الذاكرة الموجودة في النظام كافية أو أكبر (>= 128 ميجابايت)، وتُخفض إلى 128 للأنظمة ذات الذاكرة المنخفضة جدًا (<= 32 ميجابايت).

    قبل لينكس 2.6.20، كان يُوصى بأنه إذا لزم زيادة هذا فوق 1024، فيجب تعديل حجم جدول هاش SYNACK المسمى (TCP_SYNQ_HSIZE) في include/net/tcp.h للحفاظ على

        TCP_SYNQ_HSIZE * 16 <= tcp_max_syn_backlog

    وإعادة بناء النواة. في لينكس 2.6.20، أُزيل TCP_SYNQ_HSIZE ذو الحجم الثابت لصالح التحجيم الديناميكي.

tcp_max_tw_buckets (عدد صحيح؛ المبدئي: انظر أدناه؛ منذ لينكس 2.4)
    الحد الأقصى لعدد المقابس في حالة TIME_WAIT المسموح بها في النظام. يوجد هذا الحد فقط لمنع هجمات حجب الخدمة البسيطة. تُعدّل القيمة المبدئية البالغة NR_FILE*2 اعتمادًا على الذاكرة في النظام. إذا تُجاوز هذا العدد، يُغلق المقبس ويُطبع تحذير.

tcp_moderate_rcvbuf (Boolean؛ المبدئي: مفعّل؛ منذ لينكس 2.4.17/2.6.7)
    إذا فُعّل، يقوم TCP بالضبط الآلي لدرء الاستقبال، محاولاً تحديد حجم الدرء آليًا (بما لا يتجاوز tcp_rmem[2]) ليتناسب مع الحجم المطلوب بواسطة المسار للحصول على كامل الإنتاجية.

tcp_mem (منذ لينكس 2.4)
    هذا متجه من 3 أعداد صحيحة: [low، pressure، high]. تُستخدم هذه الحدود، المقاسة بوحدات حجم صفحة النظام، بواسطة TCP لتتبع استخدامه للذاكرة. تُحسب القيم المبدئية عند وقت الإقلاع من كمية الذاكرة المتاحة. (لا يمكن لـ TCP سوى استخدام low memory لهذا الغرض، وهو محدود بحوالي 900 ميجابايت في أنظمة 32-بت. أنظمة 64-بت لا تعاني من هذا القيد).

    low لا ينظم TCP تخصيصه للذاكرة عندما يكون عدد الصفحات التي خصصها عالميًا أقل من هذا الرقم.

    pressure
        عندما تتجاوز كمية الذاكرة التي خصصها بروتوكول TCP عدد الصفحات هذا، يلطف البروتوكول استهلاكه للذاكرة. وتُغادر حالة ضغط الذاكرة هذه بمجرد انخفاض عدد الصفحات المخصصة عن علامة low.

    high
        الحد الأقصى لعدد الصفحات، عالميًا، التي سيخصصها بروتوكول TCP. تتخطى هذه القيمة أي قيود أخرى تفرضها النواة.

tcp_mtu_probing (عدد صحيح؛ مبدئي: 0؛ منذ لينكس 2.6.17)
    يتحكم هذا المعامل في اكتشاف MTU للمسار في طبقة تجزئة الحزم (Packetization-Layer Path MTU Discovery) لبروتوكول TCP. يمكن إسناد القيم التالية للملف:

    0   معطل

    1   معطل مبدئيًا، ويُفعل عند اكتشاف ثقب أسود لبروتوكول ICMP

    2   مفعل دائمًا، ويستخدم MSS الأولي لـ tcp_base_mss.

tcp_no_metrics_save (منطقي؛ مبدئي: معطل؛ منذ لينكس 2.6.6)
    مبدئيًا، يحفظ TCP مقاييس اتصال متنوعة في خبيئة المسار عند إغلاق الاتصال، حتى تتمكن الاتصالات التي تُنشأ في المستقبل القريب من استخدامها لضبط الظروف الأولية. عادةً ما يؤدي هذا لزيادة الأداء العام، ولكنه قد يسبب أحيانًا تدهورًا في الأداء. إذا فُعل tcp_no_metrics_save، فلن يخبئ TCP المقاييس عند إغلاق الاتصالات.

tcp_orphan_retries (عدد صحيح؛ مبدئي: 8؛ منذ لينكس 2.4)
    الحد الأقصى لعدد المحاولات المبذولة لسبر الطرف الآخر من اتصال أُغلق من طرفنا.

tcp_reordering (عدد صحيح؛ مبدئي: 3؛ منذ لينكس 2.4)
    الحد الأقصى الذي يمكن فيه إعادة ترتيب حزمة في دفق حزم TCP دون أن يفترض البروتوكول فقدان الحزمة والدخول في البداية البطيئة. لا يُنصح بتغيير هذا الرقم. هذا مقياس لاكتشاف إعادة ترتيب الحزم صُمم لتقليل عمليات التراجع وإعادة الإرسال غير الضرورية الناتجة عن إعادة ترتيب الحزم في الاتصال.

tcp_retrans_collapse (منطقي؛ مبدئي: مفعل؛ منذ لينكس 2.2)
    حاول إرسال حزم كاملة الحجم أثناء إعادة الإرسال.

tcp_retries1 (عدد صحيح؛ مبدئي: 3؛ منذ لينكس 2.2)
    عدد المرات التي سيحاول فيها TCP إعادة إرسال حزمة على اتصال قائم بشكل طبيعي، دون الجهد الإضافي المتمثل في إشراك طبقات الشبكة. بمجرد تجاوز عدد عمليات إعادة الإرسال هذا، نطلب أولاً من طبقة الشبكة تحديث المسار إن أمكن قبل كل عملية إعادة إرسال جديدة. القيمة المبدئية هي الحد الأدنى المحدد في RFC وهو 3.

tcp_retries2 (عدد صحيح؛ مبدئي: 15؛ منذ لينكس 2.2)
    الحد الأقصى لعدد مرات إعادة إرسال حزمة TCP في الحالة القائمة قبل الاستسلام. القيمة المبدئية هي 15، وهي تقابل مدة تتراوح تقريبًا بين 13 إلى 30 دقيقة، اعتمادًا على مهلة إعادة الإرسال. يُعتبر الحد الأدنى المحدد في RFC 1122 وهو 100 ثانية قصيرًا جدًا عادةً.

tcp_rfc1337 (منطقي؛ مبدئي: معطل؛ منذ لينكس 2.2)
    تفعيل سلوك TCP المتوافق مع RFC 1337. عند تعطيله، إذا استُلمت حزمة RST في حالة TIME_WAIT، نغلق المقبس فورًا دون انتظار نهاية فترة TIME_WAIT.

tcp_rmem (منذ لينكس 2.4)
    هذا متجه من 3 أعداد صحيحة: [min, default, max]. يستخدم TCP هذه المعاملات لتنظيم أحجام مخازن الاستقبال المؤقتة. يضبط TCP حجم مخزن الاستقبال المؤقت ديناميكيًا من القيم المبدئية المدرجة أدناه، ضمن نطاق هذه القيم، بناءً على الذاكرة المتاحة في النظام.

    min الحد الأدنى لحجم مخزن الاستقبال المؤقت الذي يستخدمه كل مقبس TCP. القيمة المبدئية هي حجم صفحة النظام. (في لينكس 2.4، القيمة المبدئية هي 4 ك.بايت، وخُفضت إلى PAGE_SIZE بايت في الأنظمة ذات الذاكرة المنخفضة). تُستخدم هذه القيمة لضمان نجاح عمليات التخصيص التي تقل عن هذا الحجم في وضع ضغط الذاكرة. لا تُستخدم هذه القيمة لتقييد حجم مخزن الاستقبال المؤقت المعلن عنه باستخدام SO_RCVBUF على مقبس.

    default
        الحجم المبدئي لمخزن الاستقبال المؤقت لمقبس TCP. تتخطى هذه القيمة حجم المخزن المبدئي الأولي من net.core.rmem_default العالمي العام المعرف لكل البروتوكولات. القيمة المبدئية هي 87380 بايت. (في لينكس 2.4، ستُخفض إلى 43689 في الأنظمة ذات الذاكرة المنخفضة). إذا كانت هناك رغبة في أحجام أكبر لمخازن الاستقبال، فيجب زيادة هذه القيمة (ليؤثر ذلك على جميع المقابس). لاستخدام نوافذ TCP كبيرة، يجب تفعيل net.ipv4.tcp_window_scaling (مبدئي).

    max الحد الأقصى لحجم مخزن الاستقبال المؤقت الذي يستخدمه كل مقبس TCP. لا تتخطى هذه القيمة net.core.rmem_max العالمي. لا تُستخدم لتقييد حجم مخزن الاستقبال المؤقت المعلن عنه باستخدام SO_RCVBUF على مقبس. تُحسب القيمة المبدئية باستخدام الصيغة

            max(87380, min(4 MB, tcp_mem[1]*PAGE_SIZE/128))

        (في لينكس 2.4، القيمة المبدئية هي 87380*2 بايت، وخُفضت إلى 87380 في أنظمة الذاكرة المنخفضة).

tcp_sack (منطقي؛ مبدئي: مفعل؛ منذ لينكس 2.2)
    تفعيل إقرارات الاستلام الاختيارية لـ TCP وفق RFC 2018.

tcp_slow_start_after_idle (Boolean؛ المبدئي: مفعّل؛ منذ لينكس 2.6.18)
    إذا فُعّل، سيوفر سلوك RFC 2861 وينهي مهلة نافذة الازدحام بعد فترة خمول. تُعرف فترة الخمول بأنها RTO (مهلة إعادة الإرسال) الحالية. إذا عُطّل، فلن تنتهي مهلة نافذة الازدحام بعد فترة خمول.

tcp_stdurg (Boolean؛ المبدئي: معطل؛ منذ لينكس 2.2)
    إذا فُعّل هذا الخيار، سيُستخدم تفسير RFC 1122 لحقل مؤشر الاستعجال في TCP. وفقًا لهذا التفسير، يشير مؤشر الاستعجال إلى البايت الأخير من البيانات العاجلة. أما إذا عُطّل هذا الخيار، فسيُستخدم التفسير المتوافق مع BSD لمؤشر الاستعجال: حيث يشير مؤشر الاستعجال إلى البايت الأول بعد البيانات العاجلة. قد يؤدي تفعيل هذا الخيار إلى مشاكل في التوافقية التشغيلية.

tcp_syn_retries (عدد صحيح؛ المبدئي: 6؛ منذ لينكس 2.2)
    أقصى عدد لمرات إعادة إرسال رسائل SYN الأولية لمحاولة اتصال TCP نشط. يجب ألا تزيد هذه القيمة عن 255. القيمة المبدئية هي 6، مما يتوافق مع إعادة المحاولة لمدة تصل إلى 127 ثانية تقريبًا. قبل لينكس 3.7، كانت القيمة المبدئية 5، والتي كانت (بالاشتراك مع الحسابات المستندة إلى معاملات النواة الأخرى) تتوافق مع 180 ثانية تقريبًا.

tcp_synack_retries (عدد صحيح؛ المبدئي: 5؛ منذ لينكس 2.2)
    العدد الأقصى لمرات إعادة إرسال قطعة SYN/ACK لاتصال TCP سلبي. يجب ألا يزيد هذا الرقم عن 255.

tcp_syncookies (عدد صحيح؛ المبدئي: 1؛ منذ لينكس 2.2)
    يفعّل كعكات مزامنة TCP (syncookies). يجب بناء النواة مع خيار CONFIG_SYN_COOKIES. تحاول ميزة كعكات المزامنة حماية المقبس من هجوم الغمر بطلبات المزامنة (SYN flood). يجب استخدام هذا كملجأ أخير، إن استُخدم أصلاً. هذا يمثل انتهاكًا لبروتوكول TCP، ويتعارض مع مجالات أخرى مثل توسيعات TCP. قد يسبب مشاكل للعملاء والمرحّلات. لا يُنصح به كآلية ضبط للخوادم ذات التحميل الثقيل للمساعدة في حالات التحميل الزائد أو سوء الضبط. للبدائل الموصى بها، انظر tcp_max_syn_backlog، و tcp_synack_retries، و tcp_abort_on_overflow. اضبطه على إحدى القيم التالية:

    0   يعطل كعكات مزامنة TCP.

    1   يرسل كعكات مزامنة عندما يفيض طابور المزامنة الخلفي للمقبس.

    2   (منذ لينكس 3.12) يرسل كعكات مزامنة دون قيد أو شرط. قد يكون هذا مفيدًا لاختبار الشبكة.

tcp_timestamps (عدد صحيح؛ المبدئي: 1؛ منذ لينكس 2.2)
    اضبطه على إحدى القيم التالية لتفعيل أو تعطيل الطوابع الزمنية لـ RFC 1323 TCP:

    0   يعطل الطوابع الزمنية.

    1   يفعّل الطوابع الزمنية كما هي محددة في RFC1323 ويستخدم إزاحة عشوائية لكل اتصال بدلاً من استخدام الوقت الحالي فقط.

    2   كما هو الحال في القيمة 1، ولكن بدون إزاحات عشوائية. تعيين tcp_timestamps لهذه القيمة له معنى منذ لينكس 4.10.

tcp_tso_win_divisor (عدد صحيح؛ المبدئي: 3؛ منذ لينكس 2.6.9)
    يتحكم هذا المعامل في النسبة المئوية التي يمكن أن يستهلكها إطار واحد من ترحيل تقطيع TCP‏ (TSO) من نافذة الازدحام. ضبط هذا المعامل هو مفاضلة بين الاندفاعية وبناء إطارات TSO أكبر.

tcp_tw_recycle (Boolean؛ المبدئي: معطل؛ لينكس 2.4 إلى لينكس 4.11)
    يفعّل إعادة التدوير السريع لمقابس TIME_WAIT. لا يُنصح بتفعيل هذا الخيار لأن عنوان IP البعيد قد لا يستخدم طوابع زمنية تتزايد بشكل مطرد (الأجهزة خلف NAT، أو الأجهزة التي تحتوي على إزاحات طوابع زمنية لكل اتصال). انظر RFC 1323 (PAWS) و RFC 6191.

tcp_tw_reuse (منطقي؛ مبدئي: معطل؛ منذ لينكس 2.4.19/2.6)
    يسمح بإعادة استخدام مقابس TIME_WAIT للاتصالات الجديدة عندما يكون ذلك آمنًا من منظور البروتوكول. لا ينبغي تغييره دون نصيحة أو طلب من خبراء تقنيين.

tcp_vegas_cong_avoid (منطقي؛ مبدئي: معطل؛ من لينكس 2.2 إلى لينكس 2.6.13)
    يفعّل خوارزمية تجنب الازدحام TCP Vegas. تعد TCP Vegas تغييرًا من جانب المرسل فقط على TCP تتوقع حدوث الازدحام من خلال تقدير عرض النطاق الترددي. تضبط TCP Vegas معدل الإرسال عن طريق تعديل نافذة الازدحام. يجب أن توفر TCP Vegas فقدانًا أقل للحزم، لكنها ليست بنفس هجومية TCP Reno.

tcp_westwood (منطقي؛ مبدئي: معطل؛ من لينكس 2.4.26/2.6.3 إلى لينكس 2.6.13)
    يفعّل خوارزمية التحكم في الازدحام TCP Westwood+. تعد TCP Westwood+ تعديلاً من جانب المرسل فقط لحزمة بروتوكول TCP Reno تعمل على تحسين أداء التحكم في ازدحام TCP. وتعتمد على تقدير عرض النطاق الترددي من طرف إلى طرف لتعيين نافذة الازدحام وعتبة البداية البطيئة بعد نوبة ازدحام. باستخدام هذا التقدير، تضبط TCP Westwood+ عتبة البداية البطيئة ونافذة الازدحام بشكل متكيف يأخذ في الاعتبار عرض النطاق الترددي المستخدم وقت حدوث الازدحام. تزيد TCP Westwood+ بشكل ملحوظ من العدالة فيما يتعلق بـ TCP Reno في الشبكات السلكية والإنتاجية عبر الروابط اللاسلكية.

tcp_window_scaling (منطقي؛ مبدئي: مفعّل؛ منذ لينكس 2.2)
    يفعّل تحجيم نافذة TCP الخاصة بـ RFC 1323. تتيح هذه الميزة استخدام نافذة كبيرة (> 64 كيلوبايت) في اتصال TCP، إذا كان الطرف الآخر يدعم ذلك. عادةً، يحد حقل طول النافذة المكون من 16 بت في ترويسة TCP من حجم النافذة إلى أقل من 64 كيلوبايت. وإذا رغبت التطبيقات في نوافذ أكبر، فيمكنها زيادة حجم درء المقابس الخاصة بها وسيُستخدم خيار تحجيم النافذة. إذا عُطّل tcp_window_scaling، فلن يتفاوض TCP على استخدام تحجيم النافذة مع الطرف الآخر أثناء إعداد الاتصال.

tcp_wmem (منذ لينكس 2.4)
    هذا متجه من 3 أعداد صحيحة: [min, default, max]. تُستخدم هذه المعاملات بواسطة TCP لتنظيم أحجام درء الإرسال. يضبط TCP حجم درء الإرسال ديناميكيًا من القيم المبدئية المدرجة أدناه، ضمن نطاق هذه القيم، اعتمادًا على الذاكرة المتاحة.

    min الحد الأدنى لحجم درء الإرسال الذي يستخدمه كل مقبس TCP. القيمة المبدئية هي حجم صفحة النظام. (في لينكس 2.4، كانت القيمة المبدئية 4 كيلوبايت). تُستخدم هذه القيمة للتأكد من أنه في وضع ضغط الذاكرة، ستظل التخصيصات الأقل من هذا الحجم ناجحة. لا يُستخدم هذا لتقييد حجم درء الإرسال المصرح به باستخدام SO_SNDBUF على مقبس.

    default
        الحجم المبدئي لدرء الإرسال لمقبس TCP. تتجاوز هذه القيمة حجم الدرء المبدئي الأولي من /proc/sys/net/core/wmem_default العالمي المحدد لجميع البروتوكولات. القيمة المبدئية هي 16 كيلوبايت. وإذا كانت هناك رغبة في أحجام درء إرسال أكبر، فيجب زيادة هذه القيمة (ليشمل التأثير جميع المقابس). لاستخدام نوافذ TCP كبيرة، يجب ضبط /proc/sys/net/ipv4/tcp_window_scaling على قيمة غير صفرية (مبدئي).

    max الحجم الأقصى لدرء الإرسال الذي يستخدمه كل مقبس TCP. لا تتجاوز هذه القيمة القيمة الموجودة في /proc/sys/net/core/wmem_max. لا يُستخدم هذا للحد من حجم درء الإرسال المصرح به باستخدام SO_SNDBUF على مقبس. تُحسب القيمة المبدئية باستخدام الصيغة

            max(65536, min(4 MB, tcp_mem[1]*PAGE_SIZE/128))

        (في لينكس 2.4، القيمة المبدئية هي 128 كيلوبايت، وتُخفض إلى 64 كيلوبايت اعتمادًا على الأنظمة ذات الذاكرة المنخفضة).

tcp_workaround_signed_windows (Boolean؛ المبدئي: معطل؛ منذ لينكس 2.6.26)
    إذا فُعّل، فافترض أن عدم استلام خيار تحجيم النافذة يعني أن TCP البعيد معطل ويعامل النافذة ككمية موقعة. وإذا عُطّل، فافترض أن TCP البعيد ليس معطلاً حتى لو لم نتلقَ خيار تحجيم النافذة منه.

  خيارات المقبس
لضبط خيار مقبس TCP أو الحصول عليه، استدعِ getsockopt(2) للقراءة أو setsockopt(2) للكتابة مع ضبط معامل مستوى الخيار على IPPROTO_TCP. ما لم يُذكر خلاف ذلك، فإن optval هو مؤشر لـ int. بالإضافة إلى ذلك، فإن معظم خيارات مقبس IPPROTO_IP صالحة على مقابس TCP. لمزيد من المعلومات، انظر ip(7).

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

TCP_CONGESTION (منذ لينكس 2.6.13)
    المعامل لهذا الخيار هو سلسلة نصية. يسمح هذا الخيار للمستدعي بضبط خوارزمية التحكم في ازدحام TCP المراد استخدامها، لكل مقبس على حدة. تقتصر العمليات غير المميزة على اختيار إحدى الخوارزميات في tcp_allowed_congestion_control (الموضحة أعلاه). يمكن للعمليات المميزة (CAP_NET_ADMIN) الاختيار من أي من خوارزميات التحكم في الازدحام المتاحة (انظر وصف tcp_available_congestion_control أعلاه).

TCP_CORK (منذ لينكس 2.2)
    إذا ضُبط، فلا تُرسل الإطارات الجزئية. تُرسل جميع الإطارات الجزئية الموجودة في الطابور عند مسح الخيار مرة أخرى. هذا مفيد لإضافة الترويسات قبل استدعاء sendfile(2)، أو لتحسين الإنتاجية. حسب التنفيذ الحالي، يوجد سقف زمني قدره 200 مللي ثانية للوقت الذي تُسد فيه المخرجات بواسطة TCP_CORK. إذا وصل إلى هذا السقف، تُرسل البيانات الموجودة في الطابور آلياً. يمكن دمج هذا الخيار مع TCP_NODELAY فقط منذ لينكس 2.5.71. ينبغي عدم استخدام هذا الخيار في الكود البرمجي الذي يُراد له أن يكون محمولاً.

TCP_DEFER_ACCEPT (منذ لينكس 2.4)
    يسمح بإيقاظ المستمع فقط عند وصول البيانات إلى المقبس. يأخذ قيمة عدد صحيح (بالثواني)، وهذا يمكن أن يحد من أقصى عدد من المحاولات التي سيقوم بها TCP لإكمال الاتصال. ستقوم النواة بتقريب هذه القيمة إلى المدة التالية الأكبر لإعادة إرسال TCP.

    على مقبس العميل، إذا كانت القيمة غير صفرية، يؤخر إرسال الإشعار النهائي (ACK) للمصافحة الثلاثية حتى تتوفر لدى المقبس بيانات لإرسالها، وفي هذه الحالة يُحمل الإشعار (ACK) على أول قطعة بيانات، أو حتى يتم الوصول إلى مهلة الإشعار المتأخر (delayed-ACK).

    لا ينبغي استخدام هذا الخيار في الأكواد البرمجية التي يُقصد أن تكون محمولة.

TCP_INFO (منذ لينكس 2.4)
    يُستخدم لجمع معلومات حول هذا المقبس. تعيد النواة بنية struct tcp_info كما هي معرفة في الملف /usr/include/linux/tcp.h. لا ينبغي استخدام هذا الخيار في الأكواد البرمجية التي يُقصد أن تكون محمولة.

TCP_KEEPCNT (منذ لينكس 2.4)
    العدد الأقصى لفحوصات keepalive التي يجب أن يرسلها TCP قبل إسقاط الاتصال. ينبغي عدم استخدام هذا الخيار في الكود البرمجي الذي يُراد له أن يكون محمولاً.

TCP_KEEPIDLE (منذ لينكس 2.4)
    الوقت (بالثواني) الذي يحتاجه الاتصال ليبقى خاملاً قبل أن يبدأ TCP في إرسال مجسات إبقاء الاتصال حيًا، إذا عُيّن خيار المقبس SO_KEEPALIVE على هذا المقبس. لا ينبغي استخدام هذا الخيار في الأكواد البرمجية التي يُقصد أن تكون محمولة.

TCP_KEEPINTVL (منذ لينكس 2.4)
    الوقت (بالثواني) بين فحوصات keepalive الفردية. ينبغي عدم استخدام هذا الخيار في الكود البرمجي الذي يُراد له أن يكون محمولاً.

TCP_LINGER2 (منذ لينكس 2.4)
    عمر المقابس اليتيمة في حالة FIN_WAIT2. يمكن استخدام هذا الخيار لتجاوز الإعداد على مستوى النظام في الملف /proc/sys/net/ipv4/tcp_fin_timeout لهذا المقبس. لا ينبغي الخلط بين هذا وبين خيار مستوى socket(7) المسمى SO_LINGER. لا ينبغي استخدام هذا الخيار في الأكواد البرمجية التي يُقصد أن تكون محمولة.

TCP_MAXSEG
    أقصى حجم للقطعة (MSS) لحزم TCP الصادرة. في لينكس 2.2 وما قبله، وفي لينكس 2.6.28 وما بعده، إذا عُيّن هذا الخيار قبل إنشاء الاتصال، فإنه يغير أيضًا قيمة MSS المعلنة للطرف الآخر في الحزمة الأولية. القيم الأكبر من MTU (النهائي) للواجهة ليس لها تأثير. سيفرض TCP أيضًا حدوده الدنيا والقصوى على القيمة المقدمة.

TCP_NODELAY
    إذا ضُبط، تُعطل خوارزمية Nagle. وهذا يعني أن القطع تُرسل دائماً في أسرع وقت ممكن، حتى لو كان هناك مقدار ضئيل من البيانات. عندما لا يُضبط، تُخزن البيانات في خبيئة حتى يتوفر مقدار كافٍ لإرساله، وبذلك يتجنب الإرسال المتكرر للحزم الصغيرة، مما يؤدي إلى سوء استغلال الشبكة. يُلغى هذا الخيار بواسطة TCP_CORK؛ ومع ذلك، فإن ضبط هذا الخيار يفرض تفريغاً صريحاً للمخرجات المعلقة، حتى لو كان TCP_CORK مضبوطاً حالياً.

TCP_QUICKACK (منذ لينكس 2.4.4)
    يفعّل وضع الإشعار السريع (quickack) إذا عُيّن، أو يعطله إذا مُسح. في وضع الإشعار السريع، تُرسل الإشعارات (acks) فورًا، بدلاً من تأخيرها إذا لزم الأمر وفقًا لعمل TCP العادي. هذا العلم ليس دائمًا، فهو يفعّل فقط التبديل إلى أو من وضع الإشعار السريع. ستدخل/تخرج العمليات اللاحقة لبروتوكول TCP مرة أخرى من وضع الإشعار السريع اعتمادًا على معالجة البروتوكول الداخلية وعوامل مثل حدوث مهلات الإشعار المتأخر ونقل البيانات. لا ينبغي استخدام هذا الخيار في الأكواد البرمجية التي يُقصد أن تكون محمولة.

TCP_SYNCNT (منذ لينكس 2.4)
    اضبط عدد عمليات إعادة إرسال SYN التي يجب أن يرسلها TCP قبل إلغاء محاولة الاتصال. لا يمكن أن تتجاوز 255. لا ينبغي استخدام هذا الخيار في الأكواد البرمجية التي يُقصد أن تكون محمولة.

TCP_SAVE_SYN (منذ لينكس 4.3)
    يحفظ محتويات حزمة SYN الواردة لمقبس الاستماع حتى تُقرأ باستخدام TCP_SAVED_SYN مرة واحدة. يمكن ضبطه قبل أو بعد استدعاء listen(2).

TCP_SAVED_SYN (منذ لينكس 4.3)
    يقرأ محتويات حزمة SYN المحفوظة بواسطة TCP_SAVE_SYN. تُحرر ترويسات SYN المحفوظة بعد الاستدعاء الأول. البيانات المعادة في TCP_SAVED_SYN هي ترويسات الشبكة (IPv4/IPv6) وترويسات TCP.

TCP_USER_TIMEOUT (منذ لينكس 2.6.37)
    يأخذ هذا الخيار unsigned int كمعامل. عندما تكون القيمة أكبر من 0، فإنها تحدد أقصى قدر من الوقت بالمللي ثانية الذي قد تظل فيه البيانات المرسلة بدون إشعار استلام، أو قد تظل البيانات المدرءة بدون إرسال (بسبب حجم نافذة صفر) قبل أن يقوم TCP بإغلاق الاتصال المقابل قسريًا ويعيد ETIMEDOUT إلى التطبيق. إذا حُددت قيمة الخيار على أنها 0، فسيستخدم TCP المبدئي للنظام.

    تسمح زيادة مهلات المستخدم لاتصال TCP بالبقاء لفترات ممتدة بدون اتصال من طرف إلى طرف. بينما يسمح تقليل مهلات المستخدم للتطبيقات بـ "الفشل السريع"، إذا رغبت في ذلك. خلاف ذلك، قد يستغرق الفشل ما يصل إلى 20 دقيقة مع مبادئ النظام الحالية في بيئة WAN عادية.

    يمكن ضبط هذا الخيار خلال أي حالة من حالات اتصال TCP، ولكنه يكون فعّالاً فقط خلال الحالات المتزامنة للاتصال (ESTABLISHED، و FIN-WAIT-1، و FIN-WAIT-2، و CLOSE-WAIT، و CLOSING، و LAST-ACK). علاوة على ذلك، عند استخدامه مع خيار إبقاء اتصال TCP حيًا (SO_KEEPALIVE)، فإن TCP_USER_TIMEOUT سيتجاوز إبقاء الاتصال حيًا لتحديد وقت إغلاق الاتصال بسبب فشل إبقاء الاتصال حيًا.

    ليس للخيار أي تأثير على وقت إعادة إرسال TCP للحزمة، ولا على وقت إرسال مجس إبقاء الاتصال حيًا.

    هذا الخيار، مثله مثل خيارات كثيرة أخرى، سيرثه المقبس المعاد بواسطة accept(2)، إذا عُيّن على مقبس الاستماع.

    يمكن العثور على مزيد من التفاصيل حول ميزة مهلة المستخدم في RFC 793 و RFC 5482 ("خيار مهلة مستخدم TCP").

TCP_WINDOW_CLAMP (منذ لينكس 2.4)
    قيد حجم النافذة المعلنة بهذه القيمة. تفرض النواة حداً أدنى للحجم قدره SOCK_MIN_RCVBUF/2. ينبغي عدم استخدام هذا الخيار في الكود البرمجي الذي يُراد له أن يكون محمولاً.

TCP_FASTOPEN (منذ لينكس 3.6)
    يفعّل هذا الخيار الفتح السريع (RFC 7413) على مقبس المستمع. تحدد القيمة أقصى طول لرسائل SYN المعلقة (على غرار معامل backlog في listen(2)). بمجرد تفعيله، يمنح مقبس المستمع كعكة TCP Fast Open عند وصول رسالة SYN تحتوي على خيار TCP Fast Open.

    والأهم من ذلك أنه يقبل البيانات في رسالة SYN مع كعكة Fast Open صالحة ويستجيب بـ SYN-ACK مقراً باستلام كل من البيانات وتسلسل SYN. يعيد accept(2) مقبساً متاحاً للقراءة والكتابة عندما لا تكون المصافحة قد اكتملت بعد. وبالتالي يمكن أن يبدأ تبادل البيانات قبل اكتمال المصافحة. يتطلب هذا الخيار تفعيل دعم جانب الخادم في sysctl net.ipv4.tcp_fastopen (انظر أعلاه). لدعم جانب العميل في TCP Fast Open، انظر send(2) MSG_FASTOPEN أو TCP_FASTOPEN_CONNECT أدناه.

TCP_FASTOPEN_CONNECT (منذ لينكس 4.11)
    يفعّل هذا الخيار طريقة بديلة لإجراء الفتح السريع على الجانب النشط (العميل). عند تفعيل هذا الخيار، سيتصرف connect(2) بشكل مختلف اعتمادًا على ما إذا كانت كعكة Fast Open متاحة للوجهة.

    إذا لم تكن الخبيئة متوفرة (أي أول متراسل مع الوجهة)، فإن connect(2) يتصرف كالمعتاد عبر إرسال SYN فورًا، إلا أن SYN سيشمل خيار خبيئة Fast Open فارغ لطلب خبيئة.

    إذا كانت الخبيئة متوفرة، فإن connect(2) سيُعيد 0 فورًا لكن يُرجأ إرسال SYN. يؤدي استدعاء write(2) أو sendmsg(2) لاحق إلى إطلاق SYN مع البيانات بالإضافة إلى الخبيئة في خيار Fast Open. بمعنى آخر، تُرجأ عملية الاتصال الفعلية حتى توفر البيانات.

    ملاحظة: صُمم هذا الخيار للتيسير، إلا أن تفعيله يغير السلوكيات وقد تُعين بعض استدعاءات النظام قيم errno مختلفة. مع وجود الخبيئة، يجب استدعاء write(2) أو sendmsg(2) مباشرة بعد connect(2) من أجل إرسال SYN+البيانات لإكمال المصافحة الثلاثية (3WHS) وإنشاء الاتصال. سيؤدي استدعاء read(2) مباشرة بعد connect(2) دون write(2) إلى حظر المقبس الحاظر للأبد.

    ينبغي للتطبيق إما ضبط خيار المقبس TCP_FASTOPEN_CONNECT قبل write(2) أو sendmsg(2)، أو استدعاء write(2) أو sendmsg(2) مع وسم MSG_FASTOPEN مباشرة، بدلًا من كليهما في نفس الاتصال.

    هذا هو تسلسل الاستدعاء النمطي مع هذا الخيار الجديد:

        s = socket();
        setsockopt(s, IPPROTO_TCP, TCP_FASTOPEN_CONNECT, 1, ...);
        connect(s);
        write(s);  /* ينبغي دائما استدعاء write() بعد connect()
                    * من أجل إطلاق SYN للخارج.  */
        read(s)/write(s);
        /* ... */
        close(s);

  واجهة برمجة تطبيقات المقابس (Sockets API)
يوفر TCP دعمًا محدودًا للبيانات الخارجة عن النطاق، في شكل (بايت واحد من) البيانات العاجلة. في لينكس، يعني هذا أنه إذا أرسل الطرف الآخر بيانات خارجة عن النطاق أحدث، فتُدرج البيانات العاجلة القديمة كبيانات عادية في التدفق (حتى عند عدم ضبط SO_OOBINLINE). يختلف هذا عن كدسات البروتوكولات المبنية على BSD.

يستخدم لينكس التفسير المتوافق مع BSD لحقل المؤشر العاجل مبدئيًا. ينتهك هذا RFC 1122، ولكنه مطلوب للتشغيل البيني مع الكدسات الأخرى. يمكن تغييره عبر /proc/sys/net/ipv4/tcp_stdurg.

من الممكن استراق النظر للبيانات الخارجة عن النطاق باستخدام وسم MSG_PEEK للاستدعاء recv(2).

منذ لينكس 2.4، يدعم لينكس استخدام MSG_TRUNC في معامل flags الخاص بالاستدعاء recv(2) (و recvmsg(2)). يؤدي هذا الوسم إلى نبذ بايتات البيانات المستلمة، بدلًا من تمريرها مرة أخرى في خبيئة يوفرها المستدعِي. منذ لينكس 2.4.4، أصبح لـ MSG_TRUNC هذا التأثير أيضًا عند استخدامه بالتزامن مع MSG_OOB لاستلام البيانات الخارجة عن النطاق.

  Ioctls
استدعاءات ioctl(2) التالية تعيد معلومات في value. الصيغة الصحيحة هي:

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

تكون ioctl_type واحدة مما يلي:

SIOCINQ
    يعيد كمية البيانات غير المقروءة والمصطفة في خبيئة الاستلام. يجب ألا يكون المقبس في حالة LISTEN، وإلا سيُعاد خطأ (EINVAL). عُرف SIOCINQ في <linux/sockios.h>. بدلاً من ذلك، يمكنك استخدام المرادف FIONREAD، المعرف في <sys/ioctl.h>.

SIOCATMARK
    يعيد صحيح (أي أن value غير صفرية) إذا كان تدفق البيانات الوارد عند علامة الاستعجال.

    إذا ضُبط خيار المقبس SO_OOBINLINE وأعاد SIOCATMARK صحيحًا، فإن القراءة التالية من المقبس ستعيد البيانات العاجلة. إذا لم يُضبط خيار المقبس SO_OOBINLINE وأعاد SIOCATMARK صحيحًا، فإن القراءة التالية من المقبس ستعيد البايتات التي تلي البيانات العاجلة (تتطلب قراءة البيانات العاجلة فعليًا وسم recv(MSG_OOB)).

    لاحظ أن القراءة لا تقرأ أبدًا عبر علامة الاستعجال. إذا أُخطر التطبيق بوجود بيانات عاجلة عبر select(2) (باستخدام المعامل exceptfds) أو عبر تسليم إشارة SIGURG، فيمكنه التقدم حتى العلامة باستخدام حلقة تكرارية تختبر SIOCATMARK وتجري قراءة (بطلب أي عدد من البايتات) طالما أعاد SIOCATMARK خطأ.

SIOCOUTQ
    يعيد كمية البيانات غير المرسلة في صف إرسال المقبس. يجب ألا يكون المقبس في حالة LISTEN، وإلا سيُعاد خطأ (EINVAL). عُرف SIOCOUTQ في <linux/sockios.h>. بدلاً من ذلك، يمكنك استخدام المرادف TIOCOUTQ، المعرف في <sys/ioctl.h>.

  معالجة الأخطاء
عند حدوث خطأ في الشبكة، يحاول TCP إعادة إرسال الحزمة. إذا لم ينجح بعد مرور بعض الوقت، يُبلغ عن ETIMEDOUT أو آخر خطأ مُستلم في هذا الاتصال.

تتطلب بعض التطبيقات إشعارًا أسرع بالخطأ. يمكن تفعيل ذلك باستخدام خيار المقبس IP_RECVERR على مستوى IPPROTO_IP. عند تفعيل هذا الخيار، تُمرر جميع الأخطاء الواردة فورًا إلى برنامج المستخدم. استخدم هذا الخيار بحذر — فهو يجعل TCP أقل تسامحًا مع تغيرات التوجيه وظروف الشبكة العادية الأخرى.

الأخطاء

EAFNOTSUPPORT
    نوع عنوان المقبس الممرر في sin_family لم يكن AF_INET.

EPIPE
    أغلق الطرف الآخر المقبس بشكل غير متوقع أو نُفذت قراءة على مقبس مغلق.

ETIMEDOUT
    لم يقر الطرف الآخر باستلام البيانات المعاد إرسالها بعد مرور بعض الوقت.

أي أخطاء عُرفت لـ ip(7) أو لطبقة المقابس العامة قد تُعاد أيضًا لـ TCP.

الإصدارات
أُدخل دعم إشعار الازدحام الصريح (ECN)، و sendfile(2) بدون نسخ، ودعم إعادة الترتيب، وبعض امتدادات SACK مثل (DSACK) في لينكس 2.4. كما أُدخل دعم الإقرار الأمامي (FACK)، وإعادة تدوير TIME_WAIT، وخيارات مقابس keepalive لكل اتصال في لينكس 2.3.

العلل
ليست كل الأخطاء موثقة.

لم يوصَف IPv6.

انظر أيضًا
accept(2), bind(2), connect(2), getsockopt(2), listen(2), recvmsg(2), sendfile(2), sendmsg(2), socket(2), ip(7), socket(7)

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

RFC 793 لمواصفات TCP.
RFC 1122 لمتطلبات TCP ووصف خوارزمية ناغل (Nagle).
RFC 1323 لخيارات الطابع الزمني لـ TCP وحجم النافذة.
RFC 1337 لوصف مخاطر إنهاء (assassination) حالة TIME_WAIT.
RFC 3168 لوصف إشعار الازدحام الصريح.
RFC 2581 لخوارزميات التحكم في ازدحام TCP.
RFC 2018 و RFC 2883 لـ SACK وامتداداته.

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

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

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