Skip to content

توافق السلك

توثّق هذه الصفحة تنسيقات السلك الدقيقة المطلوبة للتوافق مع نسخ 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:

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، يُكتب قبل العنوان (ترتيب المنفذ-ثم-العنوان).

ملاحظات التوافق الرئيسية

  1. ترميز UUID: 16 بايت خام، وليس الشكل النصي المفصول بشرطات.

  2. تنسيق سلك protobuf: تستخدم إضافات VLESS ترميز protobuf القياسي. بادئة الطول هي بايت واحد (وليس varint)، مما يحدّ الإضافات بـ 255 بايت.

  3. معرّف جلسة XUDP يساوي 0: هكذا يميّز الخادم XUDP عن mux العادي. معرّفات جلسات mux العادية تبدأ من 1.

  4. منفذ XUDP السحري 666: عندما يحوّل صادر VLESS بيانات UDP إلى XUDP، يستخدم العنوان v1.mux.cool مع المنفذ 666. هذا اصطلاح وليس تفصيل تنسيق سلك (العنوان يُرسل كجزء من ترويسة VLESS).

  5. UserUUID في Vision مرة واحدة: يظهر UUID بحجم 16 بايت فقط في أول إطار حشو. إذا لم يبدأ الإطار الأول بـ UUID المتوقع، يعود الخادم إلى وضع بدون Vision.

  6. كلمة مرور Trojan بتنسيق سداسي عشري: SHA224(password) تُرمَّز كـ 56 حرفًا سداسيًا عشريًا صغيرًا (ASCII)، وليس ثنائيًا.

  7. نافذة وقت VMess: الطابع الزمني في معرّف المصادقة هو time.Now().Unix() / 30. يقبل الخادم +-120 ثانية (8 فترات زمنية).

  8. ترتيب البايتات: جميع الأعداد الصحيحة متعددة البايتات هي big-endian ما لم يُذكر خلاف ذلك.

  9. كشف رجوع VLESS: إذا لم تتطابق أول 17 بايت (الإصدار + UUID) مع أي مستخدم، وكان الرجوع مُفعّلاً، يتم تمرير جميع البيانات المُخزّنة مؤقتًا إلى وجهة الرجوع.

  10. علم وضع Cone: تحدد قيمة cone في السياق ما إذا كان UDP يستخدم XUDP (cone=true) أو جلسات mux فردية (cone=false). هذا يؤثر على تنسيق السلك المُستخدم.

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