کتابخانه‌ی استاندارد · شبکه

وی لس net.vless

پروتکل پراکسی وی‌لس: کارخواه و سرور، TCP و UDP، پیوندهای اشتراکی vless:// و اجرا روی TCP، TLS، وب‌سوکت یا هر جریان تونل.

واردسازی شبکه.وی لس

نام آرگومان‌ها شناسه‌ی خود کد است و معادل فارسی ندارد؛ گونه‌ها، کلیدواژه‌ها و نام بسته‌ها با معادل فارسی نوشته می‌شوند.

وی‌لس یک پروتکل پراکسی بسیار کوچک از خانواده‌ی Xray و V2Ray است. کارخواه به سرور وصل می‌شود و یک سرآیند می‌فرستد که می‌گوید کیست (یک UUID)، چه می‌خواهد (یک اتصال TCP یا بسته‌های UDP) و به کجا (میزبان و درگاه). سرور UUID را می‌سنجد، با دو بایت پاسخ می‌دهد و از آن به بعد اتصال بار را بدون تغییر می‌برد. همین. وی‌لس خودش هیچ رمزگذاری‌ای ندارد. حفاظت باید از چیزی بیاید که آن را حمل می‌کند، و برای همین روی TLS (تی ال اس در تنظیمات انتقال شبکه) و معمولاً داخل وب‌سوکت پشت CDN به کار می‌رود.

این بسته هر دو نیمه است. شماره گیری کارخواه را از راه انتقال شبکه وصل می‌کند و سرآیند را می‌فرستد؛ پذیرش در سرور سرآیند را می‌خواند و با فهرستی از کاربران می‌سنجد. بعد خواندن و نوشتن بار را جابه‌جا می‌کنند، خواندن بسته و نوشتن بسته بسته‌های UDP را، و تجزیه پیوند پیوندهای اشتراکی vless:// را می‌خواند که برنامه‌ها رد و بدل می‌کنند. به عنوان جریان، اتصال روی جریان و پذیرش روی جریان آن را به جریان‌های تونل وصل می‌کنند، پس می‌تواند یک گام از زنجیره باشد یا داخل پروتکل دیگری اجرا شود. وارد کردن این بسته انتقال شبکه را هم می‌آورد، و برای ساختن مقدار تنظیمات و نشانی مقصد خودتان هم باید آن را وارد کنید.

روی سیم چه می‌گذرد

جهتبایت‌ها
کارخواه به سرور، یک بارنگارش 0، شناسه‌ی ۱۶ بایتی کاربر، طول بلوک افزودنی (۰، یا نام جریان در یک پیام پروتوباف کوچک)، فرمان (1 TCP، 2 UDP، 3 مالتی‌پلکس)، درگاه، نوع نشانی و نشانی. فرمان مالتی‌پلکس نشانی ندارد.
سرور به کارخواه، یک بارنگارش 0 و طول بلوک افزودنی (این بسته هر افزودنی را رد می‌کند).
پس از آن، TCPبار در دو جهت.
پس از آن، UDPهر بسته با طولش در دو بایت پیشوند.

کارخواه برای فرستادن داده منتظر پاسخ سرور نمی‌ماند. دو بایت پاسخ را اولین خواندن می‌خواند، و سروری که کاربر را رد کند فقط اتصال را می‌بندد، پس کارخواه از همان‌جا باخبر می‌شود و نه از شماره گیری.

چیزهایی که گیر می‌اندازند

  • بدون TLS شناسه‌ی کاربر دیده می‌شود و چیزی رمزگذاری نمی‌شود. اتصال وی‌لس روی TCP ساده یک تونل متنی است که جلویش یک گذرواژه دارد. از TLS استفاده کنید، یا وی‌لس را داخل چیزی بگذارید که رمزگذاری می‌کند.
  • کارخواه ردشده موفقیت می‌بیند. شماره گیری فقط سرآیند را می‌فرستد. UUID اشتباه به شکل شکست اولین خواندن دیده می‌شود، و در سرور به شکل unknown user.
  • جریان باید همخوان باشد. کاربر سروری که با کاربر جدید(id، "") ساخته شده درخواست بدون جریان را می‌پذیرد. درخواستی که جریانی غیر از جریان کاربر را نام ببرد رد می‌شود.
  • UDP بسته‌های طول‌دار روی همان یک اتصال است. شکل ساده است؛ قالب بسته‌ی XUDP Xray پیاده نشده.
  • بستن درخواست را آزاد می‌کند. وقتی کارتان تمام شد، در هر دو طرف یک بار بستن را صدا بزنید؛ انتقال زیرین را هم می‌بندد.

سرآیند درخواست

کدگذاری درخواست و کدگشایی درخواست خود سرآیند هستند، بدون اتصال. آزمون‌ها آن‌ها را با بایت‌های شناخته‌شده مقایسه می‌کنند و برای دیدن اینکه سرور دقیقاً چه می‌گیرد مفیدند. کدگشایی درخواست تعداد بایت‌هایی را که مصرف کرد برمی‌گرداند، یا ۱- وقتی بایت‌ها ناقص‌اند، نگارششان اشتباه است یا فرمان ناشناخته دارند.

net-vless-guide-header.salam
// زبان: فارسی
واردسازی شبکه.انتقال شبکه
واردسازی شبکه.وی لس

پایا ID := "b831381d-6324-4d53-ad4f-8cda48b30811"

تابع ریشه:
    ناپایا r := وی لس.درخواست {}
    r.شناسه = انتقال شبکه.تجزیه یو یو آی دی(ID)
    r.فرمان = وی لس.فرمان تی سی پی
    r.نشانی = انتقال شبکه.نشانی جدید("example.com"، 443)
    wire := وی لس.کدگذاری درخواست(r)
    سرچاپ انتقال شبکه.به هگزا(wire)
    سرچاپ wire.طول، "بایت: نگارش، ۱۶ بایت شناسه، ۰ بایت افزودنی، فرمان، درگاه، نوع نشانی، طول، نام"

    ناپایا back := وی لس.درخواست {}
    used := وی لس.کدگشایی درخواست(wire، back)
    سرچاپ used برابر wire.طول، back.نشانی.میزبان، back.نشانی.درگاه، back.فرمان، انتقال شبکه.قالب یو یو آی دی(back.شناسه) برابر ID

    cut := انتقال شبکه.از هگزا("00b831381d63244d53ad4f8cda48b3081100" + "0101bb020b6578616d")
    سرچاپ "سرآیند ناقص کدگشایی می‌شود به"، وی لس.کدگشایی درخواست(cut، back)
    odd := انتقال شبکه.از هگزا("01b831381d63244d53ad4f8cda48b3081100" + "0101bb020b6578616d706c652e636f6d")
    سرچاپ "نگارش اشتباه کدگشایی می‌شود به"، وی لس.کدگشایی درخواست(odd، back)
پایان
خروجی00b831381d63244d53ad4f8cda48b30811000101bb020b6578616d706c652e636f6d 34 بایت: نگارش، ۱۶ بایت شناسه، ۰ بایت افزودنی، فرمان، درگاه، نوع نشانی، طول، نام true example.com 443 1 true سرآیند ناقص کدگشایی می‌شود به -1 نگارش اشتباه کدگشایی می‌شود به -1

برنامه‌ها یک سرور را به شکل یک متن vless://uuid@host:port?query#name به اشتراک می‌گذارند. تجزیه پیوند آن را در یک پیوند می‌خواند: اول معتبر را ببینید و اگر نادرست بود خطا را بخوانید. تنظیمات پیوند پیوند را به تنظیمات انتقال شبکه تبدیل می‌کند (پسوند ?ed=2048 مسیر به داده زودهنگام می‌رود)، قالب پیوند به متن برمی‌گردد و شماره گیری پیوند کل اتصال را انجام می‌دهد. تجزیه‌گر چیزی را که بسته نمی‌تواند انجام دهد با پیامی که دلیل را می‌گوید رد می‌کند: security=reality، type=grpc، type=h2، type=xhttp، encryption غیر از none و UUID بد.

net-vless-guide-link.salam
// زبان: فارسی
واردسازی شبکه.وی لس

تابع ریشه:
    text := "vless://b831381d-6324-4d53-ad4f-8cda48b30811@cdn.example.com:443?encryption=none&security=tls&sni=front.example.net&alpn=http%2F1.1&fp=chrome&type=ws&host=vpn.example.org&path=%2Fws-8f3a%3Fed%3D2048#My%20Server"
    l := وی لس.تجزیه پیوند(text)
    سرچاپ l.معتبر، l.میزبان، l.درگاه، l.برچسب
    سرچاپ l.امنیت، l.شبکه، l.نام سرور، l.سربرگ میزبان، l.مسیر

    s := وی لس.تنظیمات پیوند(l)
    سرچاپ s.شبکه، s.تی ال اس، s.نام سرور، s.سربرگ میزبان، s.مسیر، s.داده زودهنگام

    again := وی لس.تجزیه پیوند(وی لس.قالب پیوند(l))
    سرچاپ "رفت‌وبرگشت مسیر را نگه می‌دارد:"، again.مسیر برابر l.مسیر

    سرچاپ وی لس.تجزیه پیوند("vless://b831381d-6324-4d53-ad4f-8cda48b30811@h:443?security=quic").خطا
    سرچاپ وی لس.تجزیه پیوند("vless://b831381d-6324-4d53-ad4f-8cda48b30811@h:443?type=kcp").خطا
    سرچاپ وی لس.تجزیه پیوند("vless://b831381d-6324-4d53-ad4f-8cda48b30811@h:443?encryption=aes").خطا
    سرچاپ وی لس.تجزیه پیوند("vless://oops@h:443").خطا
پایان
خروجیtrue cdn.example.com 443 My Server tls ws front.example.net vpn.example.org /ws-8f3a?ed=2048 ws true front.example.net vpn.example.org /ws-8f3a 2048 رفت‌وبرگشت مسیر را نگه می‌دارد: true unsupported security quic unsupported transport kcp unsupported encryption aes bad uuid

شروع سریع: کارخواه و سرور روی TCP

سرور با انتقال شبکه.شنود گوش می‌دهد، با انتقال شبکه.پذیرش می‌پذیرد و اتصال را با فهرست کاربرانش به وی لس.پذیرش می‌دهد. کارخواه با وی لس.شماره گیری وصل می‌شود. نشانی مقصد در سرآیند همان جایی است که سرور باید بعداً به آن وصل شود؛ این سرور پژواک فقط آن را چاپ می‌کند. در سرور واقعی به آن مقصد وصل می‌شوید (با تی سی پی یا یک شماره‌گیر تونل) و بایت‌ها را در دو جهت کپی می‌کنید.

net-vless-guide-loopback.salam
// زبان: فارسی
واردسازی رشته
واردسازی حافظه
واردسازی همگام سازی
واردسازی شبکه.انتقال شبکه
واردسازی شبکه.وی لس

پایا ID := "b831381d-6324-4d53-ad4f-8cda48b30811"

ناپایا port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()
ناپایا seen := ""

تابع server():
    l := انتقال شبکه.شنود(0، انتقال شبکه.تنظیمات {})
    port = انتقال شبکه.درگاه شنونده(l)
    همگام سازی.اتمام(ready)
    ناپایا users := وکتور {} برگردان وکتور<وی لس.کاربر>
    users.بیفزا(وی لس.کاربر جدید(ID، ""))
    ناپایا c := وی لس.پذیرش(انتقال شبکه.پذیرش(l)، users)
    اگر c.معتبر:
        seen = c.درخواست.نشانی.میزبان + ":" + رشته.از عدد(c.درخواست.نشانی.درگاه برگردان صحیح۶۴)
        buf := حافظه.تخصیص(4096 برگردان طبیعی۶۴)
        n := وی لس.خواندن(c، buf، 4096)
        وی لس.نوشتن(c، buf، n)
        حافظه.آزادسازی(buf)
    وگرنه:
        seen = "refused: " + c.خطا
    پایان
    وی لس.بستن(c)
    انتقال شبکه.بستن شنونده(l)
پایان

تابع ریشه:
    همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
    t := نخ‌ساز(server)
    همگام سازی.انتظار(ready)

    target := انتقال شبکه.نشانی جدید("example.com"، 443)
    ناپایا c := وی لس.شماره گیری("127.0.0.1"، port، انتقال شبکه.تنظیمات {}، ID، ""، وی لس.فرمان تی سی پی، target)
    ناپایا msg := انتقال شبکه.از رشته("hello through vless")
    وی لس.نوشتن(c، msg.نشانگر، msg.طول)
    buf := حافظه.تخصیص(4096 برگردان طبیعی۶۴)
    n := وی لس.خواندن(c، buf، 4096)
    سرچاپ (buf برگردان رشته).زیررشته(0، n)
    حافظه.آزادسازی(buf)
    انتقال شبکه.آزادسازی بایت‌ها(msg)
    وی لس.بستن(c)
    نخ‌پیوند(t)
    سرچاپ "سرور مقصد را دید"، seen
پایان
خروجیhello through vless سرور مقصد را دید example.com:443

کاربری که سرور نمی‌شناسد

کارخواه خودش نمی‌تواند بفهمد. سرور unknown user می‌بیند، اتصال را می‌بندد و اولین خواندن کارخواه شکست می‌خورد.

net-vless-guide-wrong-user.salam
// زبان: فارسی
واردسازی همگام سازی
واردسازی شبکه.انتقال شبکه
واردسازی شبکه.وی لس

پایا GOOD := "b831381d-6324-4d53-ad4f-8cda48b30811"
پایا OTHER := "5783a3e7-e373-51cd-8642-c83782b807c5"

ناپایا port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()
ناپایا verdict := ""

تابع server():
    l := انتقال شبکه.شنود(0، انتقال شبکه.تنظیمات {})
    port = انتقال شبکه.درگاه شنونده(l)
    همگام سازی.اتمام(ready)
    ناپایا users := وکتور {} برگردان وکتور<وی لس.کاربر>
    users.بیفزا(وی لس.کاربر جدید(GOOD، ""))
    ناپایا c := وی لس.پذیرش(انتقال شبکه.پذیرش(l)، users)
    verdict = c.معتبر ? "accepted " + c.کاربر : "refused: " + c.خطا
    وی لس.بستن(c)
    انتقال شبکه.بستن شنونده(l)
پایان

تابع ریشه:
    همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
    t := نخ‌ساز(server)
    همگام سازی.انتظار(ready)
    ناپایا c := وی لس.شماره گیری("127.0.0.1"، port، انتقال شبکه.تنظیمات {}، OTHER، ""، وی لس.فرمان تی سی پی، انتقال شبکه.نشانی جدید("example.com"، 80))
    سرچاپ "سمت کارخواه تا وقتی نخوانده سالم به نظر می‌رسد:"، c.معتبر
    نخ‌پیوند(t)
    سرچاپ verdict
    وی لس.بستن(c)
پایان
خروجیسمت کارخواه تا وقتی نخوانده سالم به نظر می‌رسد: true refused: unknown user

بسته‌های UDP

با فرمان یو دی پی و مقصد بسته (اینجا یک سرور دی‌ان‌اس) شماره‌گیری کنید. هر نوشتن بسته یک بسته می‌فرستد و هر خواندن بسته یک بسته‌ی کامل را در بافر برمی‌گرداند؛ یک بسته حداکثر ۶۵۵۳۵ بایت است. بسته‌ی بی‌طول خالی خوانده می‌شود.

net-vless-guide-udp.salam
// زبان: فارسی
واردسازی رشته
واردسازی همگام سازی
واردسازی شبکه.انتقال شبکه
واردسازی شبکه.وی لس

پایا ID := "b831381d-6324-4d53-ad4f-8cda48b30811"

ناپایا port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع server():
    l := انتقال شبکه.شنود(0، انتقال شبکه.تنظیمات {})
    port = انتقال شبکه.درگاه شنونده(l)
    همگام سازی.اتمام(ready)
    ناپایا users := وکتور {} برگردان وکتور<وی لس.کاربر>
    users.بیفزا(وی لس.کاربر جدید(ID، ""))
    ناپایا c := وی لس.پذیرش(انتقال شبکه.پذیرش(l)، users)
    تا c.معتبر:
        ناپایا p := انتقال شبکه.بایت‌های جدید(64)
        اگر وارونه وی لس.خواندن بسته(c، p):
            انتقال شبکه.آزادسازی بایت‌ها(p)
            بشکن
        پایان
        وی لس.نوشتن بسته(c، p.نشانگر، p.طول)
        انتقال شبکه.آزادسازی بایت‌ها(p)
    پایان
    وی لس.بستن(c)
    انتقال شبکه.بستن شنونده(l)
پایان

تابع ریشه:
    همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
    t := نخ‌ساز(server)
    همگام سازی.انتظار(ready)
    dns := انتقال شبکه.نشانی جدید("8.8.8.8"، 53)
    ناپایا c := وی لس.شماره گیری("127.0.0.1"، port، انتقال شبکه.تنظیمات {}، ID، ""، وی لس.فرمان یو دی پی، dns)
    تکرار 3 در i:
        ناپایا msg := انتقال شبکه.از رشته("datagram " + رشته.از عدد(i برگردان صحیح۶۴))
        وی لس.نوشتن بسته(c، msg.نشانگر، msg.طول)
        ناپایا back := انتقال شبکه.بایت‌های جدید(64)
        وی لس.خواندن بسته(c، back)
        سرچاپ back.طول، (back.نشانگر برگردان رشته).زیررشته(0، back.طول)
        انتقال شبکه.آزادسازی بایت‌ها(back)
        انتقال شبکه.آزادسازی بایت‌ها(msg)
    پایان
    وی لس.بستن(c)
    نخ‌پیوند(t)
پایان
خروجی10 datagram 0 10 datagram 1 10 datagram 2

داخل یک جریان دیگر

اتصال روی جریان و پذیرش روی جریان پروتکل را به‌جای اتصال شبکه روی هر tunnel.Stream اجرا می‌کنند و به عنوان جریان نتیجه را دوباره به جریان تبدیل می‌کند. زنجیره این‌طور ساخته می‌شود: خروجی یک پروتکل حامل بعدی است. مثال هر دو سر را روی یک لوله‌ی درون‌حافظه اجرا می‌کند.

net-vless-guide-over-stream.salam
// زبان: فارسی
واردسازی حافظه
واردسازی همگام سازی
واردسازی شبکه.انتقال شبکه
واردسازی شبکه.تونل
واردسازی شبکه.وی لس

پایا ID := "b831381d-6324-4d53-ad4f-8cda48b30811"

ناپایا pipe := تونل.لوله جدید()
ناپایا done := همگام سازی.گروه انتظار جدید()
ناپایا seen := ""

تابع server():
    ناپایا users := وکتور {} برگردان وکتور<وی لس.کاربر>
    users.بیفزا(وی لس.کاربر جدید(ID، ""))
    c := وی لس.پذیرش روی جریان(تونل.سر دوم لوله(pipe)، users)
    seen = c.درخواست.نشانی.میزبان
    s := وی لس.به عنوان جریان(c)
    buf := حافظه.تخصیص(256 برگردان طبیعی۶۴)
    n := s.خواندن بایت(buf، 256)
    s.نوشتن بایت(buf، n)
    حافظه.آزادسازی(buf)
    s.بستن()
    همگام سازی.اتمام(done)
پایان

تابع ریشه:
    همگام سازی.افزودن(done، 1 برگردان صحیح۶۴)
    _t := نخ‌ساز(server)
    c := وی لس.اتصال روی جریان(تونل.سر اول لوله(pipe)، ID، ""، وی لس.فرمان تی سی پی، انتقال شبکه.نشانی جدید("inner.example"، 443))
    s := وی لس.به عنوان جریان(c)
    s.نوشتن("hello over a pipe")
    buf := حافظه.تخصیص صفرشده(256 برگردان طبیعی۶۴)
    n := s.خواندن بایت(buf، 256)
    سرچاپ (buf برگردان رشته).زیررشته(0، n)
    حافظه.آزادسازی(buf)
    s.بستن()
    همگام سازی.انتظار(done)
    سرچاپ "سرور دید"، seen
پایان
خروجیhello over a pipe سرور دید inner.example

وی‌لس روی وب‌سوکت و TLS پشت CDN

رایج‌ترین استقرار. گام‌های CDN را از صفحه‌ی انتقال شبکه انجام دهید: دامنه‌ی پراکسی‌شده، مسیر محرمانه‌ی وب‌سوکت، TLS به CDN با نام جلویی در نام سرور و دامنه‌ی خودتان در سربرگ میزبان. آن‌وقت پیوند اشتراکی همه‌ی این‌ها را دارد و یک فراخوانی وصل می‌کند:

net-vless-guide-cdn.salam
// زبان: فارسی
واردسازی شبکه.انتقال شبکه
واردسازی شبکه.وی لس

پایا SHARE := "vless://b831381d-6324-4d53-ad4f-8cda48b30811@front.example.net:443?encryption=none&security=tls&sni=front.example.net&alpn=http%2F1.1&type=ws&host=vpn.example.org&path=%2Fws-8f3a#cdn"

تابع ریشه:
    l := وی لس.تجزیه پیوند(SHARE)
    اگر وارونه l.معتبر:
        سرچاپ "پیوند نادرست:"، l.خطا
        برگشت
    پایان
    target := انتقال شبکه.نشانی جدید("example.com"، 80)
    ناپایا c := وی لس.شماره گیری پیوند(l، وی لس.فرمان تی سی پی، target)
    اگر وارونه c.معتبر:
        سرچاپ "اتصال ممکن نشد:"، c.خطا
        برگشت
    پایان
    ناپایا req := انتقال شبکه.از رشته("HEAD / HTTP/1.0\r\nHost: example.com\r\n\r\n")
    وی لس.نوشتن(c، req.نشانگر، req.طول)
    انتقال شبکه.آزادسازی بایت‌ها(req)
    وی لس.بستن(c)
پایان

در سرور با شبکه = "ws"، همان مسیر و سربرگ میزبان گوش دهید، با تی ال اس خاموش وقتی CDN یا پراکسی معکوس شما TLS را تمام می‌کند (و روشن، با گواهی و کلید، وقتی نه). اتصال‌ها را با انتقال شبکه.پذیرش خام بپذیرید و برای هر کدام در یک نخ کارگر انتقال شبکه.ارتقا و بعد وی لس.پذیرش را اجرا کنید.

دو نکته. اول، وی‌لس رمزگذاری ندارد (encryption=none)، پس CDN می‌تواند ترافیک بین دو پای TLS خودش را بخواند. برای CDN‌های دشمن از وی مس با امنیت ای ای اس۱۲۸ جی سی ام استفاده کنید که خود بار را رمزگذاری می‌کند. دوم، اگر گام اول به‌خاطر نام سرور TLS مسدود است، گزینه‌های تکه‌تکه کردن انتقال شبکه را بگذارید؛ مثل هر شماره‌گیری دیگر روی این هم اثر می‌کنند.

محدودیت‌ها

  • ویژن فقط لایه‌ی لایه‌گذاری است. با جریان xtls-rprx-vision ۸ نوشتن اول هر جهت در قاب‌های ویژن (شناسه‌ی کاربر، فرمان، محتوا و لایه‌ی تصادفی، مثل Xray) پیچیده می‌شود و آخرین آن‌ها به هم‌تا می‌گوید لایه‌گذاری تمام شد. کارخواه و کارساز ما با هم کار می‌کنند و قاب‌بندی از Xray پیروی می‌کند؛ گام «کپی مستقیم» که پس از دست‌دهی TLS 1.3 درونی TLS بیرونی را دور می‌زند پیاده نشده و داده در اتصال بیرونی می‌ماند. هم‌تایی که فرمان مستقیم بفرستد پایان لایه‌گذاری‌اش شمرده می‌شود. ویژن فقط برای فرمان تی سی پی است و با سرور واقعی Xray اجرا نشده.
  • XHTTP و کوییک پشتیبانی نمی‌شود و تجزیه پیوند پیوندهایشان را رد می‌کند. انتقال‌ها tcp، ws، httpupgrade و grpc هستند (در پیوند serviceName و mode=gun|multi) با امنیت none، tls یا reality (pbk، sid، spx، fp).
  • چندپلکسی همان Mux.Cool است. با فرمان مالتی پلکس وصل شوید و چندگانه ساز کارخواه را صدا بزنید؛ در سرور بسنجید که پذیرش درخواستی با فرمان مالتی پلکس داده و چندگانه ساز کارساز را صدا بزنید. نشست‌ها از net.transport می‌آیند (باز کردن نشست، پذیرش نشست).
  • اثر انگشت یک پیوند فقط اطلاعاتی است. ذخیره و دوباره نوشته می‌شود، اما دست‌دهی TLS را عوض نمی‌کند.
  • آزمون هم‌کنش‌پذیری زنده با Xray یا V2Ray انجام نشده. سرآیند با بردارهای بایتی ثابت سنجیده شده و کارخواه و سرور روی TCP، TLS، وب‌سوکت و ارتقای HTTP با هم آزموده شده‌اند، اما با یک ساخت واقعی Xray نه.
  • بازگشت‌های سرور (fallback) نیست. اتصالی که وی‌لس نباشد یا کاربر ناشناخته داشته باشد بسته می‌شود؛ مثل آنچه Xray می‌کند به یک وب‌سرور داده نمی‌شود.
  • داده‌ی زودهنگام به شماره گیری با داده زودهنگام نیاز دارد. تنظیمات پیوند داده زودهنگام را از ?ed= می‌گذارد، اما شماره گیری و شماره گیری پیوند هیچ باری زودهنگام نمی‌فرستند.

گونه‌ها

ویژن Vision

ساختار ویژن
وضعیت لایه‌ی لایه‌گذاری ویژن در هر دو جهت.
نامانگلیسیگونهتوضیح
شناسهuuidانتقال شبکه.بایت‌هاشناسه‌ی کاربر.
نوشتن هاwritesصحیح = 0چند قاب لایه‌دار این سمت فرستاده.
نوشتن تمامwrite_doneمنطقی = نادرستدرست وقتی این سمت لایه‌گذاری را پایان داده.
شناسه فرستاده شدuuid_sentمنطقی = نادرستدرست پس از آنکه اولین قاب شناسه‌ی کاربر را برد.
خواندن تمامread_doneمنطقی = نادرستدرست وقتی هم‌تا لایه‌گذاری را پایان داده.
خواندن خامread_rawمنطقی = نادرستدرست وقتی هم‌تا ویژن نمی‌گوید و بایت‌ها بی‌تغییر می‌گذرند.
آغاز خواندنread_initمنطقی = درستدرست تا وقتی اولین قاب با شناسه‌ی کاربر سنجیده نشده.
باقی سرآیندhead_leftصحیح = 0بایت‌های سرآیند قاب بعدی که هنوز خوانده نشده.
باقی محتواcontent_leftصحیح = 0بایت‌های محتوای قاب جاری که هنوز خوانده نشده.
باقی لایهpad_leftصحیح = 0بایت‌های لایه‌ی قاب جاری که هنوز باید رد شود.
فرمانcommandصحیح = 0فرمان قابی که خوانده می‌شود.
تغییر کردswitchedمنطقی = نادرستپس از فرمان مستقیم، وقتی خواندن به سوکت خام سپرده شد درست است.
معلقpendingانتقال شبکه.بایت‌هابایت‌های دریافتی که هنوز لایه‌شان برداشته نشده.
آمادهreadyانتقال شبکه.بایت‌هابایت‌های بدون لایه که منتظر خواننده‌اند.

درخواست Request

ساختار درخواست
سرآیند درخواست یک اتصال: کاربر، جریان، فرمان و مقصد.
نامانگلیسیگونهتوضیح
شناسهuuidانتقال شبکه.بایت‌هاشناسه‌ی ۱۶ بایتی کاربر.
جریانflowرشته = ""نام جریان، خالی یعنی هیچ.
فرمانcommandصحیح = 1فرمان تی سی پی، فرمان یو دی پی یا فرمان مالتی پلکس.
نشانیaddrانتقال شبکه.نشانینشانی مقصد. فرمان مالتی پلکس از آن استفاده نمی‌کند.

کاربر User

ساختار کاربر
کاربری که سرور می‌پذیرد.
نامانگلیسیگونهتوضیح
شناسهidرشته = ""شناسه‌ی کاربر به صورت متن.
بایت های شناسهuuidانتقال شبکه.بایت‌هاشناسه‌ی کاربر به صورت ۱۶ بایت.
جریانflowرشته = ""جریانی که کاربر می‌تواند نام ببرد. خالی فقط درخواست بدون جریان را می‌پذیرد، و درخواست با جریان خالی همیشه پذیرفته می‌شود.
ساختار پیوند
یک پیوند vless:// تجزیه‌شده.
نامانگلیسیگونهتوضیح
معتبرokمنطقی = نادرستپیوند فهمیده شد و فقط از چیزی استفاده می‌کند که این بسته پشتیبانی می‌کند.
خطاerrرشته = ""دلیل ردشدن پیوند، وقتی معتبر درست است خالی.
شناسهuuidرشته = ""متن شناسه‌ی کاربر.
میزبانhostرشته = ""میزبان سرور یا نشانی IP. IP نسخه ۶ در پیوند داخل کروشه نوشته می‌شود.
درگاهportصحیح = 443درگاه سرور. پیش‌فرض ۴۴۳ است.
برچسبremarkرشته = ""نام بعد از #، رمزگشایی‌شده از درصد.
رمزگذاریencryptionرشته = "none"مقدار encryption. فقط none پذیرفته می‌شود.
جریانflowرشته = ""مقدار flow، وقتی نباشد خالی.
امنیتsecurityرشته = "none"none، tls یا reality.
نام سرورsniرشته = ""نام سرور TLS. وقتی sni نباشد کلید peer خوانده می‌شود.
الپنalpnرشته = ""مقدار ALPN، رمزگشایی‌شده از درصد.
اثر انگشتfingerprintرشته = ""مقدار fp. ذخیره و دوباره نوشته می‌شود و دست‌دهی را عوض نمی‌کند.
شبکهnetworkرشته = "tcp"tcp، ws، httpupgrade یا grpc. مقدارهای دیگر، مثل h2، رد می‌شوند.
سربرگ میزبانhost_headerرشته = ""مقدار host، سرآیند Host درخواست وب‌سوکت.
مسیرpathرشته = ""مقدار path، رمزگشایی‌شده از درصد، با پسوند ?ed= اگر داشته باشد.
اجازه ناامنallow_insecureمنطقی = نادرستوقتی پیوند allowInsecure=1، insecure=1 یا واژه‌ی true را بگوید درست است.
ریلیتیrealityریالیتی.تنظیماتپارامترهای ریالیتی پیوند (pbk، sid، spx، fp) وقتی امنیت reality است.
نام سرویسservice_nameرشته = ""نام سرویس gRPC از بخش serviceName پرسمان.
حالت جی آر پی سیgrpc_modeرشته = "gun"gun یا multi از بخش mode پرسمان.

اتصال Conn

ساختار اتصال
یک اتصال وی‌لس، سمت کارخواه یا سرور.
نامانگلیسیگونهتوضیح
انتقالtانتقال شبکه.اتصالاتصال انتقال شبکه‌ی زیرین.
کارخواهclientمنطقی = نادرستدر سمت کارخواه درست است.
معتبرokمنطقی = نادرستوقتی گام دست‌دهی موفق بود و اتصال قابل استفاده است درست است.
خطاerrرشته = ""دلیل شکست، و در غیر این صورت خالی.
درخواستreqدرخواستسرآیند درخواست: در سرور آنچه کارخواه فرستاد، در کارخواه آنچه خودش فرستاد.
کاربرuserرشته = ""در سرور: شناسه‌ی کاربری که جور شد.
پاسخ معلقresp_pendingمنطقی = نادرستدرونی: دو بایت پاسخ سرور هنوز خوانده نشده.
بسته شدهclosedمنطقی = نادرستدرونی: بستن صدا زده شده.
ویژن روشنvis_onمنطقی = نادرستدرست وقتی اتصال جریان ویژن را اجرا می‌کند.
ویژنvisویژنوضعیت لایه‌گذاری ویژن وقتی جریان ویژن است.

پایاها و متغیرها

جریان ویژن FlowVision

پایا جریان ویژن: رشته = "xtls-rprx-vision"
متن جریان xtls-rprx-vision.

فرمان ادامه ویژن VisionContinue

پایا فرمان ادامه ویژن: صحیح۳۲ = 0
فرمان قابی که یعنی قاب‌های لایه‌دار بعدی می‌آید.

فرمان خاتمه ویژن VisionEnd

پایا فرمان خاتمه ویژن: صحیح۳۲ = 1
فرمان قابی که یعنی این آخرین قاب لایه‌دار است.

فرمان مستقیم ویژن VisionDirect

پایا فرمان مستقیم ویژن: صحیح۳۲ = 2
فرمان قابی که یعنی هم‌تا به کپی مستقیم می‌رود. این بسته هرگز آن را نمی‌فرستد و پایان لایه‌گذاری می‌شمارد.

بسته های لایه گذاری شده ویژن VisionPaddedPackets

پایا بسته های لایه گذاری شده ویژن: صحیح۳۲ = 8
چند نوشتن پیش از فرمان پایان لایه‌دار می‌شود: ۸.

فرمان‌ها Cmd…

بایت فرمان یک درخواست: فرمان تی سی پی اتصال TCP به مقصد باز می‌کند، فرمان یو دی پی بسته‌های UDP می‌برد، فرمان مالتی پلکس فرمان چندپلکسی است که سرآیند می‌تواند حمل کند اما چیزی پیاده‌اش نکرده.
نامانگلیسیمقدار
فرمان تی سی پیCmdTCP1
فرمان یو دی پیCmdUDP2
فرمان مالتی پلکسCmdMux3

تابع‌ها

به عنوان جریان AsStream

تابع به عنوان جریان(c: اتصال): dyn تونل.جریان
اتصال را به صورت tunnel.Stream می‌پیچد تا بتواند حامل پروتکل دیگری باشد یا به کد تونل داده شود.

اتصال روی جریان DialOver

تابع اتصال روی جریان(s: dyn تونل.جریان، uuid: رشته، flow: رشته، command: صحیح، target: انتقال شبکه.نشانی): اتصال
نیمه‌ی کارخواه را به‌جای اتصال شبکه‌ی تازه روی یک جریان موجود اجرا می‌کند.

پذیرش روی جریان AcceptOver

تابع پذیرش روی جریان(s: dyn تونل.جریان، users: وکتور<کاربر>): اتصال
نیمه‌ی سرور را روی یک جریان موجود اجرا می‌کند.

چندگانه ساز کارخواه MuxClient

تابع چندگانه ساز کارخواه(c: اتصال): انتقال شبکه.چندگانه ساز
یک چندگانه‌ساز کارخواه Mux.Cool روی اتصالی که با CmdMux ساخته شده راه می‌اندازد.

چندگانه ساز کارساز MuxServer

تابع چندگانه ساز کارساز(c: اتصال): انتقال شبکه.چندگانه ساز
یک چندگانه‌ساز کارساز Mux.Cool روی اتصال پذیرفته‌ای که فرمانش CmdMux است راه می‌اندازد.

ویژن جدید NewVision

تابع ویژن جدید(uuid: انتقال شبکه.بایت‌ها): ویژن
وضعیت ویژن را برای یک شناسه‌ی کاربر می‌سازد. هر دو سر شناسه‌ی یکسان می‌خواهند.

آزادسازی ویژن FreeVision

تابع آزادسازی ویژن(v &: ویژن)
بافرهای یک وضعیت ویژن را آزاد می‌کند.

لایه گذاری ویژن VisionPad

تابع لایه گذاری ویژن(v &: ویژن، p: تهی*، n: صحیح، command: صحیح، long_padding: منطقی): انتقال شبکه.بایت‌ها
یک قاب لایه‌دار دور یک بار با فرمان داده‌شده می‌سازد. اولین قاب هر جهت با شناسه‌ی کاربر شروع می‌شود.

برداشتن لایه ویژن VisionUnpad

تابع برداشتن لایه ویژن(v &: ویژن، p: تهی*، n: صحیح، out &: انتقال شبکه.بایت‌ها): منطقی
بایت‌های دریافتی را به وضعیت ویژن می‌دهد و بار را به out می‌افزاید. نادرست در شکست حافظه.

نوشتن ویژن VisionWrite

تابع نوشتن ویژن(t &: انتقال شبکه.اتصال، v &: ویژن، p: تهی*، n: صحیح): منطقی
از میان لایه‌ی ویژن می‌نویسد: ۸ نوشتن اول لایه‌دار می‌شود و بقیه بی‌تغییر می‌گذرد.

خواندن ویژن VisionRead

تابع خواندن ویژن(t &: انتقال شبکه.اتصال، v &: ویژن، buf: تهی*، max: صحیح): صحیح
از میان لایه‌ی ویژن می‌خواند: تا وقتی لایه‌گذاری هست لایه را برمی‌دارد و بعد بایت خام برمی‌گرداند.

کدگذاری درخواست EncodeRequest

تابع کدگذاری درخواست(r: درخواست): انتقال شبکه.بایت‌ها
سرآیند درخواست را به صورت بایت می‌دهد. نتیجه را با transport.FreeBytes آزاد کنید.

کدگشایی درخواست DecodeRequest

تابع کدگشایی درخواست(b: انتقال شبکه.بایت‌ها، r &: درخواست): صحیح
سرآیند درخواست را از بایت‌ها می‌خواند و تعداد بایت‌های مصرفی را برمی‌گرداند، یا ۱- وقتی ناقص است، نگارش اشتباه یا فرمان ناشناخته دارد.

خواندن درخواست ReadRequest

تابع خواندن درخواست(t &: انتقال شبکه.اتصال، r &: درخواست): منطقی
یک سرآیند درخواست را از یک اتصال انتقال شبکه می‌خواند. اگر تجزیه نشود نادرست است.

کاربر جدید NewUser

تابع کاربر جدید(uuid: رشته، flow: رشته): کاربر
از متن UUID و جریانی که می‌تواند به کار ببرد یک کاربر می‌سازد.

کارخواه Client

تابع کارخواه(t: انتقال شبکه.اتصال، uuid: رشته، flow: رشته، command: صحیح، addr: انتقال شبکه.نشانی): اتصال
سرآیند درخواست را روی اتصال انتقال شبکه‌ای که از قبل باز است می‌فرستد و اتصال وی‌لس را برمی‌گرداند. اگر UUID بد باشد یا نوشتن شکست بخورد معتبر نادرست است.

شماره گیری Dial

تابع شماره گیری(host: رشته، port: صحیح، s: انتقال شبکه.تنظیمات، uuid: رشته، flow: رشته، command: صحیح، target: انتقال شبکه.نشانی): اتصال
با transport.Dial و تنظیمات داده‌شده وصل می‌شود و بعد سرآیند را می‌فرستد. پاسخ هنوز خوانده نمی‌شود: کاربر ردشده در اولین خواندن دیده می‌شود.

پذیرش Accept

تابع پذیرش(t: انتقال شبکه.اتصال، users: وکتور<کاربر>): اتصال
سرآیند را روی یک اتصال انتقال شبکه می‌خواند، کاربر را در فهرست پیدا می‌کند و پاسخ را می‌فرستد. در شکست معتبر نادرست است، خطا دلیل را می‌گوید (unknown user، bad request header، unsupported flow) و انتقال بسته می‌شود.

خواندن Read

تابع خواندن(c &: اتصال، buf: تهی*، max: صحیح): صحیح
بار را می‌خواند. در کارخواه اولین فراخوانی دو بایت پاسخ سرور را می‌خواند. وقتی اتصال تمام شود ۰ یا کمتر برمی‌گرداند.

نوشتن Write

تابع نوشتن(c &: اتصال، p: تهی*، n: صحیح): منطقی
بار را از یک اشاره‌گر می‌نویسد. اگر شکست بخورد نادرست است.

خواندن بسته ReadPacket

تابع خواندن بسته(c &: اتصال، out &: انتقال شبکه.بایت‌ها): منطقی
یک بسته‌ی UDP را به بافر اضافه می‌کند. وقتی اتصال تمام شود نادرست است.

نوشتن بسته WritePacket

تابع نوشتن بسته(c &: اتصال، p: تهی*، n: صحیح): منطقی
یک بسته‌ی UDP حداکثر ۶۵۵۳۵ بایتی می‌نویسد.

بستن Close

تابع بستن(c &: اتصال)
اتصال و انتقال زیرش را می‌بندد. دو بار صدا زدنش مشکلی ندارد.
تابع تجزیه پیوند(link: رشته): پیوند
یک پیوند vless:// را تجزیه می‌کند. معتبر را ببینید؛ خطا می‌گوید چه چیز اشتباه یا پشتیبانی‌نشده بود.
تابع قالب پیوند(l: پیوند): رشته
پیوند را دوباره به صورت متن می‌نویسد و مقدارهایی را که لازم است درصدی‌کدگذاری می‌کند.

تنظیمات پیوند LinkSettings

تابع تنظیمات پیوند(l: پیوند): انتقال شبکه.تنظیمات
transport.Settingsای که با پیوند جور است: شبکه، TLS، نام‌ها، مسیر و اندازه‌ی داده‌ی زودهنگام از ?ed=.
تابع شماره گیری پیوند(l: پیوند، command: صحیح، target: انتقال شبکه.نشانی): اتصال
به سرور یک پیوند با تنظیمات، کاربر و جریانش و فرمان و مقصدی که می‌دهید وصل می‌شود.