جریان دوطرفه کامل و فشار معکوس در رله SOCKS
جریان رله را بر پایه جریانهای بایت مستقل، ورودی/خروجی جزئی، بافرهای محدود و فشار معکوس طراحی کنید، نه بر پایه اندازههای حدسی پاسخ.
دستدادن SOCKS موفق شد. اکنون رله از کلاینت میخواند، به مقصد مینویسد، منتظر پاسخ کامل میماند و تنها پس از آن دوباره از کلاینت میخواند. این توالی میتواند یک برنامه کاملاً معتبر را به بنبست ببرد.
پس از برقراری تونل TCP، SOCKS پیامهای داخل آن را تعریف نمیکند. ممکن است مقصد ابتدا بفرستد. هر دو طرف میتوانند مستقل بفرستند. یک طرف میتواند رکورد کوتاهی بفرستد و سپس منتظر پاسخ طرف دیگر بماند.
بایتها را منتقل کنید، نه تراکنشهای حدسی
یک فراخوان دریافت، بایتهای موجود را بر اساس پرچمها و وضعیت سوکت برمیگرداند. این فراخوان به یک رله عمومی نمیگوید که پاسخ برنامه کامل شده است. انتظار برای پر شدن یک بافر بزرگ دلبخواه میتواند مانع ارسال پیام کوچکی شود که همتا برای ادامه به آن نیاز دارد.
برای سرویسدهی به هر دو جهت از مدل همروندی موجود برنامه استفاده کنید: حلقه رویداد، ورودی/خروجی ناهمگام یا طرح دیگری که آگاهانه انتخاب شده است. رفتار مهم این است که پیشرفت در یک جهت مستلزم مرز پیام ساختگی در جهت دیگر نباشد.
دو بافر در انتظار محدود نگه دارید
دادههای خواندهشده از کلاینت ممکن است هنوز در انتظار رسیدن به مقصد باشند، در حالی که دادههای مقصد در انتظار رسیدن به کلاینتاند. این بایتهای در انتظار را جداگانه پیگیری کنید.
یک ارسال ممکن است کمتر از مقدار درخواستی بایت بنویسد. بخش نوشتهنشده را نگه دارید؛ آن را دور نریزید و کل بافر را دوباره پخش نکنید. سوکتی که موقتاً قابل نوشتن نیست دلیلی برای انتظار رویداد آمادگی درست است، نه چرخش مداوم.
بافرها را محدود کنید. اگر مقصد کند باشد، ادامه خواندن داده نامحدود کلاینت فقط صف را به حافظه رله منتقل میکند. فشار معکوس یعنی متوقف کردن خواندن وقتی بافر در انتظار مربوطه پر است و ازسرگیری وقتی نوشتن جا باز میکند.
پایان در یک جهت به یک سیاست نیاز دارد
TCP میتواند جهت ارسال را ببندد در حالی که جهت دیگر هنوز داده مفیدی دارد. تصمیم بگیرید که این وضعیت پس از تخلیه بایتهای بافرشده چگونه منتقل شود، و بستن منظم را از خطا یا مهلت تشخیص دهید.
هیچیک از اینها از رله نمیخواهد که بار برنامه را رمزگشایی یا تجزیه کند. به مدیریت درست جریان نیاز دارد. افزایش تنها اندازه بافر نمیتواند رلهای را تعمیر کند که منتظر طرف اشتباه است یا فرض میکند هر خواندن با یک درخواست کامل مطابقت دارد.