Skip to content

نظرة عامة على البروتوكولات

يدعم sing-box أكثر من 20 بروتوكول وكيل (proxy)، وجميعها تتبع نمط محول (adapter) موحد. تطبيقات البروتوكولات هي أغلفة خفيفة تفوض معالجة تنسيق البيانات الفعلي إلى مكتبات sing-*.

المصدر: protocol/، include/

نمط التسجيل

يسجل كل بروتوكول نفسه عبر نظام التضمين (include):

go
// include/inbound.go
func InboundRegistry() *inbound.Registry {
    registry := inbound.NewRegistry()
    tun.RegisterInbound(registry)
    vless.RegisterInbound(registry)
    vmess.RegisterInbound(registry)
    trojan.RegisterInbound(registry)
    // ...
    return registry
}

يوفر كل بروتوكول دالة تسجيل:

go
// protocol/vless/inbound.go
func RegisterInbound(registry adapter.InboundRegistry) {
    inbound.Register[option.VLESSInboundOptions](registry, C.TypeVLESS, NewInbound)
}

تربط الدالة العامة Register بين: (نوع string، نوع الخيارات) ← دالة المصنع.

نمط الوارد (Inbound)

تتبع جميع الواردات هذا الهيكل:

go
type Inbound struct {
    myInboundAdapter  // محول مضمن يحتوي على Tag()، Type()
    ctx      context.Context
    router   adapter.ConnectionRouterEx
    logger   log.ContextLogger
    listener *listener.Listener    // مستمع TCP
    service  *someprotocol.Service // خدمة البروتوكول
}

func NewInbound(ctx, router, logger, tag string, options) (adapter.Inbound, error) {
    // 1. إنشاء خدمة البروتوكول (من مكتبة sing-*)
    // 2. إنشاء المستمع
    // 3. ربط الخدمة → الموجه لمعالجة الاتصالات
}

func (h *Inbound) Start(stage adapter.StartStage) error {
    // بدء المستمع
}

func (h *Inbound) Close() error {
    // إغلاق المستمع + الخدمة
}

// يُستدعى بواسطة المستمع لكل اتصال جديد
func (h *Inbound) NewConnectionEx(ctx, conn, metadata, onClose) {
    // فك تشفير خاص بالبروتوكول يحدث هنا
    // ثم: h.router.RouteConnectionEx(ctx, conn, metadata, onClose)
}

نمط الصادر (Outbound)

تُنفذ جميع الصادرات واجهة N.Dialer:

go
type Outbound struct {
    myOutboundAdapter  // محول مضمن يحتوي على Tag()، Type()، Network()
    ctx       context.Context
    dialer    N.Dialer           // المتصل الأساسي (قد يكون تحويلة)
    transport *v2ray.Transport   // نقل V2Ray اختياري
    // خيارات خاصة بالبروتوكول
}

func NewOutbound(ctx, router, logger, tag string, options) (adapter.Outbound, error) {
    // 1. إنشاء المتصل الأساسي (افتراضي أو تحويلة)
    // 2. إنشاء نقل V2Ray إذا تم تكوينه
    // 3. تكوين خيارات البروتوكول
}

func (h *Outbound) DialContext(ctx, network, destination) (net.Conn, error) {
    // 1. الاتصال بالنقل
    // 2. تنفيذ مصافحة البروتوكول
    // 3. إرجاع الاتصال المغلف
}

func (h *Outbound) ListenPacket(ctx, destination) (net.PacketConn, error) {
    // للبروتوكولات التي تدعم UDP
}

فئات البروتوكولات

بروتوكولات الوكيل (عميل/خادم)

البروتوكولواردصادرالمكتبة
VLESSنعمنعمsing-vmess
VMessنعمنعمsing-vmess
Trojanنعمنعمtransport/trojan (مدمج)
Shadowsocksنعمنعمsing-shadowsocks / sing-shadowsocks2
ShadowTLSنعمنعمsing-shadowtls
Hysteria2نعمنعمsing-quic
TUICنعمنعمsing-quic
AnyTLSنعمنعمsing-anytls
NaiveProxyنعمنعممدمج
WireGuardنقطة نهايةنقطة نهايةwireguard-go
Tailscaleنقطة نهايةنقطة نهايةtailscale

بروتوكولات الوكيل المحلية

البروتوكولواردصادر
SOCKS4/5نعمنعم
HTTPنعمنعم
Mixed (SOCKS+HTTP)نعم-
Redirectنعم-
TProxyنعم-
TUNنعم-

بروتوكولات الأدوات المساعدة

البروتوكولالغرض
Directاتصال صادر مباشر
Blockإسقاط جميع الاتصالات
DNSالتوجيه إلى موجه DNS
Selectorاختيار يدوي للصادر
URLTestاختيار تلقائي بناءً على زمن الاستجابة
SSHنفق SSH
Torشبكة Tor

تكامل نقل V2Ray

تدعم العديد من البروتوكولات وسائل نقل متوافقة مع V2Ray:

go
// إنشاء النقل من الخيارات
transport, err := v2ray.NewServerTransport(ctx, logger, common.PtrValueOrDefault(options.Transport), tlsConfig, handler)

// أو من جانب العميل
transport, err := v2ray.NewClientTransport(ctx, dialer, serverAddr, common.PtrValueOrDefault(options.Transport), tlsConfig)

وسائل النقل المدعومة: WebSocket، gRPC، HTTP/2، HTTPUpgrade، QUIC.

تكامل تعدد الإرسال (Multiplex)

يمكن للصادرات التغليف بتعدد الإرسال:

go
if options.Multiplex != nil && options.Multiplex.Enabled {
    outbound.multiplexDialer, err = mux.NewClientWithOptions(ctx, outbound, muxOptions)
}

سلسلة المعالجة

مستمع الوارد → فك تشفير البروتوكول → الموجه → مطابقة القاعدة → اختيار الصادر
    ↓                                                          ↓
قبول TCP/UDP                                          تشفير البروتوكول
    ↓                                                          ↓
خدمة البروتوكول                                        اتصال النقل
    ↓                                                          ↓
استخراج الوجهة                                     الاتصال البعيد
    ↓                                                          ↓
التوجيه إلى الصادر ─────────────────────────────→ ConnectionManager.Copy

الاختلافات الرئيسية عن Xray-core

الجانبXray-coresing-box
تنسيق البياناتتشفير مدمجمكتبة sing-*
نموذج الواردproxy.Inbound.Process() يُرجع Linkadapter.Inbound ← استدعاء الموجه
نموذج الصادرproxy.Outbound.Process() مع Linkواجهة N.Dialer (DialContext/ListenPacket)
تدفق البياناتPipe Reader/Writernet.Conn/PacketConn مباشر
Muxmux مدمج + XUDPمكتبة sing-mux
Vision/XTLSمدمج في proxy.goغير مدعوم (نهج مختلف)