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غير مدعوم (نهج مختلف)