Asio پس از اتصال به پروکسی به تبادل SOCKS5 نیاز دارد
SOCKS5 را بهعنوان ماشین حالت پروتکل روی سوکت Asio در نظر بگیرید: خواندن کامل، پاسخهای اعتبارسنجیشده و TLS مقصد فقط پس از موفقیت CONNECT.
اتصال یک سوکت TCP در Asio به یک شنوندهٔ SOCKS5 تنها یک گام را کامل میکند: اتصال TCP به همان شنونده. این کار از پروکسی نمیخواهد که به سرور نهایی متصل شود. برای یک آزمون مجاز روی هدف عمومی، فهرست پروکسیهای SOCKS5 نامزدهایی برای همان نخستین نقطهٔ پایانی TCP ارائه میدهد؛ با این حال اتصالدهنده باید تبادل زیر را کامل کند.
سپس اتصالدهندهٔ SOCKS5 باید تبادل پروتکل را اجرا کند:
- یک سلام نسخهٔ 5 بفرستید که روشهای احراز هویتی را که کارخواه پشتیبانی میکند فهرست کند.
- روش انتخابشده را بخوانید و در صورت نیاز تبادل احراز هویت آن را انجام دهید.
- CONNECT را با نوع نشانی مقصد، نشانی و درگاه به ترتیب بایت شبکه بفرستید.
- پاسخ را بخوانید، نسخه و کد نتیجه را بررسی کنید و نشانی و درگاه مقیدشدهٔ کامل با طول متغیر را مصرف کنید.
- جریان برقرارشده را به پروتکل برنامه بسپارید.
یک کمکی به نام socks5::async_proxy_connect متعلق به پیادهسازی SOCKS است که آن کمکی را فراهم میکند. نام بردن آن در کنار boost::asio آن را بخشی از رابط سوکت TCP در Asio نمیکند.
خواندنهای TCP ممکن است تنها بخشی از پاسخ را برگردانند. خواندنها را برای تعداد بایتهای لازم ترکیب کنید، سپس طول باقیمانده را از میدان نوع نشانی انتخاب کنید. فرض نکنید که هر پاسخ سرور چیدمان ثابت IPv4 دارد.
برای HTTPS، پس از موفقیت SOCKS CONNECT دستتکانی TLS مقصد را انجام دهید و SNI و بررسی نام میزبان مقصد را حفظ کنید. پاسخ موفق پروکسی بهتنهایی وبسایت را احراز هویت نمیکند.
لغو و مهلتها را در سراسر توالی راهاندازی حفظ کنید. اگر زمان برقراری اتصال TCP تمام شود، تبادلهای بعدی سلام، احراز هویت و CONNECT بیحد باقی میمانند.