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

PacketSplitStream

PacketSplitStream یک split bridge است که state آن به packet-line متصل می‌شود. زمانی به کار می‌رود که یک line در سمت packet به دو ورودی شاخه با نام مشخص نیاز داشته باشد:

  • up: شاخه‌ای که payload‌های packet را در جهت upstream دریافت می‌کند
  • down: شاخه‌ای که به‌عنوان مسیر برگشت یا download مقداردهی اولیه می‌شود

این node router عمومی نیست و به‌تنهایی packet‌ها را روی stream frame نمی‌کند؛ بلکه ابزاری برای کنار هم قرار دادن branch‌ها در چیدمان‌های خاص packet/stream است.

اطلاع

PacketSplitStream با HalfDuplexClient تفاوت دارد: handshake مربوط به pairing را انجام نمی‌دهد، connection جفت‌شده را بازیابی نمی‌کند و برای packet-line یک lifecycle معمول per-connection نمی‌سازد.

جایگاه رایج​

chain اصلی به PacketSplitStream می‌رسد و نام دو شاخه split در settings مشخص می‌شود:

packet-side-node -> PacketSplitStream
settings.up -> upload-branch-head
settings.down -> download-branch-head

PacketSplitStream عمداً از فیلد next سطح بالا استفاده نمی‌کند.

نمونه تنظیم​

{
"name": "packet-split",
"type": "PacketSplitStream",
"settings": {
"up": "upload-branch-head",
"down": "download-branch-head"
}
}

node‌های ارجاع‌داده‌شده برای شاخه‌ها باید در جای دیگری از همان config WaterWall تعریف شده باشند.

مدل جریان​

رفتار پیاده‌سازی فعلی:

callback دریافت‌شده توسط PacketSplitStreamرفتار
upstream Initupstream Init را روی هر دو ورودی شاخه up و down صدا می‌زند.
upstream Payloadpayload را به شاخه up می‌فرستد.
downstream Payloadpayload را به tunnel قبلی برمی‌گرداند.
upstream Est، Pause، ResumeNo-op.
downstream Init، Est، Pause، ResumeNo-op.
upstream یا downstream Finishغیرمنتظره تلقی می‌شود و برنامه را خاتمه می‌دهد.

از آن‌جا که Finish در runtime پشتیبانی نمی‌شود، این node را فقط در جریان‌های packet-line به کار ببرید؛ جایی که worker packet line تا پایان عمر chain زنده می‌ماند.

فیلدهای ضروری​

فیلدهای سطح بالا:

فیلدنوعتوضیح
namestringنام دلخواه node. باید داخل فایل config یکتا باشد.
typestringباید دقیقاً "PacketSplitStream" باشد.
settingsobjectاجباری. شامل ورودی‌های شاخه split نام‌دار است.

فیلدهای اجباری settings:

گزینهنوعتوضیح
upstringنام node‌ای که به‌عنوان tunnel ورودی upstream برای packet‌های ارسالی استفاده می‌شود.
downstringنام node‌ای که به‌عنوان شاخه downstream/return عادی chain می‌شود.

قوانین اعتبارسنجی​

سورس فعلی این قوانین را اعمال می‌کند:

  • next سطح بالا نباید تنظیم شود
  • settings.up لازم است
  • settings.down لازم است
  • هر دو node ارجاع‌داده‌شده باید وجود داشته باشند
  • up و down باید به node‌های متفاوت اشاره کنند
  • هیچ‌کدام از شاخه‌ها نباید به node PacketSplitStream خودش اشاره کنند
  • ورودی شاخه‌ها نباید از قبل به tunnel قبلی دیگری متصل شده باشند

هنگام ساخت chain، WaterWall پس از chain شدن هر node ارجاع‌داده‌شده، ورودی واقعی شاخه را پیدا می‌کند. این موضوع برای node‌هایی مهم است که tunnel‌های داخلی را پیش از خودشان قرار می‌دهند.

این node هنگام ساخت chain، شاخهٔ down را به‌عنوان next متصل می‌کند تا packet‌های برگشتی آن شاخه را در جهت downstream دریافت کند. به همین دلیل can_have_next برابر true و layer_group_next_node برابر kNodeLayer3 تنظیم شده است.

PacketSplitStream چیزی به ابتدای payload اضافه نمی‌کند و buffer را بازنویسی یا مصرف نمی‌کند. در callback‌های payload، مالکیت buffer موجود را به مسیر callback انتخاب‌شده منتقل می‌کند.

نکات packet-line​

این node بر اساس رفتار packet-line در WaterWall طراحی شده است. worker packet line میان همه packet‌های همان worker مشترک است و با یک connection line معمولی از نوع TCP تفاوت دارد.

نتایج عملی:

  • آن را مانند node‌ای که مالک line‌های معمول per-connection است به کار نبرید.
  • از آن انتظار close یا reconnect جداگانه برای هر flow نداشته باشید.
  • آن را در مسیری قرار ندهید که باید Finish را به‌طور عادی به node مجاور منتقل کند.
  • اگر فقط می‌خواهید مرز packet‌ها را با length framing روی stream حفظ کنید، از PacketsToStream و StreamToPackets استفاده کنید.

چه وقت از آن استفاده کنید​

از PacketSplitStream زمانی استفاده کنید که pipeline سمت packet باید داده را به شاخه upload بفرستد و هم‌زمان شاخه جداگانه‌ای آماده باشد تا payload‌های downstream آن به سمت packet برگردند.

اگر به policy routing، انتخاب چندشاخه بر اساس rule یا مدیریت lifecycle معمول connection نیاز دارید، این node مناسب نیست. در این موارد از یک node router یا tunnel مرزی packet/stream متناسب با جریان مورد نظر استفاده کنید.

متادیتای node​

متادیتای برگرفته از کد منبع:

ویژگیمقدار
node flagskNodeFlagChainEnd
can_have_prevtrue
can_have_nexttrue
layer_groupkNodeLayer3
layer_group_prev_nodekNodeLayer3
layer_group_next_nodekNodeLayer3
required_padding_left0 بایت