From d5467ee77b828aa8c84525358af118e22c9fe681 Mon Sep 17 00:00:00 2001 From: Dawsh Date: Thu, 1 Aug 2024 03:23:41 +0330 Subject: [PATCH 1/4] add persian translation for transports, and write some --- transports.fa.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 transports.fa.md diff --git a/transports.fa.md b/transports.fa.md new file mode 100644 index 0000000..0e8a0bf --- /dev/null +++ b/transports.fa.md @@ -0,0 +1,19 @@ +# معرفی ترنسپورت های v2ray + +*2024-07-20* +## پیش‌زمینه +**یادداشت**: برای جزئیات تاریخی از بهترین سطح اطلاعاتم استفاده کردم. اما در موردشون مطمئن نیستم. + +برنامه v2ray در ابتدا با vmess-tcp شروع شد. به مرور زمان، vmess (توسط فایروال) تشخیص داده شد و v2ray فانکشنالیتی‌هایی برای تبدیل سوکت TCP به زیرساختی در لایه‌ای پایین تر اضافه کرد. + +* یکی از این لایه‌ها، ترنسپورت‌ها هستن، هدف اصلی این داکیومنت. + +* بسته به فرک v2rayای که استفاده میکنید، mux هم می‌تواند یکی دیگر از این لایه‌ها باشد. + +* تی‌ال‌اس(TLS) لایه واقعی نیست. تنظیمات TLS به دست کد ترنسپورت میرسه و ترنسپورت میتونه هر کاری بخواد با اون بکنه. اگرچه اکثر ترنسپورت ها به شکل مشابه از `tlsSettings` استفاده میکنن. + +به هرحال برگردیم سراغ ترنسپورت‌ها. + +در v2ray ترنسپورت *هرچیزی* هست که توانایی درست کردن زیرساخت ارتباط دو طرفه بین سرور و کلاینت رو داشته باشه. سوکت های TCP دقیقا همین کار رو میکنن، ولی لازم نیست حتما TCP باشند، یا حتی بر پایه TCP باشند. فقط کافیه بایت ها رو به ترتیب از کلاینت به سرور(و برعکسش) بدون از دست دادنش منتقل کنه. + +زمانی که این ارتباط وجود داشته باشه، Vmess, VLESS و تروجان (یا هر پروتکلی) با استفاده اون ترنسپورت میتونن متصل بشن. From 6225b38b7168fae07a5ece024512259315c8591a Mon Sep 17 00:00:00 2001 From: Dawsh Date: Sat, 3 Aug 2024 08:24:27 +0330 Subject: [PATCH 2/4] translate websocket stuff --- transports.fa.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/transports.fa.md b/transports.fa.md index 0e8a0bf..d84fb3d 100644 --- a/transports.fa.md +++ b/transports.fa.md @@ -16,4 +16,77 @@ در v2ray ترنسپورت *هرچیزی* هست که توانایی درست کردن زیرساخت ارتباط دو طرفه بین سرور و کلاینت رو داشته باشه. سوکت های TCP دقیقا همین کار رو میکنن، ولی لازم نیست حتما TCP باشند، یا حتی بر پایه TCP باشند. فقط کافیه بایت ها رو به ترتیب از کلاینت به سرور(و برعکسش) بدون از دست دادنش منتقل کنه. -زمانی که این ارتباط وجود داشته باشه، Vmess, VLESS و تروجان (یا هر پروتکلی) با استفاده اون ترنسپورت میتونن متصل بشن. +زمانی که این ارتباط وجود داشته باشه، Vmess, VLESS و تروجان (یا هر پروتکلی) با استفاده از اون ترنسپورت میتونن متصل بشن. ولی برای ساده شدن کار، در این مقاله پروتکل ها نادیده گرفته شده و فقط چند خط متن منتقل میکنیم. + + +## پیش‌نیاز ها +شما به یک ترمینال لینوکس نیاز خواهید داشت. هر چیزی که اینجا نوشتم در اوبونتو ۲۴ انجام شده ولی تفاوتی ندارد. می‌تونید از WSL یا VirtualBox روی ویندوز استفاده کنید یا با ssh دستورات رو روی یک سرور یا vps اجرا کنید. + +## اولین ترنسپورت +میخوایم با چند تا دستور لینوکس ببینیم که یک ترنسپورت چه کار هایی می‌تونه انجام بده. اول از یک چیز ساده شروع میکنیم. + +یک ترمینال باز کنید و دستور زیر رو وارد کنید: +``` +nc -l localhost 6003 # سرور +``` +و در یک ترمینال دیگه: +``` +nc localhost 6003 # کلاینت +``` + +اگر دستور nc رو ندارید می‌تونید با `sudo apt install netcat` نصبش کنید. + +در داخل یکی از ترمینال ها متن بنویسید، می‌بینید که داخل اون یکی ظاهر میشه و دو طرفست. + +این دستور معادل ترنسپورت TCP در v2ray هست. برای تست اینکه یه پورت TCP باز هست یا نه میتونید هاست و پورت رو عوض کنید. + +## وبسوکت + +وبسوکت یک پروتکل مبتنی بر HTTP هست که عملا همون کار سوکت TCP رو انجام میده. تفاوت اصلیش اینه: + +۱. وبسوکت اول هر کانکشن یه هندشیک بزرگ http اضافه میکنه. این کار برای کوکی، آتنتیکیشن، داشتن چند سرویس وبسوکت پشت path های مختلف و برای وادار کردن وبسایت ها که فقط بتونند به منشا خودشون کانکشن باز کنند مفیده. + اگر نیت ساخت ترنسپورت باشه بعضی از این قابلیت ها بخصوص مسیریابی بر اساس path، نسبتا مفیدند، ولی [در مجموع] هندشیک اول اتصال، لیتنسی اضافه میکنه. + +۲. وبسوکت بایت منتقل نمیکنه، "پیام" منتقل میکنه. در tcp برای جابجا کردن hello world، کافیه "hello world" منتقل بشه. در حالی که در وبسوکت باید 'hello world' منتقل بشه. برای کاربرد ترنسپورت، این طراحی فقط اضافه بار(اورهد) ایجاد میکنه و خاصیتی نداره. + +دلیل این که با این قضیه کنار اومدیم اینه که بعضی cdn ها میتونن وبسوکت رو همینطور که هست فروارد کنن. + +همونطور که `nc` عملا یه ترنسپورت TCP هست، ابزار هایی مثل [websocat](https://github.com/vi/websocat/) هم عملا ترنسپورت websocket هستن. با استفاده از توضیحات README بایست وبسوکت رو نصب کنید. + +این ابزار رو برای تست اینکه وبسوکت روی مسیر خاصی اجرا شده هم می‌تونید بکار ببرید: + +``` +curl https://example.com # example.com سرویس اچ‌تی‌تی‌پی درستی هست +websocat wss://example.com # ولی وبسوکت نیست. پس این دستور با خطا تموم میشه +``` + +اگر `websocat` روی سرور v2rayاتون اجرا نمیشه ولی `curl` می‌تونه بازش کنه، احتمالا به این معنیه که path رو جایی اشتباه تنظیم کردید. + +برای این که یه سرور وبسوکت لوکال مثل مثال قبلی `nc` بالا بیارید، باید این کار رو کنید: + +``` +websocat -s 6003 # سرور +websocat ws://localhost:6003 # کلاینت +``` + +این دفعه هم می‌تونید ببینید که هر خطی تو یک ترمینال بفرستید تو دیگری مشاهده میشه. + +از جایی که وبسوکت بر پایه HTTP/1.1 هست و HTTP/1.1 بر پایه tcp، میتونیم `websocat` رو بفرستیم روی `nc` تا خروجی هندشیک اولیه رو مشاهده کنیم: + +``` +nc -l localhost 6003 # سرور +websocat ws://localhost:6003 # کلاینت +``` + +وقتی دستور دوم رو اجرا میکنید، تو ترمینالی که دستور اول رو اجرا کردید می‌تونید خروجی مشابه خروجی زیر رو مشاهده کنید: +``` +GET / HTTP/1.1 +Host: localhost:6003 +Connection: Upgrade +Upgrade: websocket +Sec-WebSocket-Version: 13 +Sec-WebSocket-Key: 2t6m3Hm+P4RlFwVIiNPQTw== + +``` + +این بخشی از اضافه‌بار(اورهد) وبسوکته. کلاینت هنوز منتظر پاسخه، From 2e93822fc54bffba2504486b0eb466db31ffdcf0 Mon Sep 17 00:00:00 2001 From: Dawsh Date: Mon, 5 Aug 2024 06:35:49 +0330 Subject: [PATCH 3/4] wrap up ws --- transports.fa.md | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/transports.fa.md b/transports.fa.md index d84fb3d..7b42107 100644 --- a/transports.fa.md +++ b/transports.fa.md @@ -89,4 +89,45 @@ Sec-WebSocket-Key: 2t6m3Hm+P4RlFwVIiNPQTw== ``` -این بخشی از اضافه‌بار(اورهد) وبسوکته. کلاینت هنوز منتظر پاسخه، +این بخشی از اضافه‌بار(اورهد) وبسوکته. اینجا کلاینت منتظر پاسخه. چطوره پاسخ هم با هم مشاهده کنیم؟ + +هر دو پروسه رو با `Ctrl-c` متوقف کنید و با `websocat -s 6003` یک سرور جدید راه بندازید. + +متن بالا رو بردارید و با nc مستقیما بفرستید: + +``` +echo 'GET / HTTP/1.1 +Host: localhost:6003 +Connection: Upgrade +Upgrade: websocket +Sec-WebSocket-Version: 13 +Sec-WebSocket-Key: MOIjFT7/cVsCCr95mkpCtg== +' | unix2dos | nc localhost 6003 | cat -v +``` + +۱. دستور `echo` فقط متنی که جلوش هست رو مینویسه. +۲. دستور `unix2dos` آخر خط ها رو از \n به \r\n تبدیل می‌کنه، چون در HTTP/1.1 دومی برای آخر خط استفاده میشه. +۳. دستور NC دیتا رو به سرور می‌فرسته و پاسخ سرور رو نمایش میده. +۴. دستور `cat -v` کاری می‌کنه کارکتر های اسپشل(در واقع بایت هایی که کارکتر نیستن) نمایش داده بشن. [در اینجا ^M] + +شما خروجی‌ای شبیه خروجی زیر مشاهده می‌کنید: + +``` +HTTP/1.1 101 Switching Protocols^M +Sec-WebSocket-Accept: HKN6nOSb0JT0jWhszYuKJPUPpHg=^M +Connection: Upgrade^M +Upgrade: websocket^M +``` + +از اینجا به بعد می‌تونید از سمت سرور به کلاینت دیتا بفرستید. در ترمینالی که سرور `websocat` رو اجرا کردید کلمهٔ `hello` رو بنویسید و خروجی زیر رو مشاهده می‌کنید: + +``` +M-^A^Fhello +``` + +کارکتر های اضافه‌ای که اول پیام قرار گرفته، فریمینگ(چهارچوب‌بندی) وبسوکت است. + +اینجا نمی‌تونید از سمت کلاینت به سرور پیامی بفرستید. چرا که پروتکل وبسوکت انتظار داره دیتا در همین فریمینگی که مشاهده کردید از کلاینت ارسال بشه. + +## وبسوکت 0-RTT +(خلاص شدن از شر اضافه‌بار[و لیتنسی] هندشیک) From 85493991dce99f4a925103d08956f8d618de7fb5 Mon Sep 17 00:00:00 2001 From: mmmray <142015632+mmmray@users.noreply.github.com> Date: Mon, 12 Aug 2024 07:30:19 -0500 Subject: [PATCH 4/4] some fixes for RTL --- SUMMARY.md | 1 + book.toml | 1 + custom.css | 5 +++++ transports.md | 2 +- 4 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 custom.css diff --git a/SUMMARY.md b/SUMMARY.md index 544bd3c..b364c97 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -5,6 +5,7 @@ # Technical - [Transports](./transports.md) + - [Transports (fa)](./transports.fa.md) - [0-RTT](./0rtt.md) # Opinions diff --git a/book.toml b/book.toml index 5de497c..423c3f8 100644 --- a/book.toml +++ b/book.toml @@ -14,3 +14,4 @@ command = "mdbook-mermaid" [output.html] additional-js = ["mermaid.min.js", "mermaid-init.js"] +additional-css = ["custom.css"] diff --git a/custom.css b/custom.css new file mode 100644 index 0000000..2b0bf25 --- /dev/null +++ b/custom.css @@ -0,0 +1,5 @@ +/* https://github.com/rust-lang/mdBook/issues/2316#issuecomment-1967370177 */ +#content > main:nth-child(1) > * { + text-align: start; + unicode-bidi: plaintext; +} diff --git a/transports.md b/transports.md index f4547c8..df0eff2 100644 --- a/transports.md +++ b/transports.md @@ -2,7 +2,7 @@ *2024-08-01* -Translations: [Russian](https://marzban.dev/blog/about_transport/) +Translations: [Russian](https://marzban.dev/blog/about_transport/), [Farsi](./transports.fa.md) ## Background