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

TesterServer

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

با قرار دادن آن در انتهای chain آزمایشی می‌توانید مطمئن شوید نودهای میانی byteهای 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نام دلخواه نود.
typestringباید TesterServer باشد.

settings اختیاری است؛ اگر آن را ننویسید، نود با تنظیمات پیش‌فرض 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 دیگری رسیده باشد.

حالت 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ها.

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

جریان اجرا

با دریافت upstream Init، نود:

  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:

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

در packet mode:

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

با 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 در زمان اجرا یک bug است. packet lineها ابزارهای ماندگار هر worker هستند و نباید هنگام تست بسته یا از بین برده شوند.

مشخصات Node

ویژگیمقدار
Normal positionChain end
Packet-mode positionChain end یا participant در مسیر bridged packet
nextفقط با packet-mode=true
Normal line ownershipline سمت client را نمی‌سازد
Packet modeاز packet line هر worker استفاده می‌کند و نباید آن‌ها را از بین ببرد
Required left padding0

خطاهای رایج

  • استفاده به‌عنوان سرویس production؛ این نود 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.