Asio はプロキシへの接続後に SOCKS5 の交換を必要とする
SOCKS5 を Asio ソケット上のプロトコル状態機械として扱い、読み取りを完結させ、応答を検証し、宛先の TLS は CONNECT の成功後にのみ行います。
Asio の TCP ソケットを SOCKS5 リスナーに接続しても、完了するのは 1 つの段階だけです。そのリスナーへの TCP 接続です。プロキシに最終的なサーバーへの接続を求めるものではありません。許可された公開ターゲットの検証では、SOCKS5 プロキシ一覧がその最初の TCP エンドポイントの候補を提供しますが、コネクターは以下の交換を完了しなければなりません。
SOCKS5 コネクターは次にプロトコルの交換を実行する必要があります:
- クライアントが対応する認証方式を列挙したバージョン 5 の挨拶を送信します。
- 選択された方式を読み取り、必要に応じてその認証交換を行います。
- 宛先のアドレス種別、アドレス、ネットワークバイト順のポートを付けて CONNECT を送信します。
- 応答を読み取り、そのバージョンと結果コードを確認し、可変長のバインドアドレスとポートを最後まで読み切ります。
- 確立したストリームをアプリケーションのプロトコルに渡します。
socks5::async_proxy_connect という名前のヘルパーは、そのヘルパーを提供する SOCKS 実装に属します。boost::asio の隣に名前を並べても、Asio の TCP ソケットインターフェースの一部にはなりません。
TCP の読み取りは応答の一部しか返さないことがあります。必要なバイト数になるまで読み取りを組み合わせ、残りの長さはアドレス種別フィールドから決めます。すべてのサーバー応答が固定の IPv4 レイアウトを持つとは想定しないでください。
HTTPS では、SOCKS CONNECT の成功後に宛先の TLS ハンドシェイクを実行し、宛先の SNI とホスト名検証を保ちます。プロキシの応答が成功しただけでは、ウェブサイトは認証されません。
キャンセルと期限を設定手順全体にわたって維持します。TCP 接続の確立がタイムアウトすると、後続の挨拶、認証、CONNECT の交換は無制限のままになります。