6. Replies (応答)
SOCKSリクエスト情報は、クライアントがSOCKSサーバーへの接続を確立し、認証ネゴシエーション (Authentication Negotiation) を完了するとすぐに、クライアントによって送信されます。サーバーはリクエストを評価し、次のように形成された応答を返します:
+----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
各フィールドの説明:
- VER プロトコルバージョン: X'05'
- REP 応答フィールド (Reply Field):
- X'00' 成功 (succeeded)
- X'01' 一般的なSOCKSサーバー障害 (general SOCKS server failure)
- X'02' ルールセットによって接続が許可されない (connection not allowed by ruleset)
- X'03' ネットワーク到達不能 (Network unreachable)
- X'04' ホスト到達不能 (Host unreachable)
- X'05' 接続拒否 (Connection refused)
- X'06' TTL期限切れ (TTL expired)
- X'07' コマンドがサポートされていない (Command not supported)
- X'08' アドレスタイプがサポートされていない (Address type not supported)
- X'09' to X'FF' 未割り当て (unassigned)
- RSV 予約 (RESERVED)
- ATYP 後続アドレスのアドレスタイプ
- IP V4 address: X'01'
- DOMAINNAME: X'03'
- IP V6 address: X'04'
- BND.ADDR サーバーバウンドアドレス (Server Bound Address)
- BND.PORT ネットワークオクテット順のサーバーバウンドポート (Server Bound Port in Network Octet Order)
RESERVED (RSV) とマークされたフィールドは、X'00'に設定しなければなりません。
選択されたメソッドに、認証、完全性、および/または機密性を目的としたカプセル化が含まれる場合、応答はメソッド依存のカプセル化でカプセル化されます。
CONNECT
CONNECTへの応答では、BND.PORTにはサーバーがターゲットホスト (Target Host) への接続に割り当てたポート番号が含まれ、BND.ADDRには関連するIPアドレスが含まれます。提供されるBND.ADDRは、クライアントがSOCKSサーバーに到達するために使用するIPアドレスとは異なることがよくあります。これは、そのようなサーバーがマルチホーム (Multi-Homed) であることが多いためです。SOCKSサーバーは、CONNECTリクエストの評価にDST.ADDRとDST.PORT、およびクライアント側の送信元アドレスとポートを使用することが期待されます。
BIND
BINDリクエスト (BIND Request) は、クライアントがサーバーからの接続を受け入れる必要があるプロトコルで使用されます。FTPはよく知られた例で、コマンドとステータスレポートにはプライマリクライアント・サーバー接続 (Primary Client-to-Server Connection) を使用しますが、オンデマンド (On Demand) でのデータ転送(例: LS、GET、PUT)にはサーバー・クライアント接続 (Server-to-Client Connection) を使用する場合があります。
アプリケーションプロトコルのクライアント側は、CONNECTを使用してプライマリ接続 (Primary Connection) を確立した後、セカンダリ接続 (Secondary Connection) を確立するためにのみBINDリクエストを使用することが期待されます。SOCKSサーバーは、BINDリクエストの評価にDST.ADDRとDST.PORTを使用することが期待されます。
BIND操作中に、SOCKSサーバーからクライアントに2つの応答が送信されます。最初の応答は、サーバーが新しいソケット (Socket) を作成してバインドした後に送信されます。BND.PORTフィールドには、SOCKSサーバーが着信接続をリッスンするために割り当てたポート番号が含まれます。BND.ADDRフィールドには、関連するIPアドレスが含まれます。クライアントは通常、これらの情報を使用して、(プライマリまたはコントロール接続を介して)アプリケーションサーバーにランデブーアドレス (Rendezvous Address) を通知します。2番目の応答は、予想される着信接続が成功または失敗した後にのみ発生します。
2番目の応答では、BND.PORTおよびBND.ADDRフィールドに、接続しているホストのアドレスとポート番号が含まれます。
UDP ASSOCIATE
UDP ASSOCIATEリクエスト (UDP ASSOCIATE Request) は、UDPデータグラム (UDP Datagram) を処理するためにUDPリレープロセス (UDP Relay Process) 内で関連付け (Association) を確立するために使用されます。DST.ADDRおよびDST.PORTフィールドには、クライアントが関連付けのためにUDPデータグラムを送信するために使用することが予想されるアドレスとポートが含まれます。サーバーは、この情報を使用して関連付けへのアクセスを制限してもよい (MAY) です。クライアントがUDP ASSOCIATEの時点でその情報を所有していない場合、クライアントはすべてゼロのポート番号とアドレスを使用しなければなりません (MUST)。
UDP関連付けは、UDP ASSOCIATEリクエストが到着したTCP接続が終了すると終了します。
UDP ASSOCIATEリクエストへの応答では、BND.PORTおよびBND.ADDRフィールドは、クライアントがリレーされるUDPリクエストメッセージを送信しなければならない (MUST) ポート番号/アドレスを示します。
Reply Processing (応答処理)
応答(REP値がX'00'以外)が失敗を示す場合、SOCKSサーバーは応答を送信した直後にTCP接続を終了しなければなりません (MUST)。これは、失敗の原因となった状態を検出してから10秒以内でなければなりません。
応答コード(REP値がX'00')が成功を示し、リクエストがBINDまたはCONNECTのいずれかであった場合、クライアントはデータの受け渡しを開始してもよいです。選択された認証方法が、完全性、認証、および/または機密性を目的としたカプセル化をサポートしている場合、データはメソッド依存のカプセル化を使用してカプセル化されます。同様に、SOCKSサーバーでクライアント向けのデータが到着すると、サーバーは使用中の認証方法に適したデータをカプセル化しなければなりません (MUST)。