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

TesterServer

TesterServer همتای آزمایشی TesterClient در انتهای chain است. ترتیب deterministic درخواست‌های دریافتی را بررسی می‌کند و پاسخ‌های متناظر را روی همان WaterWall line یا مسیر packet برمی‌گرداند.

با قرار دادن آن در انتهای chain آزمایشی می‌توانید مطمئن شوید node‌های میانی بایت‌های payload، ترتیب داده‌ها، شکل packet و قواعد lifecycle را حفظ کرده‌اند.

جایگاه رایج​

stream mode:

TesterClient -> SomeTunnel -> SomeTunnel -> TesterServer

تست مستقیم Ping در packet mode:

TesterClient(packet-mode=true) -> PingClient -> PingServer -> TesterServer(packet-mode=true)

TesterServer معمولاً در انتهای chain قرار می‌گیرد. در chain مستقیم Ping، پس از handshake عادی Init/Est مربوط به packet line، ‏request را در جهت upstream دریافت و response را در جهت downstream ارسال می‌کند. در packet mode می‌تواند برای topology‌های دیگری که عمداً داده را از سمت next/downstream وارد می‌کنند، next هم داشته باشد.

نمونه تنظیم​

stream mode:

{
"name": "tester-server",
"type": "TesterServer"
}

packet mode:

{
"name": "tester-server",
"type": "TesterServer",
"settings": {
"packet-mode": true
}
}

packet mode همراه با startup init:

{
"name": "tester-server",
"type": "TesterServer",
"settings": {
"packet-mode": true,
"packet-init-on-start": true,
"packet-ipv4": {
"source-ip": "198.51.100.10",
"dest-ip": "203.0.113.20",
"transport": "udp",
"ttl": 64
}
}
}

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

فیلدنوعتوضیح
namestringنام دلخواه node.
typestringباید TesterServer باشد.

settings اختیاری است؛ اگر آن را ننویسید، node با تنظیمات پیش‌فرض stream mode کار می‌کند.

next فقط وقتی مجاز است که packet-mode=true باشد.

تنظیمات​

فیلدپیش‌فرضتوضیح
packet-modefalseبه‌جای رفتار معمول line‌های stream از packet line هر worker استفاده می‌کند.
packet-init-on-startfalseفقط در packet mode؛ اگر پیش‌تر packet-side Init نرسیده باشد، هنگام راه‌اندازی state هر worker را یک بار مقداردهی می‌کند.
streaming-responsefalseفقط در stream mode؛ اجازه می‌دهد هر response chunk پس از بررسی request chunk متناظر فرستاده شود.
packet-statelessfalseفقط در packet mode؛ request packet‌ها می‌توانند خارج از ترتیب یا فقط به‌صورت یک زیرمجموعه برسند و بر اساس اندازه شناسایی می‌شوند.
chunk-count11تعداد chunk‌های فعال از ابتدای جدول. بازه معتبر 1 تا 11.
max-payload-size0حداکثر اندازه buffer پاسخ stream یا packet‌ها. مقدار 0 یعنی استفاده از اندازه معمول جدول یا buffer.
split-payload-delay-ms1فقط در stream mode؛ فاصله ارسال پاسخ‌های تکه‌شده، زمانی که max-payload-size فعال است.
split-payload-burst1فقط در stream mode؛ تعداد buffer‌هایی که پیش از اعمال split-payload-delay-ms فرستاده می‌شوند. باید مثبت باشد.
packet-ipv4نداردفقط در packet mode؛ request و response را به شکل packet‌های کامل و مصنوعی IPv4 در نظر می‌گیرد.

packet-init-on-start، packet-stateless و packet-ipv4 نیازمند packet-mode=true هستند. max-payload-size با packet-stateless=true پشتیبانی نمی‌شود.

جدول chunk‌ها​

TesterServer همان جدول‌های قطعی TesterClient را به کار می‌برد. chunk-count مشخص می‌کند چند عضو نخست جدول فعال باشند.

stream mode:

1, 2, 4, 32, 512, 1024, 4096, 32768, 32769, 1048576, 2097152

packet mode:

1, 2, 4, 32, 64, 128, 256, 512, 1024, 1499, 1500

packet mode با IPv4 خام:

21, 22, 24, 52, 84, 148, 276, 532, 1044, 1499, 1500

packet mode با IPv4 و transport header از نوع tcp، udp یا icmp:

41, 42, 44, 52, 84, 148, 276, 532, 1044, 1499, 1500

نخستین byte درخواست حاوی flow id انتخاب‌شده توسط client است. TesterServer با همان id محتوای درخواست را بررسی و الگوی پاسخ متناظر را تولید می‌کند؛ حتی اگر درخواست از worker دیگری رسیده باشد.

همه بایت‌های باقی‌مانده در chunk نخست نیز بررسی می‌شوند، از جمله payload اضافی در packet‌های UDP و ICMP. در تطبیق packet‌های stateless، checksum نامعتبر رد می‌شود و packet بین تلاش برای flow id‌های مختلف اصلاح نمی‌شود.

حالت packet IPv4​

packet-ipv4 فقط با packet-mode=true معتبر است.

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

فیلدتوضیح
source-ipآدرس IPv4 مبدأ مورد انتظار در request packet‌ها.
dest-ipآدرس IPv4 مقصد مورد انتظار در request packet‌ها.

فیلدهای اختیاری:

فیلدپیش‌فرضتوضیح
transportnoneheader اختیاری transport؛ یکی از tcp، udp، icmp، raw یا none.
protocol253شماره protocol در IPv4. برای tcp، udp یا icmp باید با transport انتخاب‌شده هماهنگ باشد.
ttl64TTL در IPv4 هنگام ساخت response packet‌ها.
worker-affine-flowfalseبرای هر worker یک request source port انتخاب می‌کند که hash جریان آن به همان worker برسد. packet ورودی نیز پیش از بررسی به worker جریان فرستاده می‌شود تا state بررسی مستقل از worker حامل باشد. فقط با transport از نوع tcp یا udp معتبر است.

در response packet‌ها source-ip و dest-ip به‌طور خودکار جابه‌جا می‌شوند. برای tcp، udp و icmp، header‌های transport با الگوی قطعی ساخته و بررسی می‌شوند. درخواست‌های TCP و UDP از source port برابر 40123 و destination port برابر 40234 استفاده می‌کنند؛ این دو در پاسخ جابه‌جا می‌شوند. با فعال بودن worker-affine-flow، request source port به‌جای آن نخستین port برابر یا بزرگ‌تر از 40123 است که inner flow آن worker فعلی را انتخاب کند؛ بنابراین هر دو node باید source-ip، ‏dest-ip، ‏transport و خود این setting را یکسان تنظیم کنند.

جریان اجرا​

با دریافت upstream Init، node:

  1. line state خود را مقداردهی اولیه می‌کند
  2. downstream Est را به tunnel قبلی می‌فرستد

این Est سیگنال شروع ارسال برای TesterClient است.

در packet mode، packet-init-on-start=true می‌تواند هنگام راه‌اندازی state مربوط به packet line هر worker را مقداردهی کند؛ این حالت زمانی لازم است که packet-side Init به‌طور طبیعی به TesterServer نمی‌رسد.

بررسی درخواست​

در stream mode:

  • بایت‌های درخواست در buffer جمع می‌شوند
  • chunk‌های کامل به‌ترتیب بررسی می‌شوند
  • هر byte اضافه پس از sequence مورد انتظار تست را ناموفق می‌کند
  • پس از بررسی کامل درخواست، سمت response آماده ارسال می‌شود

در packet mode:

  • هر request packet باید با chunk مورد انتظار یکسان باشد
  • با packet-ipv4، هر packet باید یک packet کامل و non-fragmented از نوع IPv4 با مبدأ، مقصد، protocol و transport header تنظیم‌شده باشد
  • هر request معتبر یک response قطعی را در صف می‌گذارد
  • packet line باید در تمام runtime زنده بماند

با packet-stateless=true، chunk‌ها بر اساس اندازه packet شناسایی می‌شوند و در نتیجه درخواست‌ها می‌توانند خارج از ترتیب برسند. این گزینه برای مسیرهای stateless packet مفید است که ترتیب را حفظ نمی‌کنند.

ارسال پاسخ​

در stream mode، پاسخ‌ها با tunnelPrevDownStreamPayload() در جهت downstream برمی‌گردند. اگر streaming-response=false باشد، پاسخ تا بررسی کامل sequence درخواست نگه داشته می‌شود. با مقدار true، هر chunk به‌محض بررسی request chunk متناظر قابل ارسال است.

در packet mode، جهت پاسخ به سمتی بستگی دارد که درخواست از آن رسیده است:

  • درخواست upstream پاسخی در جهت downstream می‌گیرد
  • درخواست downstream پاسخی در جهت upstream و به سمت next می‌گیرد

همین رفتار استفاده از topology‌های bridged packet را ممکن می‌کند.

upstream Pause و Resume نیز برای backpressure، ارسال پاسخ را متوقف یا دوباره برقرار می‌کنند.

Finish​

در stream mode، دریافت Finish پیش از بررسی کامل درخواست یا پیش از ارسال کامل پاسخ خطاست. پس از یک exchange موفق، upstream Finish فقط state محلی tester را از بین می‌برد.

در packet mode، دریافت Finish روی packet line در runtime یک bug است. packet line‌ها ابزارهای ماندگار هر worker هستند و نباید هنگام تست بسته یا از بین برده شوند.

خطاهای رایج​

  • استفاده به‌عنوان سرویس production؛ این node peer مخصوص آزمایش است و در صورت mismatch برنامه را متوقف می‌کند.
  • اضافه کردن next در stream mode؛ next فقط با packet-mode=true پشتیبانی می‌شود.
  • فعال کردن packet mode بدون packet-layer node در chain.
  • انتظار بسته شدن packet line در packet mode.
  • ترکیب packet-stateless=true با max-payload-size.
  • استفاده از packet-ipv4 بدون packet-mode=true.

متادیتای node​

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

ویژگیمقدار
node flagskNodeFlagChainHead | kNodeFlagChainEnd
can_have_prevtrue
can_have_nexttrue
layer_groupkNodeLayerAnything
layer_group_prev_nodekNodeLayerAnything
layer_group_next_nodekNodeLayerAnything
required_padding_left0 بایت