توافق السلك
توثّق هذه الصفحة تنسيقات السلك الدقيقة المطلوبة للتوافق مع نسخ Xray-core الحالية. يجب أن ينتج تنفيذك ويستهلك البايتات بهذه التنسيقات بالضبط.
تنسيق سلك VLESS
الطلب (العميل -> الخادم)
Offset Size Field
0 1 Version (0x00)
1 16 UUID (raw bytes, NOT hex string)
17 1 Addons length (N)
18 N Addons (protobuf-encoded Addons message, or empty if N=0)
18+N 1 Command: 0x01=TCP, 0x02=UDP, 0x03=Mux, 0x04=Reverse
19+N ... Address (omitted for Mux/Reverse):
Port: 2 bytes big-endian
AddrType: 0x01=IPv4, 0x02=Domain, 0x03=IPv6
Address:
IPv4: 4 bytes
Domain: 1 byte length + domain string
IPv6: 16 bytesرسالة Addons بتنسيق protobuf:
message Addons {
string Flow = 1; // "xtls-rprx-vision" or empty
bytes Seed = 2;
}عندما يكون Flow فارغًا: طول الإضافات = 0 (بايت 0x00 واحد). عندما يكون Flow مُعيَّنًا: يتم ترميزه بتنسيق protobuf وكتابة الطول + البيانات.
الاستجابة (الخادم -> العميل)
Offset Size Field
0 1 Version (echoes request version, 0x00)
1 1 Addons length (N)
2 N Addons (protobuf-encoded, usually empty)جسم VLESS
| الأمر | تنسيق الجسم |
|---|---|
| TCP (بدون Vision) | بايتات تدفق خام |
| UDP | [2B length BE][payload] مُكرر |
| Mux | تنسيق إطار Mux (أدناه) |
| Mux port=666 | تنسيق إطار XUDP (أدناه) |
تنسيق سلك VMess (AEAD)
معلومات المصادقة (16 بايت)
authID = HMAC-MD5(key=MD5(UUID + timestamp/30s), data=timestamp + random)ترويسة الطلب
[16B AuthID]
[2B EncryptedLength] (AES-128-GCM, key from authID)
[NB EncryptedCommand] (AES-128-GCM, key from authID)الأمر بعد فك التشفير:
1B Version (1)
16B Request Body IV
16B Request Body Key
1B Response Auth V
1B Option (0x01=ChunkStream, 0x02=ConnectionReuse, 0x04=ChunkMasking, 0x08=GlobalPadding, 0x10=AuthenticatedLength)
1B Padding Length + Security
1B Reserved
1B Command (0x01=TCP, 0x02=UDP, 0x03=Mux)
2B Port (BE)
1B Address Type
NB Address
NB Random Padding
4B FNV1a32 Checksumترويسة الاستجابة
1B Response Auth V (must match request)
1B Option
1B Command
1B Command Lengthالجسم (AES-128-GCM)
[2B Length (encrypted with AES-GCM)]
[NB Payload (encrypted with AES-GCM)]
[2B Length]
[NB Payload]
...
[2B 0x0000] (end marker)الرقم العشوائي: قائم على عدّاد، يزداد لكل جزء.
تنسيق سلك Trojan
الطلب
[56B Hex(SHA224(password))] (lowercase hex string, NOT binary)
[2B CRLF (0x0D 0x0A)]
[1B Command: 0x01=TCP, 0x03=UDP]
[1B Address Type: 0x01=IPv4, 0x03=Domain, 0x04=IPv6]
[NB Address]
[2B Port (BE)]
[2B CRLF (0x0D 0x0A)]
[... Payload]تأطير UDP (الأمر = 0x03)
[1B Address Type]
[NB Address]
[2B Port (BE)]
[2B Payload Length (BE)]
[2B CRLF]
[NB Payload]يتكرر لكل حزمة UDP.
تنسيق إطار Mux
ترويسة الإطار
[2B Meta Length (BE)] — length of following metadata
[2B Session ID (BE)]
[1B Status: 0x01=New, 0x02=Keep, 0x03=End, 0x04=KeepAlive]
[1B Option: bit 0=Data, bit 1=Error]جلسة جديدة (Status=0x01)
[... Frame Header]
[1B Network: 0x01=TCP, 0x02=UDP]
[2B Port (BE)]
[1B Address Type: 0x01=IPv4, 0x02=Domain, 0x03=IPv6]
[NB Address]حمولة البيانات (عندما يحتوي Option على بت Data)
بعد ترويسة الإطار/البيانات الوصفية:
[2B Data Length (BE)]
[NB Data]إنهاء الجلسة (Status=0x03)
ترويسة الإطار فقط، بدون حقول إضافية.
تنسيق إطار XUDP
نفس بنية Mux، لكن:
- معرّف الجلسة دائمًا
0x0000 - الإطار الأول يتضمن GlobalID بحجم 8 بايتات بعد العنوان
- إطارات Keep تتضمن عنوان وجهة لكل حزمة
جلسة XUDP جديدة
[2B Meta Length]
[00 00] Session ID = 0
[01] Status = New
[01] Option = Data
[02] Network = UDP
[2B Port (BE)]
[1B Addr Type]
[NB Address]
[8B GlobalID] BLAKE3 hash of client source
[2B Data Length (BE)]
[NB UDP Payload]XUDP Keep (الحزم اللاحقة)
[2B Meta Length]
[00 00] Session ID = 0
[02] Status = Keep
[01] Option = Data
[02] Network = UDP (if per-packet dest present)
[2B Port (BE)] (destination of this packet)
[1B Addr Type]
[NB Address]
[2B Data Length (BE)]
[NB UDP Payload]تنسيق حشو Vision
[16B UserUUID] (only in first frame, omitted after)
[1B Command] 0x00=Continue, 0x01=End, 0x02=Direct
[2B Content Length (BE)]
[2B Padding Length (BE)]
[NB Content]
[NB Padding (random bytes)]يمكن ربط كتل حشو متعددة في كتابة واحدة.
ترميز العناوين
تستخدم جميع البروتوكولات نفس ترميز العناوين:
IPv4: Type=0x01, followed by 4 bytes
Domain: Type=0x02, followed by 1 byte length + domain string
IPv6: Type=0x03, followed by 16 bytesالمنفذ دائمًا 2 بايت بترتيب big-endian، يُكتب قبل العنوان (ترتيب المنفذ-ثم-العنوان).
ملاحظات التوافق الرئيسية
ترميز UUID: 16 بايت خام، وليس الشكل النصي المفصول بشرطات.
تنسيق سلك protobuf: تستخدم إضافات VLESS ترميز protobuf القياسي. بادئة الطول هي بايت واحد (وليس varint)، مما يحدّ الإضافات بـ 255 بايت.
معرّف جلسة XUDP يساوي 0: هكذا يميّز الخادم XUDP عن mux العادي. معرّفات جلسات mux العادية تبدأ من 1.
منفذ XUDP السحري 666: عندما يحوّل صادر VLESS بيانات UDP إلى XUDP، يستخدم العنوان
v1.mux.coolمع المنفذ666. هذا اصطلاح وليس تفصيل تنسيق سلك (العنوان يُرسل كجزء من ترويسة VLESS).UserUUID في Vision مرة واحدة: يظهر UUID بحجم 16 بايت فقط في أول إطار حشو. إذا لم يبدأ الإطار الأول بـ UUID المتوقع، يعود الخادم إلى وضع بدون Vision.
كلمة مرور Trojan بتنسيق سداسي عشري: SHA224(password) تُرمَّز كـ 56 حرفًا سداسيًا عشريًا صغيرًا (ASCII)، وليس ثنائيًا.
نافذة وقت VMess: الطابع الزمني في معرّف المصادقة هو
time.Now().Unix() / 30. يقبل الخادم +-120 ثانية (8 فترات زمنية).ترتيب البايتات: جميع الأعداد الصحيحة متعددة البايتات هي big-endian ما لم يُذكر خلاف ذلك.
كشف رجوع VLESS: إذا لم تتطابق أول 17 بايت (الإصدار + UUID) مع أي مستخدم، وكان الرجوع مُفعّلاً، يتم تمرير جميع البيانات المُخزّنة مؤقتًا إلى وجهة الرجوع.
علم وضع Cone: تحدد قيمة
coneفي السياق ما إذا كان UDP يستخدم XUDP (cone=true) أو جلسات mux فردية (cone=false). هذا يؤثر على تنسيق السلك المُستخدم.