نظرة عامة على البروتوكولات
يُنفّذ Xray-core مجموعة متنوعة من بروتوكولات الوكيل (Proxy)، يتم تسجيل كل منها عبر common.RegisterConfig() في دالة init() الخاصة به. يقوم النواة بتوجيه الاتصالات الواردة إلى معالج البروتوكول المناسب بناءً على الإعدادات، بينما تتصل المعالجات الصادرة بالخوادم العلوية أو الوجهات.
مصفوفة قدرات البروتوكولات
| البروتوكول | وارد | صادر | TCP | UDP | التشفير | دعم 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:
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:
type Outbound interface {
Process(ctx context.Context,
link *transport.Link,
dialer internet.Dialer) error
}المصدر الرئيسي: proxy/proxy.go
نمط التسجيل
تقوم جميع البروتوكولات بتسجيل نفسها ذاتياً باستخدام النمط ذاته في دالة init():
func init() {
common.Must(common.RegisterConfig((*Config)(nil),
func(ctx context.Context, config interface{}) (interface{}, error) {
return New(ctx, config.(*Config))
}))
}تدفق الاتصال
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:
| البايت | العائلة |
|---|---|
0x01 | IPv4 (4 بايت) |
0x03 | نطاق (بايت واحد لطول البادئة + سلسلة نصية) |
0x04 | IPv6 (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
ملفات المصدر الرئيسية
| البروتوكول | المجلد |
|---|---|
| VMess | proxy/vmess/ (aead/, encoding/, inbound/, outbound/) |
| VLESS | proxy/vless/ |
| Trojan | proxy/trojan/ |
| Shadowsocks | proxy/shadowsocks/ |
| Shadowsocks 2022 | proxy/shadowsocks_2022/ |
| SOCKS | proxy/socks/ |
| HTTP | proxy/http/ |
| Dokodemo-door | proxy/dokodemo/ |
| Freedom | proxy/freedom/ |
| Blackhole | proxy/blackhole/ |
| WireGuard | proxy/wireguard/ |
| Hysteria2 | proxy/hysteria/ |