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

بعد إنشاء نفق TCP، لا يحدد SOCKS الرسائل داخله. قد ترسل الوجهة أولًا. وقد يرسل الجانبان بشكل مستقل. وقد يرسل أحد الجانبين سجلًا قصيرًا ثم ينتظر جواب الآخر.

مرّر البايتات، لا معاملات مفترضة

يعيد نداء الاستقبال البايتات المتاحة وفقًا لأعلامه وحالة المقبس. وهو لا يخبر مرحّلًا عامًا أن استجابة التطبيق اكتملت. والانتظار حتى يمتلئ مخزن كبير اعتباطي قد يمنع تمرير الرسالة الصغيرة التي يحتاجها النظير للمتابعة.

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

احتفظ بمخزنين مؤقتين محدودين

قد تكون البيانات المقروءة من العميل لا تزال في انتظار الوصول إلى الوجهة، بينما تنتظر بيانات الوجهة الوصول إلى العميل. تتبّع هذه البايتات المعلّقة كلًا على حدة.

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

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

الانتهاء في اتجاه واحد يحتاج إلى سياسة

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

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

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