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+portaddresses
این دو سبک را با هم ترکیب نکنید.
| گزینه | توضیح |
|---|---|
address | مقصد ثابت یا context-based |
port | پورت ثابت یا context-based |
addresses | آرایه مقصدهای weighted |
مقدارهای معتبر برای address:
- IPv4 ثابت، مثل
93.184.216.34 - IPv6 ثابت
- domain ثابت، مثل
example.com src_context->addressdest_context->address
مقدارهای معتبر برای port:
- عدد ثابت، مثل
443 src_context->portdest_context->port
در نسخه فعلی TcpConnector، فرم random(x,y) برای port در توضیحات سورس پشتیبانی نشده است. اگر پورت تصادفی میخواهید، این قابلیت در UdpConnector وجود دارد، نه در مسیر فعلی TcpConnector.
addresses
addresses آرایهای از مقصدهاست. هر entry باید این فیلدها را داشته باشد:
| فیلد | توضیح |
|---|---|
address | همان فرمهای معتبر address |
port | همان فرمهای معتبر port |
weight | عدد مثبت؛ احتمال انتخاب مقصد متناسب با وزن |
alias قدیمی adresses هم توسط parser پذیرفته میشود، اما spelling درست و پیشنهادی addresses است.
تنظیمات socket
| گزینه | پیشفرض | توضیح |
|---|---|---|
nodelay | true | فعالسازی TCP_NODELAY |
fastopen | false | درخواست TCP_FASTOPEN اگر platform پشتیبانی کند |
reuseaddr | false | فعالسازی SO_REUSEADDR |
fwmark | - | socket mark در Linux با SO_MARK |
interface | - | bind به interface؛ در Linux با SO_BINDTODEVICE |
source-ip | - | bind کردن socket به source IP مشخص با source port موقت |
domain-strategy | 0 | parse و ذخیره میشود، اما مسیر 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لازم ندارد.