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) 根据使用的认证方法适当地封装数据。