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

الإسقاط والرفض وإعادة الضبط أمور مختلفة

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

الحجب أيضاً ليس مثل إغلاق المقبس. لا يزال التطبيق يحمل واصفاً في حالة قائمة، والحزم فقط هي الغائبة. لهذا يمكن لصفحة أن تظل على دوّار لعدة دقائق بينما يصرّ نظام التشغيل على أن الاتصال موجود. اقرأ الإنفاذ الموثّق بدلاً من استنتاجه من رسالة التطبيق، لأن السلوكين يبدوان كأن الشبكة معطّلة.

ما يفعله التطبيق أثناء استمرار الفجوة

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

عندما يعود النفق، يبقى المقبس المحلي دون تغيير لكن المسار قد لا يبقى. عنوان مصدر عام جديد يُنتج رباعياً مختلفاً عند الخادم، فلا يعود جدار ناري يحتفظ بالحالة في الجانب البعيد يطابق الجلسة. الاتصال ميت رغم أن العميل لم يرَ أي خطأ.

قرّر ما إذا كانت الاستعادة مطلوبة

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

العنونة المستقرة هي الجزء الذي ينساه الناس، لأن إعادة اتصال تهبط على عنوان عام مختلف تُبطل حالة جهة الخادم حتى عندما يبدو مقبس العميل سليماً. اكتب أي العقدين ينطبق على كل تطبيق، لأنها نادراً ما تتطابق كلها.

اختبر الحجب والاستعادة بشكل منفصل

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

ss -tnp state established '( dport = :443 )'
sudo conntrack -L -p tcp --dport 443
sudo tcpdump -ni any 'tcp port 443 and tcp[tcpflags] & tcp-syn != 0'

استخدم عملية اختبار غير ضارة عند مراقبة الاستعادة، حتى لا تتحول إعادة إرسال مكررة إلى الحادث نفسه. سجّل نمط الفشل الذي رأيته فعلاً: ما عرضه التطبيق، وهل نجا المقبس، ومتى استعاد نفسه.

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

مقالات ذات صلة