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

UdpConnector

UdpConnector نود خروجی UDP است. این نود یک UDP socket محلی می‌سازد، مقصد را انتخاب می‌کند و datagramها را بین نود قبلی و remote peer جابه‌جا می‌کند.

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

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

{
"name": "udp-out",
"type": "UdpConnector",
"settings": {
"address": "example.com",
"port": "random(40000,40100)",
"reuseaddr": true,
"fwmark": 10,
"interface": "eth0",
"source-ip": "192.0.2.10"
}
}

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

{
"name": "udp-out",
"type": "UdpConnector",
"settings": {
"addresses": [
{
"address": "1.1.1.1",
"port": 53,
"weight": 3
},
{
"address": "8.8.8.8",
"port": "random(40000,40100)",
"weight": 1
}
],
"reuseaddr": true
}
}

تنظیم مقصد

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

  • address + port
  • addresses

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

  • IPv4 ثابت
  • IPv6 ثابت
  • domain ثابت
  • src_context->address
  • dest_context->address

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

  • عدد ثابت، مثل 53
  • string عددی، مثل "53"
  • src_context->port
  • dest_context->port
  • random(x,y)

random(x,y) در زمان init هر line یک پورت تصادفی در بازه inclusive [x, y] انتخاب می‌کند و همان line تا پایان عمرش همان پورت را نگه می‌دارد.

addresses

addresses آرایه‌ای از مقصدهای weighted است. هر entry باید address، port و weight داشته باشد. مقصد هر line با احتمال متناسب با weight انتخاب می‌شود.

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

تنظیمات socket

گزینهتوضیح
reuseaddrفعال‌سازی SO_REUSEADDR
fwmarksocket mark با SO_MARK در platformهای پشتیبانی‌شده
interfaceمحدود کردن socket به interface محلی
source-ipbind کردن UDP socket به source IP مشخص با port موقت

رفتار UDP

UDP handshake ندارد. در پیاده‌سازی فعلی:

  • upstream Init socket را می‌سازد و peer مقصد را محاسبه می‌کند.
  • payload upstream بلافاصله قابل ارسال است.
  • downstream Est فقط وقتی فرستاده می‌شود که اولین datagram از remote peer دریافت شود.
  • datagramهایی که از peer غیرمنتظره برسند drop می‌شوند.
  • اگر read pause باشد، datagram دریافتی buffer نمی‌شود و drop می‌شود.

timeout

هر UDP line در جدول idle نگه داشته می‌شود:

  • حدود 30s بعد از initialization
  • حدود 300s بعد از ادامه traffic

بعد از expire شدن، socket بسته می‌شود و downstream Finish به نود قبلی می‌رود.

نکته‌ها

  • DNS resolution synchronous است.
  • fwmark و device binding platform-dependent هستند.
  • اگر به UDP stateless با routing context نیاز دارید، UdpStatelessSocket را بررسی کنید.