跳到主要内容

6. 回复 (Replies)

SOCKS 请求信息由客户端在建立到 SOCKS 服务器的连接并完成认证协商后立即发送。服务器评估请求, 并返回如下格式的回复:

     +----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+

其中:

  • VER 协议版本: X'05'
  • REP 回复字段:
    • 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' 到 X'FF' 未分配 (unassigned)
  • RSV 保留 (RESERVED)
  • ATYP 后续地址的地址类型
    • IP V4 地址: X'01'
    • 域名 (DOMAINNAME): X'03'
    • IP V6 地址: X'04'
  • BND.ADDR 服务器绑定地址
  • BND.PORT 服务器绑定端口 (网络八位字节顺序)

标记为 RESERVED (RSV) 的字段必须设置为 X'00'。

如果所选方法包含用于认证、完整性和/或机密性目的的封装, 则回复封装在特定于方法的封装中。

CONNECT

在对 CONNECT 的回复中, BND.PORT 包含服务器分配用于连接到目标主机的端口号, 而 BND.ADDR 包含关联的 IP 地址。提供的 BND.ADDR 通常与客户端用于到达 SOCKS 服务器的 IP 地址不同, 因为此类服务器通常是多宿主的。预期 SOCKS 服务器将使用 DST.ADDR 和 DST.PORT 以及客户端侧源地址和端口来评估 CONNECT 请求。

BIND

BIND 请求用于需要客户端接受来自服务器的连接的协议。FTP 是一个众所周知的例子, 它使用主要的客户端到服务器连接来传输命令和状态报告, 但可能使用服务器到客户端的连接按需传输数据 (例如 LS、GET、PUT)。

预期应用协议的客户端侧将仅在使用 CONNECT 建立主要连接后使用 BIND 请求来建立辅助连接。预期 SOCKS 服务器将使用 DST.ADDR 和 DST.PORT 来评估 BIND 请求。

在 BIND 操作期间, SOCKS 服务器向客户端发送两个回复。第一个在服务器创建并绑定新套接字后发送。BND.PORT 字段包含 SOCKS 服务器分配用于监听传入连接的端口号。BND.ADDR 字段包含关联的 IP 地址。客户端通常将使用这些信息通知 (通过主要或控制连接) 应用服务器会合地址。第二个回复仅在预期的传入连接成功或失败后发生。

在第二个回复中, BND.PORT 和 BND.ADDR 字段包含连接主机的地址和端口号。

UDP ASSOCIATE

UDP ASSOCIATE 请求用于在 UDP 中继进程中建立关联以处理 UDP 数据报。DST.ADDR 和 DST.PORT 字段包含客户端期望用于为该关联发送 UDP 数据报的地址和端口。服务器可以 (MAY) 使用此信息来限制对关联的访问。如果客户端在 UDP ASSOCIATE 时不拥有该信息, 客户端必须 (MUST) 使用全零的端口号和地址。

当 UDP ASSOCIATE 请求到达的 TCP 连接终止时, UDP 关联终止。

在对 UDP ASSOCIATE 请求的回复中, BND.PORT 和 BND.ADDR 字段指示客户端必须 (MUST) 向其发送 UDP 请求消息以进行中继的端口号/地址。

回复处理

当回复 (REP 值不是 X'00') 指示失败时, SOCKS 服务器必须 (MUST) 在发送回复后不久终止 TCP 连接。这必须在检测到导致失败的条件后不超过 10 秒。

如果回复代码 (REP 值为 X'00') 指示成功, 并且请求是 BIND 或 CONNECT, 客户端现在可以开始传递数据。如果所选认证方法支持用于完整性、认证和/或机密性目的的封装, 则数据使用特定于方法的封装进行封装。类似地, 当数据到达 SOCKS 服务器供客户端使用时, 服务器必须 (MUST) 根据使用的认证方法适当地封装数据。