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

وی مس net.vmess

پروتکل پراکسی وی‌مس، فقط شکل AEAD: کارخواه و سرور رمزگذاری‌شده، TCP و UDP، روی TCP، TLS، وب‌سوکت یا هر جریان تونل، با بلوک‌های رمزنگاری در دسترس.

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

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

وی‌مس پروتکل قدیمی‌تر خانواده‌ی V2Ray است و برخلاف وی لس خودش رمزگذاری می‌کند. کارخواه با یک شناسه‌ی احراز که زمان فعلی را دارد ثابت می‌کند UUID یک کاربر را دارد، درخواست (نشانی مقصد و کلیدهای نشست) را با کلیدهای برگرفته از UUID رمزگذاری‌شده می‌فرستد و بعد بار را در قطعه‌های رمزگذاری‌شده می‌فرستد. سرور با سرآیند رمزگذاری‌شده‌ی خودش و قطعه‌های خودش پاسخ می‌دهد. هر که نگاه کند بایت‌های تصادفی می‌بیند، هر چه حاملشان باشد.

این بسته فقط شکل AEAD را پیاده می‌کند، شکلی که از V2Ray 4.28 به بعد به کار می‌رود و تنها شکلی است که کارخواه‌های امروزی تولید می‌کنند: کاربر با شناسه‌ی احراز رمزگذاری‌شده شناخته می‌شود و سرآیند با AES-128-GCM مهر می‌شود. شکل قدیمی‌تر مبتنی بر MD5، همان که به alterId بالای ۰ نیاز دارد، پیاده نشده. alterId را در دو طرف ۰ بگذارید (در کارخواه‌های امروزی پیش‌فرض همین است).

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

رمزگذاری‌های بدنه

ثابتچه می‌کند
امنیت ای ای اس۱۲۸ جی سی امهر قطعه با AES-128-GCM مهر می‌شود. انتخاب پیش‌فرض.
امنیت چاچا۲۰ پلی۱۳۰۵هر قطعه با ChaCha20-Poly1305 مهر می‌شود. روی پردازنده‌ای که دستور AES ندارد انتخاب خوبی است.
امنیت هیچقطعه‌ها قاب‌بندی می‌شوند اما رمزگذاری نمی‌شوند. سرآیند باز هم مهر می‌شود.
امنیت صفرنه قطعه و نه رمزگذاری: بار همان‌طور که هست بعد از سرآیند می‌آید. فقط برای استفاده داخل TLS.

سرآیند همیشه با AES-128-GCM و کلیدهای برگرفته از UUID مهر می‌شود، هر نوع بدنه‌ای که انتخاب شود. گزینه‌های درخواست.گزینه ها بیت‌اند: گزینه جریان قطعه ای بدنه را در قطعه‌ها قاب‌بندی می‌کند، گزینه نقاب طول طول قطعه‌ها را با جریان SHAKE128 پنهان می‌کند، گزینه لایه گذاری به هر قطعه لایه‌ی تصادفی می‌افزاید و گزینه طول احراز شده طول‌ها را با رمز بدنه احراز می‌کند. شماره گیری برای نوع امنیت از گزینه پیش فرض استفاده می‌کند؛ برای انتخاب بیت‌ها با خودتان، کارخواه را روی اتصالی که خودتان باز کرده‌اید صدا بزنید.

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

  • دو ساعت باید یکی باشند. شناسه‌ی احراز زمان را دارد و سرور فقط شناسه‌هایی را می‌پذیرد که در پنجره زمانی ثانیه، یعنی ۱۲۰، از ساعت خودش باشند. گوشی یا سروری که ساعتش اشتباه است unknown user or stale timestamp می‌گیرد و هیچ چیز دیگر. وقتی UUID درست رد می‌شود اولین چیزی که باید بررسی شود همین است.
  • یک فیلتر بازپخش مشترک بگذارید. پذیرش شناسه‌های احرازی را که دیده به خاطر می‌سپارد و تکراری را رد می‌کند. با فیلتر بازپخش جدید یکی بسازید و همان را به همه‌ی فراخوانی‌های پذیرش یک سرور بدهید؛ از چند نخ هم امن است. وقتی بیش از ۴۰۹۶ شناسه نگه دارد، آن‌هایی را که از چهار دقیقه قدیمی‌ترند دور می‌ریزد.
  • به کارخواه ردشده چیزی گفته نمی‌شود. شماره گیری فقط سرآیند را می‌فرستد. UUID اشتباه، ساعت کهنه یا شناسه‌ی بازپخش‌شده باعث می‌شود سرور اتصال را ببندد و کارخواه آن را به شکل یک خواندن ناموفق می‌بیند.
  • سرور باید نوع امنیت را پشتیبانی کند. پذیرشی که نوعی غیر از چهار نوع بالا بخواند با unsupported security type شکست می‌خورد.
  • پیوند vmess:// نیست. قالب اشتراک JSON کدگذاری‌شده با Base64 V2RayN و دیگران اینجا تجزیه نمی‌شود. فیلدها را خودتان از آن بردارید.
  • بستن کلیدها را آزاد می‌کند. وقتی کارتان تمام شد در هر طرف یک بار بستن را صدا بزنید.

بلوک‌های سازنده

این برنامه از یک UUID کلید فرمان کاربر را می‌سازد، برای یک زمان معین شناسه‌ی احراز می‌سازد، دوباره بازش می‌کند (که زمان را هم پس می‌دهد)، نشان می‌دهد کلید کاربر دیگر نمی‌تواند بازش کند و یک سرآیند کوچک را مهر می‌کند. عددهایی که درمی‌آیند ثابت‌اند، پس می‌توان با پیاده‌سازی دیگری مقایسه‌شان کرد.

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

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

تابع ریشه:
    key := وی مس.کلید فرمان(انتقال شبکه.تجزیه یو یو آی دی(ID))
    سرچاپ "کلید فرمان"، انتقال شبکه.به هگزا(key)

    stamp := 1700000000 برگردان صحیح۶۴
    salt := انتقال شبکه.از هگزا("a1b2c3d4")
    authid := وی مس.ساخت شناسه احراز(key، stamp، salt)
    سرچاپ "شناسه‌ی احراز"، انتقال شبکه.به هگزا(authid)

    ناپایا when := 0 برگردان صحیح۶۴
    سرچاپ "با کلید درست باز می‌شود:"، وی مس.گشودن شناسه احراز(key، authid، when)، when برابر stamp
    other := وی مس.کلید فرمان(انتقال شبکه.تجزیه یو یو آی دی("5783a3e7-e373-51cd-8642-c83782b807c5"))
    سرچاپ "برای کاربر دیگر رد می‌شود:"، وارونه وی مس.گشودن شناسه احراز(other، authid، when)

    nonce := انتقال شبکه.از هگزا("1112131415161718")
    sealed := وی مس.مهر سرآیند(key، انتقال شبکه.از رشته("a small header")، stamp، salt، nonce)
    سرچاپ "سرآیند مهرشده"، sealed.طول، "بایت است"
    سرچاپ "پنجره‌ی زمانی به ثانیه:"، وی مس.پنجره زمانی
    سرچاپ "گزینه‌ی پیش‌فرض برای aes-gcm:"، وی مس.گزینه پیش فرض(وی مس.امنیت ای ای اس۱۲۸ جی سی ام)
    سرچاپ "گزینه‌ی پیش‌فرض برای none:"، وی مس.گزینه پیش فرض(وی مس.امنیت هیچ)
    سرچاپ "گزینه‌ی پیش‌فرض برای zero:"، وی مس.گزینه پیش فرض(وی مس.امنیت صفر)
پایان
خروجیکلید فرمان b50d916ac0cec067981af8e5f38a758f شناسه‌ی احراز afabbebf298c2611f08228d760111288 با کلید درست باز می‌شود: true true برای کاربر دیگر رد می‌شود: true سرآیند مهرشده 72 بایت است پنجره‌ی زمانی به ثانیه: 120 گزینه‌ی پیش‌فرض برای aes-gcm: 5 گزینه‌ی پیش‌فرض برای none: 1 گزینه‌ی پیش‌فرض برای zero: 0

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

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

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

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

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

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

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

تابع ریشه:
    همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
    t := نخ‌ساز(server)
    همگام سازی.انتظار(ready)
    talk(وی مس.امنیت ای ای اس۱۲۸ جی سی ام)
    talk(وی مس.امنیت چاچا۲۰ پلی۱۳۰۵)
    talk(وی مس.امنیت هیچ)
    نخ‌پیوند(t)
    سرچاپ seen
پایان
خروجی3 hello through vmess 4 hello through vmess 5 hello through vmess example.com security 3; example.com security 4; example.com security 5;

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

کارخواه خودش نمی‌تواند بفهمد. سرور کلید جورشده‌ای نمی‌یابد، unknown user or stale timestamp می‌گوید و اتصال را می‌بندد. سرور واقعی نباید کار دیگری بکند: فرستادن خطا به یک پویشگر می‌گفت که پراکسی پیدا کرده.

net-vmess-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))
    ناپایا rf := وی مس.فیلتر بازپخش جدید()
    ناپایا c := وی مس.پذیرش(انتقال شبکه.پذیرش(l)، users، rf)
    verdict = c.معتبر ? "accepted " + c.کاربر : "refused: " + c.خطا
    وی مس.بستن(c)
    انتقال شبکه.بستن شنونده(l)
پایان

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

وی‌لس حامل وی‌مس

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

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

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

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

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

تابع ریشه:
    همگام سازی.افزودن(done، 1 برگردان صحیح۶۴)
    _t := نخ‌ساز(server)
    outer := وی لس.اتصال روی جریان(تونل.سر اول لوله(pipe)، OUTER، ""، وی لس.فرمان تی سی پی، انتقال شبکه.نشانی جدید("hop.example"، 443))
    inner := وی مس.اتصال روی جریان(وی لس.به عنوان جریان(outer)، INNER، وی مس.امنیت چاچا۲۰ پلی۱۳۰۵، وی مس.فرمان تی سی پی، انتقال شبکه.نشانی جدید("final.example"، 443))
    s := وی مس.به عنوان جریان(inner)
    s.نوشتن("two layers deep")
    buf := حافظه.تخصیص صفرشده(256 برگردان طبیعی۶۴)
    n := s.خواندن بایت(buf، 256)
    سرچاپ (buf برگردان رشته).زیررشته(0، n)
    حافظه.آزادسازی(buf)
    s.بستن()
    همگام سازی.انتظار(done)
    سرچاپ "سرور دید"، seen
پایان
خروجیtwo layers deep سرور دید hop.example then final.example

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

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

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

تابع ریشه:
    ناپایا s := انتقال شبکه.تنظیمات {}
    s.شبکه = "ws"
    s.تی ال اس = درست
    s.نام سرور = "front.example.net"
    s.سربرگ میزبان = "vpn.example.org"
    s.مسیر = "/vm-31c9"
    s.الپن = "http/1.1"

    target := انتقال شبکه.نشانی جدید("example.com"، 80)
    ناپایا c := وی مس.شماره گیری("front.example.net"، 443، s، "b831381d-6324-4d53-ad4f-8cda48b30811"، وی مس.امنیت ای ای اس۱۲۸ جی سی ام، وی مس.فرمان تی سی پی، target)
    اگر وارونه c.معتبر:
        سرچاپ "اتصال ممکن نشد:"، c.خطا
        برگشت
    پایان
    ناپایا req := انتقال شبکه.از رشته("HEAD / HTTP/1.0\r\nHost: example.com\r\n\r\n")
    وی مس.نوشتن(c، req.نشانگر، req.طول)
    انتقال شبکه.آزادسازی بایت‌ها(req)
    وی مس.بستن(c)
پایان

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

برنامه‌ها یک سرور وی‌مس را به شکل vmess:// و پس از آن Base64 یک شیء JSON به اشتراک می‌گذارند (شکل v2rayN، همان که tunnel.ParseLink می‌خواند). تجزیه پیوند آن را به یک پیوند می‌خواند: معتبر را بسنجید و اگر نادرست بود خطا را بخوانید. قالب پیوند یکی را برمی‌نویسد، تنظیمات پیوند آن را به تنظیمات net.transport تبدیل می‌کند (مسیر وب‌سوکت و داده‌ی زودهنگام ?ed=، نام سرویس gRPC، نام TLS) و شماره گیری پیوند به آن وصل می‌شود. امنیت از نام و نام امنیت میان نام‌هایی مثل chacha20-poly1305 و شماره‌ی امنیت تبدیل می‌کنند؛ auto یعنی AES-128-GCM. aid قدیمی خوانده و نگه داشته می‌شود اما فقط ۰ معنا دارد.

محدودیت‌ها

  • فقط AEAD. حالت قدیمی (alterId بالای ۰) نیست و با سرور یا کارخواهی که به آن نیاز دارد سازگار نیست.
  • گزینه‌ی طول احراز شده از Xray پیروی می‌کند. گزینه طول احراز شده کلید و نانس طول را در هر دو جهت از کلید و بردار درخواست می‌گیرد، طول را با AES-128-GCM مهر می‌کند (برای بدنه‌ی چاچا هم) و در اجرای هم‌کنش‌پذیری با Xray و sing-box سنجیده شده است (ماتریس در docs/VPN_INTEROP.md). شماره گیری هرگز آن را نمی‌گذارد؛ بیت‌ها را با کارخواه بگذارید.
  • هم‌کنش‌پذیری جداگانه آزموده شد. سرآیند، شناسه‌ی احراز، اشتقاق کلید و قالب قطعه‌ها در این مخزن با بردارهای بایتی ثابت و با دو نیمه‌ی خود بسته (روی TCP، TLS، وب‌سوکت و یک لوله) سنجیده می‌شود. ابزار هم‌کنش‌پذیری بسته را با ساخت‌های واقعی Xray و sing-box اجرا می‌کند؛ نتیجه‌ها در docs/VPN_INTEROP.md است.
  • چندپلکسی همان Mux.Cool است. با فرمان مالتی پلکس وصل شوید و چندگانه ساز کارخواه را صدا بزنید؛ در سرور وقتی درخواست پذیرفته‌شده فرمان مالتی پلکس دارد چندگانه ساز کارساز را صدا بزنید. نشست‌ها از net.transport می‌آیند (باز کردن نشست، پذیرش نشست).
  • ابزارهای رمزنگاری ضعیف، به‌خاطر طراحی. وی‌مس برای کلید فرمان از MD5 و برای یک بلوک شناسه‌ی احراز از AES حالت ECB استفاده می‌کند؛ این‌ها از خود پروتکل‌اند، نه انتخاب این بسته. رمزهای بار احرازشونده‌اند (AES-GCM، ChaCha20-Poly1305).
  • امنیت هیچ و امنیت صفر بار را رمزگذاری نمی‌کنند. فقط داخل TLS‌ای که به آن اعتماد دارید به کار ببریدشان.
  • محافظت بازپخش در هر فرایند جدا است. فیلتر در حافظه است، پس راه‌اندازی دوباره آن را فراموش می‌کند، اما پنجره‌ی زمانی هنوز آنچه را می‌شود بازپخش کرد محدود می‌کند.

گونه‌ها

کاربر User

ساختار کاربر
کاربری که سرور می‌پذیرد.
نامانگلیسیگونهتوضیح
شناسهidرشته = ""شناسه‌ی کاربر به صورت متن.
کلید فرمانcmd_keyانتقال شبکه.بایت‌هاکلید فرمان برگرفته از شناسه‌ی کاربر. کاربر جدید آن را حساب می‌کند.

فیلتر بازپخش ReplayFilter

ساختار فیلتر بازپخش
حافظه‌ی شناسه‌های احرازی که سرور دیده. یکی را بین همه‌ی فراخوانی‌های پذیرش مشترک بگذارید؛ قفل دارد.
نامانگلیسیگونهتوضیح
دیده شدهseenنگاشت<رشته، صحیح۶۴>شناسه‌های دیده‌شده و زمانی که هر کدام دیده شد.
قفلlockهمگام سازی.قفلقفلی که از دیده شده محافظت می‌کند.

اتصال Conn

ساختار اتصال
یک اتصال وی‌مس، سمت کارخواه یا سرور.
نامانگلیسیگونهتوضیح
انتقالtانتقال شبکه.اتصالاتصال انتقال شبکه‌ی زیرین.
کارخواهclientمنطقی = نادرستدر سمت کارخواه درست است.
معتبرokمنطقی = نادرستوقتی تبادل سرآیند موفق بود و اتصال قابل استفاده است درست است.
خطاerrرشته = ""دلیل شکست، و در غیر این صورت خالی.
درخواستreqدرخواستسرآیند درخواست: در سرور آنچه کارخواه فرستاد، در کارخواه آنچه خودش فرستاد.
کاربرuserرشته = ""در سرور: شناسه‌ی کاربری که جور شد.
رمز نوشتنwcCodecدرونی: رمزگذار قطعه‌هایی که این طرف می‌نویسد.
رمز خواندنrcCodecدرونی: رمزگشای قطعه‌هایی که این طرف می‌خواند.
پاسخ معلقresp_pendingمنطقی = نادرستدرونی: سرآیند پاسخ سرور هنوز خوانده نشده.
کلید پاسخresp_keyانتقال شبکه.بایت‌هادرونی: کلید سرآیند پاسخ.
بردار پاسخresp_ivانتقال شبکه.بایت‌هادرونی: بردار آغازین پاسخ.
بافر خواندنrbufانتقال شبکه.بایت‌هادرونی: بایت‌های رمزگشایی‌شده که هنوز خوانده نشده‌اند.
پایان جریانeofمنطقی = نادرستدرونی: هم‌تا جریان را تمام کرد.
بسته شدهclosedمنطقی = نادرستدرونی: بستن صدا زده شده.
ساختار پیوند
یک پیوند vmess:// تجزیه‌شده، همان شکلی که v2rayN و بیشتر برنامه‌ها به اشتراک می‌گذارند.
نامانگلیسیگونهتوضیح
معتبرokمنطقی = نادرستدرست وقتی پیوند کامل و پشتیبانی‌شده است.
خطاerrرشته = ""چرا تجزیه شکست خورد.
برچسبremarkرشته = ""برچسب ps.
میزبانhostرشته = ""نشانی سرور.
درگاهportصحیح = 443درگاه سرور.
شناسهuuidرشته = ""شناسه‌ی کاربر.
شناسه جایگزینalter_idصحیح = 0عدد قدیمی aid که برای رفت و برگشت می‌ماند. اینجا فقط ۰ معنا دارد.
امنیتsecurityرشته = "auto"نام رمز بدنه: auto، aes-128-gcm، chacha20-poly1305، none یا zero.
شبکهnetworkرشته = "tcp"tcp، ws، httpupgrade یا grpc.
نوع سرآیندheader_typeرشته = "none"فیلد type، معمولاً none.
سربرگ میزبانhost_headerرشته = ""فیلد host: سرآیند Host در وب‌سوکت و ارتقای HTTP.
مسیرpathرشته = ""مسیر وب‌سوکت یا نام سرویس gRPC.
تی ال اسtlsمنطقی = نادرستدرست وقتی پیوند tls می‌گوید.
نام سرورsniرشته = ""نام سرور TLS.
الپنalpnرشته = ""متن ALPN.
اثر انگشتfingerprintرشته = ""نام مرورگر fp.
اجازه ناامنallow_insecureمنطقی = نادرستبررسی گواهی را رد می‌کند.

درخواست Request

ساختار درخواست
سرآیند درخواستی که در بایت‌های اول یک اتصال مهر شده است: کلیدهای نشست، گزینه‌ها، فرمان و مقصد.
نامانگلیسیگونهتوضیح
نگارشversionصحیح = 1نگارش سرآیند. همیشه ۱.
بردار آغازینivانتقال شبکه.بایت‌هابردار آغازین ۱۶ بایتی بدنه‌ی درخواست. کلیدهای پاسخ از آن گرفته می‌شوند.
کلیدkeyانتقال شبکه.بایت‌هاکلید ۱۶ بایتی بدنه‌ی درخواست.
بایت پاسخresp_vصحیح = 0یک بایت که سرور باید در سرآیند پاسخش برگرداند. به کارخواه می‌گوید پاسخ مال این درخواست است.
گزینه هاoptionصحیح = 0بیت‌های گزینه: گزینه جریان قطعه ای، گزینه نقاب طول، گزینه لایه گذاری، گزینه طول احراز شده.
امنیتsecurityصحیح = 3رمزگذاری بدنه: امنیت ای ای اس۱۲۸ جی سی ام، امنیت چاچا۲۰ پلی۱۳۰۵، امنیت هیچ یا امنیت صفر.
فرمانcommandصحیح = 1فرمان تی سی پی، فرمان یو دی پی یا فرمان مالتی پلکس.
نشانیaddrانتقال شبکه.نشانینشانی مقصد. فرمان مالتی پلکس از آن استفاده نمی‌کند.
طول لایه گذاریpaddingصحیح = 0سرآیند چند بایت لایه‌ی تصادفی دارد، ۰ تا ۱۵.

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

فرمان‌ها Cmd…

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

رمزگذاری‌های بدنه Sec…

کدام رمز بدنه را مهر می‌کند، برای امنیت یک درخواست و برای شماره گیری: امنیت ای ای اس۱۲۸ جی سی ام (AES-128-GCM)، امنیت چاچا۲۰ پلی۱۳۰۵ (ChaCha20-Poly1305)، امنیت هیچ (قاب‌بندی‌شده، رمزگذاری‌نشده)، امنیت صفر (نه قاب‌بندی، نه رمزگذاری).
نامانگلیسیمقدار
امنیت ای ای اس۱۲۸ جی سی امSecAES128GCM3
امنیت چاچا۲۰ پلی۱۳۰۵SecChaCha20Poly13054
امنیت هیچSecNone5
امنیت صفرSecZero6

بیت‌های گزینه Opt…

بیت‌ها برای گزینه ها یک درخواست، ترکیب‌شده با |: گزینه جریان قطعه ای بدنه را قاب‌بندی می‌کند، گزینه نقاب طول طول قطعه‌ها را نقاب می‌زند، گزینه لایه گذاری هر قطعه را لایه‌گذاری می‌کند، گزینه طول احراز شده طول‌ها را احراز می‌کند (با هم‌تای واقعی سنجیده نشده).
نامانگلیسیمقدار
گزینه جریان قطعه ایOptChunkStream1
گزینه نقاب طولOptChunkMask4
گزینه لایه گذاریOptPadding8
گزینه طول احراز شدهOptAuthLength16

پنجره زمانی TimeWindow

پایا پنجره زمانی: صحیح۳۲ = 120
زمان داخل یک شناسه‌ی احراز چند ثانیه می‌تواند با ساعت سرور فرق داشته باشد. ۱۲۰.

تابع‌ها

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

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

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

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

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

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

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

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

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

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

کاربر جدید NewUser

تابع کاربر جدید(uuid: رشته): کاربر
از متن UUID یک کاربر می‌سازد و کلید فرمانش را حساب می‌کند. UUID بد کلید را خالی می‌گذارد.

فیلتر بازپخش جدید NewReplayFilter

تابع فیلتر بازپخش جدید(): فیلتر بازپخش
یک فیلتر بازپخش خالی می‌سازد.

گزینه پیش فرض DefaultOption

تابع گزینه پیش فرض(security: صحیح): صحیح
بیت‌های گزینه برای یک نوع امنیت: برای امنیت صفر هیچ، برای امنیت هیچ قطعه‌ها، و در غیر این صورت قطعه‌ها و طول‌های نقاب‌دار.

کارخواه Client

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

شماره گیری Dial

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

پذیرش Accept

تابع پذیرش(t: انتقال شبکه.اتصال، users: وکتور<کاربر>، rf &: فیلتر بازپخش): اتصال
سرآیند را روی یک اتصال انتقال شبکه می‌خواند و باز می‌کند، کاربری را که کلیدش در پنجره‌ی زمانی جور است پیدا می‌کند، شناسه‌ی بازپخش‌شده را رد می‌کند و سرآیند پاسخ را می‌فرستد. در شکست معتبر نادرست است، خطا دلیل را می‌گوید و انتقال بسته می‌شود.

خواندن Read

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

خواندن بسته ReadPacket

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

نوشتن Write

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

بستن Close

تابع بستن(c &: اتصال)
اگر بدنه قطعه‌ای است قطعه‌ی پایان را می‌فرستد و اتصال و انتقال زیرش را می‌بندد.

کدگذاری قطعه ها EncodeChunks

تابع کدگذاری قطعه ها(security: صحیح، option: صحیح، key: انتقال شبکه.بایت‌ها، iv: انتقال شبکه.بایت‌ها، parts: وکتور<انتقال شبکه.بایت‌ها>، with_end: منطقی): انتقال شبکه.بایت‌ها
بخش‌ها را به قطعه‌هایی کدگذاری می‌کند که فرستنده‌ای با این کلیدها تولید می‌کرد، و وقتی with_end درست است با یک قطعه‌ی پایان. برای آزمون و برای پیاده کردن یک گونه.

امنیت از نام SecurityByName

تابع امنیت از نام(name: رشته): صحیح
شماره‌ی نوع امنیت برای نام پیوند مثل aes-128-gcm؛ auto یعنی AES-128-GCM. برای نام ناشناخته -۱.

نام امنیت SecurityName

تابع نام امنیت(sec: صحیح): رشته
نام پیوندی یک شماره‌ی نوع امنیت.
تابع تجزیه پیوند(link: رشته): پیوند
یک پیوند vmess:// را می‌خواند. معتبر و خطا را بسنجید.
تابع قالب پیوند(l: پیوند): رشته
یک پیوند را به متن vmess:// می‌نویسد (Base64 JSON v2rayN).

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

تابع تنظیمات پیوند(l: پیوند): انتقال شبکه.تنظیمات
تنظیمات انتقالی که پیوند می‌خواهد.
تابع شماره گیری پیوند(l: پیوند، command: صحیح، target: انتقال شبکه.نشانی): اتصال
به سروری که پیوند نام برده وصل می‌شود و یک نشست وی‌مس به مقصد آغاز می‌کند.

تابع اشتقاق کلید KDF

تابع تابع اشتقاق کلید(key: انتقال شبکه.بایت‌ها، label: رشته، a: انتقال شبکه.بایت‌ها، b: انتقال شبکه.بایت‌ها): انتقال شبکه.بایت‌ها
اشتقاق کلید وی‌مس: HMAC-SHA-256 تودرتو روی یک برچسب و حداکثر دو ورودی دیگر، که ۳۲ بایت می‌دهد.

تابع اشتقاق کلید۱۶ KDF16

تابع تابع اشتقاق کلید۱۶(key: انتقال شبکه.بایت‌ها، label: رشته، a: انتقال شبکه.بایت‌ها، b: انتقال شبکه.بایت‌ها): انتقال شبکه.بایت‌ها
تابع اشتقاق کلید بریده به ۱۶ بایت اول.

تابع اشتقاق کلید۱۲ KDF12

تابع تابع اشتقاق کلید۱۲(key: انتقال شبکه.بایت‌ها، label: رشته، a: انتقال شبکه.بایت‌ها، b: انتقال شبکه.بایت‌ها): انتقال شبکه.بایت‌ها
تابع اشتقاق کلید بریده به ۱۲ بایت اول.

کلید فرمان CmdKey

تابع کلید فرمان(uuid: انتقال شبکه.بایت‌ها): انتقال شبکه.بایت‌ها
کلید فرمان ۱۶ بایتی یک کاربر: MD5 بایت‌های UUID و یک متن ثابت.

شا۲۵۶ Sha256

تابع شا۲۵۶(data: انتقال شبکه.بایت‌ها): انتقال شبکه.بایت‌ها
چکیده‌ی شا-۲۵۶ بایت‌ها.

بلوک ای ای اس۱۲۸ AES128Block

تابع بلوک ای ای اس۱۲۸(key: انتقال شبکه.بایت‌ها، block: انتقال شبکه.بایت‌ها، decrypt: منطقی): انتقال شبکه.بایت‌ها
یک بلوک ۱۶ بایتی را با AES-128 رمزگذاری یا، با decrypt، رمزگشایی می‌کند.

شیک۱۲۸ Shake128

تابع شیک۱۲۸(msg: انتقال شبکه.بایت‌ها، outlen: صحیح): انتقال شبکه.بایت‌ها
خروجی شیک-۱۲۸ یک پیام، به طول outlen بایت.

سی آر سی۳۲ CRC32

تابع سی آر سی۳۲(data: انتقال شبکه.بایت‌ها): صحیح۶۴
جمع‌کنترلی CRC-32 بایت‌ها.

اف ان وی یک ای FNV1a

تابع اف ان وی یک ای(data: انتقال شبکه.بایت‌ها): صحیح۶۴
چکیده‌ی ۳۲ بیتی FNV-1a بایت‌ها، که سرآیند درخواست با آن تمام می‌شود.

ساخت شناسه احراز CreateAuthID

تابع ساخت شناسه احراز(cmd_key: انتقال شبکه.بایت‌ها، ts: صحیح۶۴، rand4: انتقال شبکه.بایت‌ها): انتقال شبکه.بایت‌ها
شناسه‌ی احراز ۱۶ بایتی را می‌سازد: زمان، چهار بایت تصادفی و یک جمع‌کنترلی، رمزگذاری‌شده با کلیدی برگرفته از کلید فرمان.

گشودن شناسه احراز OpenAuthID

تابع گشودن شناسه احراز(cmd_key: انتقال شبکه.بایت‌ها، authid: انتقال شبکه.بایت‌ها، ts &: صحیح۶۴): منطقی
شناسه‌ی احراز را با یک کلید فرمان رمزگشایی می‌کند، جمع‌کنترلی‌اش را می‌سنجد و زمانی را که دارد پس می‌دهد. اگر کلید درست نباشد نادرست است.

مهر سرآیند SealHeader

تابع مهر سرآیند(cmd_key: انتقال شبکه.بایت‌ها، data: انتقال شبکه.بایت‌ها، ts: صحیح۶۴، rand4: انتقال شبکه.بایت‌ها، nonce: انتقال شبکه.بایت‌ها): انتقال شبکه.بایت‌ها
یک سرآیند درخواست را مهر می‌کند: شناسه‌ی احراز، طول رمزگذاری‌شده، یکبارمصرف و سرآیند رمزگذاری‌شده.

مهر سرآیند اکنون SealHeaderNow

تابع مهر سرآیند اکنون(cmd_key: انتقال شبکه.بایت‌ها، data: انتقال شبکه.بایت‌ها): انتقال شبکه.بایت‌ها
مهر سرآیند با زمان فعلی و بایت‌های تصادفی تازه.

گشودن طول سرآیند OpenHeaderLength

تابع گشودن طول سرآیند(cmd_key: انتقال شبکه.بایت‌ها، authid: انتقال شبکه.بایت‌ها، enc_len: انتقال شبکه.بایت‌ها، nonce: انتقال شبکه.بایت‌ها): صحیح
طول رمزگذاری‌شده‌ی سرآیند را باز می‌کند. اگر احراز نشود ۱- برمی‌گرداند.

گشودن سرآیند OpenHeader

تابع گشودن سرآیند(cmd_key: انتقال شبکه.بایت‌ها، authid: انتقال شبکه.بایت‌ها، enc: انتقال شبکه.بایت‌ها، nonce: انتقال شبکه.بایت‌ها): انتقال شبکه.بایت‌ها
سرآیند رمزگذاری‌شده را باز می‌کند. اگر احراز نشود خراب در نتیجه درست است.

مهر سرآیند پاسخ SealResponseHeader

تابع مهر سرآیند پاسخ(resp_key: انتقال شبکه.بایت‌ها، resp_iv: انتقال شبکه.بایت‌ها، header: انتقال شبکه.بایت‌ها): انتقال شبکه.بایت‌ها
سرآیند پاسخ سرور را مهر می‌کند.

گشودن طول پاسخ OpenResponseLength

تابع گشودن طول پاسخ(resp_key: انتقال شبکه.بایت‌ها، resp_iv: انتقال شبکه.بایت‌ها، enc_len: انتقال شبکه.بایت‌ها): صحیح
طول رمزگذاری‌شده‌ی سرآیند پاسخ را باز می‌کند. اگر احراز نشود ۱- برمی‌گرداند.

گشودن سرآیند پاسخ OpenResponseHeader

تابع گشودن سرآیند پاسخ(resp_key: انتقال شبکه.بایت‌ها، resp_iv: انتقال شبکه.بایت‌ها، enc: انتقال شبکه.بایت‌ها): انتقال شبکه.بایت‌ها
یک سرآیند پاسخ را باز می‌کند. اگر احراز نشود خراب در نتیجه درست است.

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

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

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

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