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 Init | upstream Init را روی هر دو ورودی شاخه up و down صدا میزند. |
upstream Payload | payload را به شاخه up میفرستد. |
downstream Payload | payload را به tunnel قبلی برمیگرداند. |
upstream Est، Pause، Resume | No-op. |
downstream Init، Est، Pause، Resume | No-op. |
upstream یا downstream Finish | غیرمنتظره تلقی میشود و برنامه را خاتمه میدهد. |
از آنجا که Finish در runtime پشتیبانی نمیشود، این node را فقط در جریانهای packet-line به کار ببرید؛ جایی که worker packet line تا پایان عمر chain زنده میماند.
فیلدهای ضروری
فیلدهای سطح بالا:
| فیلد | نوع | توضیح |
|---|---|---|
name | string | نام دلخواه node. باید داخل فایل config یکتا باشد. |
type | string | باید دقیقاً "PacketSplitStream" باشد. |
settings | object | اجباری. شامل ورودیهای شاخه split نامدار است. |
فیلدهای اجباری settings:
| گزینه | نوع | توضیح |
|---|---|---|
up | string | نام nodeای که بهعنوان tunnel ورودی upstream برای packetهای ارسالی استفاده میشود. |
down | string | نام 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 flags | kNodeFlagChainEnd |
can_have_prev | true |
can_have_next | true |
layer_group | kNodeLayer3 |
layer_group_prev_node | kNodeLayer3 |
layer_group_next_node | kNodeLayer3 |
required_padding_left | 0 بایت |