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 виконуйте TLS-рукостискання з призначенням лише після успішного SOCKS CONNECT, зберігаючи SNI призначення та перевірку імені хоста. Лише успішна відповідь проксі сама по собі не автентифікує вебсайт.
Зберігайте скасування та строки протягом усієї послідовності налаштування. Якщо час встановлення TCP-з'єднання вичерпано, подальші обміни вітання, автентифікації та CONNECT залишаються без обмежень.