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

TcpConnector

TcpConnector نود خروجی TCP است. این نود در upstream Init مقصد را از تنظیمات خودش یا از routing context خط انتخاب می‌کند، socket TCP می‌سازد، به مقصد connect می‌کند و payload را بین نود قبلی و remote server جابه‌جا می‌کند.

این نود معمولا انتهای زنجیر است.

نمونه تنظیم ساده

{
"name": "outbound-tcp",
"type": "TcpConnector",
"settings": {
"address": "example.com",
"port": 443,
"nodelay": true,
"fastopen": false,
"reuseaddr": false,
"fwmark": 10,
"interface": "eth0",
"source-ip": "192.0.2.10",
"domain-strategy": 0
}
}

نمونه چند مقصد weighted

{
"name": "outbound-tcp",
"type": "TcpConnector",
"settings": {
"addresses": [
{
"address": "192.0.2.10",
"port": 443,
"weight": 5
},
{
"address": "198.51.100.20",
"port": "dest_context->port",
"weight": 1
}
],
"nodelay": true
}
}

تنظیم مقصد

باید دقیقا یکی از این دو سبک را انتخاب کنید:

  • address + port
  • addresses

این دو سبک را با هم ترکیب نکنید.

گزینهتوضیح
addressمقصد ثابت یا context-based
portپورت ثابت یا context-based
addressesآرایه مقصدهای weighted

مقدارهای معتبر برای address:

  • IPv4 ثابت، مثل 93.184.216.34
  • IPv6 ثابت
  • domain ثابت، مثل example.com
  • src_context->address
  • dest_context->address

مقدارهای معتبر برای port:

  • عدد ثابت، مثل 443
  • src_context->port
  • dest_context->port
هشدار

در نسخه فعلی TcpConnector، فرم random(x,y) برای port در توضیحات سورس پشتیبانی نشده است. اگر پورت تصادفی می‌خواهید، این قابلیت در UdpConnector وجود دارد، نه در مسیر فعلی TcpConnector.

addresses

addresses آرایه‌ای از مقصدهاست. هر entry باید این فیلدها را داشته باشد:

فیلدتوضیح
addressهمان فرم‌های معتبر address
portهمان فرم‌های معتبر port
weightعدد مثبت؛ احتمال انتخاب مقصد متناسب با وزن

alias قدیمی adresses هم توسط parser پذیرفته می‌شود، اما spelling درست و پیشنهادی addresses است.

تنظیمات socket

گزینهپیش‌فرضتوضیح
nodelaytrueفعال‌سازی TCP_NODELAY
fastopenfalseدرخواست TCP_FASTOPEN اگر platform پشتیبانی کند
reuseaddrfalseفعال‌سازی SO_REUSEADDR
fwmark-socket mark در Linux با SO_MARK
interface-bind به interface؛ در Linux با SO_BINDTODEVICE
source-ip-bind کردن socket به source IP مشخص با source port موقت
domain-strategy0parse و ذخیره می‌شود، اما مسیر connect فعلی از آن در DNS resolution استفاده عملی نمی‌کند

CIDR روی IP ثابت

اگر address یک IP ثابت همراه CIDR باشد، TcpConnector host part را random می‌کند:

"address": "198.51.100.0/24"

این فقط برای IP ثابت است، نه domain و نه context lookup. IPv4 prefixهای بزرگ‌تر از /32 و IPv6 prefixهای broadتر از /64 رد می‌شوند.

رفتار lifecycle

  • upstream Init مقصد را انتخاب می‌کند و connect async را شروع می‌کند.
  • اگر connect موفق شود، downstream Est به نود قبلی ارسال می‌شود.
  • payload upstream روی TCP socket نوشته می‌شود.
  • داده دریافتی از remote به صورت downstream payload به نود قبلی برمی‌گردد.
  • اگر DNS resolution یا connect شکست بخورد، line finish می‌شود.

نکته‌ها

  • DNS resolution در این مسیر synchronous است.
  • fwmark و bind به interface platform-dependent هستند.
  • این نود chain end است و خودش next لازم ندارد.