Asio の TCP ソケットを SOCKS5 リスナーに接続しても、完了するのは 1 つの段階だけです。そのリスナーへの TCP 接続です。プロキシに最終的なサーバーへの接続を求めるものではありません。許可された公開ターゲットの検証では、SOCKS5 プロキシ一覧がその最初の TCP エンドポイントの候補を提供しますが、コネクターは以下の交換を完了しなければなりません。

SOCKS5 コネクターは次にプロトコルの交換を実行する必要があります:

  1. クライアントが対応する認証方式を列挙したバージョン 5 の挨拶を送信します。
  2. 選択された方式を読み取り、必要に応じてその認証交換を行います。
  3. 宛先のアドレス種別、アドレス、ネットワークバイト順のポートを付けて CONNECT を送信します。
  4. 応答を読み取り、そのバージョンと結果コードを確認し、可変長のバインドアドレスとポートを最後まで読み切ります。
  5. 確立したストリームをアプリケーションのプロトコルに渡します。

socks5::async_proxy_connect という名前のヘルパーは、そのヘルパーを提供する SOCKS 実装に属します。boost::asio の隣に名前を並べても、Asio の TCP ソケットインターフェースの一部にはなりません。

TCP の読み取りは応答の一部しか返さないことがあります。必要なバイト数になるまで読み取りを組み合わせ、残りの長さはアドレス種別フィールドから決めます。すべてのサーバー応答が固定の IPv4 レイアウトを持つとは想定しないでください。

HTTPS では、SOCKS CONNECT の成功後に宛先の TLS ハンドシェイクを実行し、宛先の SNI とホスト名検証を保ちます。プロキシの応答が成功しただけでは、ウェブサイトは認証されません。

キャンセルと期限を設定手順全体にわたって維持します。TCP 接続の確立がタイムアウトすると、後続の挨拶、認証、CONNECT の交換は無制限のままになります。

関連記事