پرش به مطلب اصلی

HalfDuplexClient

HalfDuplexClient یک line عادی full-duplex را از نود قبلی می‌گیرد و آن را به دو line خروجی جداگانه به سمت همان next تبدیل می‌کند:

  • یک line برای upload، یعنی انتقال payload از کلاینت به سرور
  • یک line برای download، یعنی انتقال payload از سرور به کلاینت

این نود باید در سمت مقابل با HalfDuplexServer استفاده شود تا آن دو اتصال دوباره به یک اتصال منطقی عادی تبدیل شوند.

جایگاه رایج

نمونه مستقیم داخل یک chain:

TesterClient -> HalfDuplexClient -> HalfDuplexServer -> TesterServer

نمونه روی TCP:

client side: TcpListener -> HalfDuplexClient -> TcpConnector
server side: TcpListener -> HalfDuplexServer -> TcpConnector

هر نود stream که میان کلاینت و سرور قرار می‌گیرد باید بایت‌های دو half-connection را بدون تغییر عبور دهد. برای مثال اگر بعد از HalfDuplexClient یک TlsClient بگذارید، هر دو اتصال upload و download handshake جداگانه TLS خواهند داشت.

عملکرد

هر اتصال ورودی به این نود باعث ساخته شدن دو اتصال خروجی می‌شود. یعنی در عمل یک اتصال منطقی اصلی و دو اتصال در سمت transport داریم. با بسته شدن هرکدام از این مسیرها، مسیرهای جفت‌شده هم بسته می‌شوند.

این نود socket باز نمی‌کند و packet line هم نمی‌سازد؛ فقط روی lineهای stream در وسط chain کار می‌کند.

نمونه تنظیم

{
"name": "halfduplex-client",
"type": "HalfDuplexClient",
"settings": {},
"next": "outbound-transport"
}

فیلدهای لازم

فیلدنوعتوضیح
namestringنام دلخواه و یکتای نود.
typestringباید دقیقاً "HalfDuplexClient" باشد.
nextstringنودی که هر دو half-connection خروجی را دریافت می‌کند.

این نود باید هم نود قبلی داشته باشد و هم next. برای ابتدا یا انتهای chain نیست.

تنظیمات

در پیاده‌سازی فعلی هیچ تنظیم اختصاصی اجباری یا اختیاری ندارد.

هر دو اتصال upload و download به همان نودی می‌روند که در next آمده است. نسخه فعلی فیلد جداگانه‌ای مثل upload-next یا download-next ندارد.

Intro برای جفت کردن اتصال‌ها

نخستین payload در مسیر upstream به‌شکل ویژه پردازش می‌شود. همراه همان payload، HalfDuplexClient یک شناسه داخلی ۸ بایتی تولید می‌کند:

Lineرفتار intro
upload lineintro هشت‌بایتی به ابتدای نخستین payload واقعی کاربر اضافه می‌شود.
download lineفقط intro هشت‌بایتی، بدون payload کاربر، ارسال می‌شود.

بعد از اولین payload:

  • همه payloadهای upstream فقط از upload line ارسال می‌شوند.
  • payloadهای downstream باید از download line برگردند.

این intro جزئیات داخلی پروتکل بین HalfDuplexClient و HalfDuplexServer است و تنظیم کاربر محسوب نمی‌شود.

رفتار جهت‌ها

جهترفتار
upstream payload از نود قبلیپس از introِ نخستین payload، روی upload line به next فرستاده می‌شود.
downstream payload از نود بعدیبه main line اصلی و نود قبلی برگردانده می‌شود.
upstream pause/resumeبه download line فرستاده می‌شود.
downstream pause/resumeاگر main line هنوز وجود داشته باشد، به آن برگردانده می‌شود.

Upload line مسیر اصلی داده از کلاینت به سرور است و download line مسیر برگشت داده از سرور به کلاینت.

Lifecycle

در upstream Init، نود state مربوط به main line را مقداردهی می‌کند و دو line جدید روی همان worker می‌سازد:

  1. upload line
  2. download line

هر دو line از طریق next مقداردهی اولیه می‌شوند.

به‌محض برقرار شدن هرکدام از half-connectionها، main line اصلی نیز به نود قبلی برقرارشده اعلام می‌شود. بنابراین نود قبلی تنها یک اتصال منطقی می‌بیند.

اگر main line اصلی Finish شود، هر دو half-connection خروجی هم بسته می‌شوند. اگر یکی از half-connectionها زودتر بسته شود، main line اصلی بسته می‌شود و بستن بستن half دیگر زمان‌بندی می‌شود.

callbackهای UpStreamEst و DownStreamInit برای این نود غیرفعال هستند.

محدودیت‌ها و Padding

مقداراندازه
intro داخلی8 bytes
required_padding_left0 bytes

این نود از chain فضای padding چپ درخواست نمی‌کند. برای نخستین payload آپلود، یک بافر جدید با فضای کافی برای intro و padding کلی chain ساخته می‌شود. intro مربوط به download نیز در یک بافر کوچک جداگانه ارسال می‌شود.

نکته‌ها

  • باید با HalfDuplexServer استفاده شود.
  • هر اتصال منطقی ورودی، دو اتصال خروجی می‌سازد.
  • intro تنها پس از رسیدن نخستین payloadِ upstream ارسال می‌شود.
  • در حال حاضر مسیرهای upload و download هر دو از همان next استفاده می‌کنند.