تمرير إغلاق TCP النصفي بعد تصريف البايتات المعلّقة
تعامل مع EOF في وسيط TCP دون إسقاط البيانات المصطفّة أو قطع الرد في الاتجاه الآخر.
ينتهي العميل من الإرسال، ويرى الوسيط EOF، فيختفي الرد. إن إغلاق مقبسي الوسيط فورًا قد يسبّب هذا التسلسل بالضبط. في مرحّل TCP، لا يعني الانتهاء المنظّم في اتجاه واحد أن الاتجاه الآخر قد انتهى.
تخيّل عميلًا يرسل طلبًا ثم يغلق جهة الإرسال لديه وينتظر الجواب:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
لدى الوسيط اتصالا TCP وتدفقان من البايتات يتحركان باستقلال. عليه أن يحمل إشارة نهاية الدخل إلى الأمام، بعد حمل البايتات التي تسبقها.
صرّف الطابور قبل تمرير EOF
في استقبال بحجم غير صفري على تدفق TCP، يعني إرجاع الصفر انتهاءً منظّمًا لذلك التدفق الوارد. علّم اتجاه القراءة هذا كمنتهٍ. توقّف عن انتظار مزيد من الدخل منه، لكن احتفظ بالبايتات المصطفّة بالفعل للمقبس المقابل.
بعد تصريف طابور العميل-إلى-الخدمة، نادِ shutdown(service_socket, SHUT_WR) على مقبس POSIX. ينهي ذلك أي إرسال لاحق نحو الخدمة مع إبقاء اتجاه الخدمة-إلى-العميل متاحًا. وعندما تنتهي الخدمة من ردها، طبّق العملية المعاكسة بعد تصريف طابور الرد.
إغلاق الواصفات يكون عند النقطة التي ينتهي فيها الاتجاهان ومخزناهما المؤقتان المعلّقان، أو حيث يتطلب خطأ أو إلغاء إنهاءً. احتفظ بمهلة محدودة لنظير لا يكمل نصفه المتبقي أبدًا.
الجاهزية دعوة للقراءة
قد يحتوي المقبس القابل للقراءة على بيانات أو على حالة EOF. نادِ recv وفسّر نتيجتها. الأعداد الموجبة بايتات تُمرَّر؛ والصفر هو نهاية الاتجاه. على مقبس غير حاجز، تعني EAGAIN أو EWOULDBLOCK أنه لا يوجد مزيد من الدخل حاليًا، بينما قد تتطلب EINTR إعادة المحاولة. لا شيء منهما هو الحدث نفسه الذي يمثله EOF.
لا تبحث في مخزن البايتات المُعاد عن راية FIN. يسلّم TCP تدفق بايتات مرتبًا إلى هذه الواجهة؛ وحدود الحزم ومقطع FIN ليسا حمولة تطبيق عادية.
هذه دورة حياة نفق بايتات خام. وسيط HTTP الذي يحلّل الرسائل عليه مع ذلك احترام تأطير HTTP، ووسيط إنهاء TLS لديه أيضًا بروتوكول إغلاق TLS. أبقِ قرارات البروتوكول هذه فوق مرحّل TCP الاتجاهي.