Skip to content

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

يُنفّذ Xray-core مجموعة متنوعة من بروتوكولات الوكيل (Proxy)، يتم تسجيل كل منها عبر common.RegisterConfig() في دالة init() الخاصة به. يقوم النواة بتوجيه الاتصالات الواردة إلى معالج البروتوكول المناسب بناءً على الإعدادات، بينما تتصل المعالجات الصادرة بالخوادم العلوية أو الوجهات.

مصفوفة قدرات البروتوكولات

البروتوكولواردصادرTCPUDPالتشفيردعم Muxالمصادقة
VMessنعمنعمنعمنعمAES-128-GCM, ChaCha20-Poly1305, بدوننعم (v1.mux.cool)UUID + ترويسة AEAD
VLESSنعمنعمنعمنعمبدون (يعتمد على TLS في طبقة النقل)نعم (XUDP)UUID
Trojanنعمنعمنعمنعمبدون (يعتمد على TLS)لاSHA224(كلمة المرور)
ShadowsocksنعمنعمنعمنعمAES-128-GCM, AES-256-GCM, ChaCha20-Poly1305, XChaCha20, بدونلالكل مفتاح
Shadowsocks 2022نعمنعمنعمنعم2022-blake3-aes-128-gcm, 2022-blake3-aes-256-gcm, إلخ.لاPSK (بترميز base64)
SOCKS5نعمنعمنعمنعم (UDP Associate)بدونلااسم مستخدم/كلمة مرور
HTTPنعمنعمنعملابدون (HTTPS عبر النقل)لاBasic Auth
Dokodemo-doorنعملانعمنعمغير متاح (شفاف)لاغير متاح
Freedomلانعمنعمنعمغير متاح (مباشر)لاغير متاح
Blackholeلانعمغير متاحغير متاحغير متاحلاغير متاح
WireGuardنعمنعمنعمنعمبروتوكول Noise (Curve25519, ChaCha20-Poly1305)لامفتاح عام/خاص
Hysteria2نعمنعمنعمنعم (QUIC datagram)QUIC TLS 1.3لاكلمة مرور

البنية المعمارية

واجهة المعالج الوارد

كل بروتوكول وارد يُنفّذ واجهة proxy.Inbound:

go
type Inbound interface {
    Network() []net.Network        // Supported networks (TCP, UDP, UNIX)
    Process(ctx context.Context,
        network net.Network,
        conn stat.Connection,
        dispatcher routing.Dispatcher) error
}

المصدر الرئيسي: proxy/proxy.go

واجهة المعالج الصادر

كل بروتوكول صادر يُنفّذ واجهة proxy.Outbound:

go
type Outbound interface {
    Process(ctx context.Context,
        link *transport.Link,
        dialer internet.Dialer) error
}

المصدر الرئيسي: proxy/proxy.go

نمط التسجيل

تقوم جميع البروتوكولات بتسجيل نفسها ذاتياً باستخدام النمط ذاته في دالة init():

go
func init() {
    common.Must(common.RegisterConfig((*Config)(nil),
        func(ctx context.Context, config interface{}) (interface{}, error) {
            return New(ctx, config.(*Config))
        }))
}

تدفق الاتصال

mermaid
graph LR
    A[Client] -->|Transport Layer| B[Inbound Handler]
    B -->|Decode Protocol| C[Dispatcher]
    C -->|Routing Rules| D[Outbound Handler]
    D -->|Encode Protocol| E[Transport Layer]
    E --> F[Destination]

مستويات النسخ بالتوصيل (Splice Copy)

يتحكم حقل CanSpliceCopy في البيانات الوصفية للوارد/الصادر في تحسين النسخ بدون نسخ (zero-copy):

القيمةالمعنى
0بدون splice
1مسموح بـ splice (direct/dokodemo)
2ممكن بعد المصافحة (socks/http raw)
3دعم كامل لـ splice (بروتوكولات مشفرة)

تحليل العناوين

تستخدم معظم البروتوكولات protocol.NewAddressParser مع بايتات عائلة العناوين بأسلوب SOCKS5:

البايتالعائلة
0x01IPv4 (4 بايت)
0x03نطاق (بايت واحد لطول البادئة + سلسلة نصية)
0x04IPv6 (16 بايت)

يستخدم VMess ترتيباً مختلفاً: 0x01 = IPv4، 0x02 = نطاق، 0x03 = IPv6، بصيغة المنفذ-ثم-العنوان.

المصدر: proxy/vmess/encoding/encoding.go:12-17، proxy/trojan/protocol.go:16-20، proxy/shadowsocks/protocol.go:24-31

ملفات المصدر الرئيسية

البروتوكولالمجلد
VMessproxy/vmess/ (aead/, encoding/, inbound/, outbound/)
VLESSproxy/vless/
Trojanproxy/trojan/
Shadowsocksproxy/shadowsocks/
Shadowsocks 2022proxy/shadowsocks_2022/
SOCKSproxy/socks/
HTTPproxy/http/
Dokodemo-doorproxy/dokodemo/
Freedomproxy/freedom/
Blackholeproxy/blackhole/
WireGuardproxy/wireguard/
Hysteria2proxy/hysteria/

تحليل تقني لأغراض إعادة التنفيذ.