6. 应答 (Replies)
SOCKS请求信息在客户端建立到SOCKS服务器的连接并完成认证协商后立即发送.服务器评估请求,并返回如下格式的应答:
+----+-----+-------+------+----------+----------+
|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' 到 X'FF' 未分配 (unassigned)
- RSV 保留字段 (RESERVED)
- ATYP 后续地址的地址类型
- IPv4地址: X'01'
- 域名 (DOMAINNAME): X'03'
- IPv6地址: X'04'
- BND.ADDR 服务器绑定地址
- BND.PORT 服务器绑定端口,以网络字节序表示
标记为RESERVED (RSV)的字段必须设置为X'00'.
如果选择的方法包含用于认证,完整性和/或机密性的封装,应答会使用方法相关的封装进行封装.
CONNECT
在对CONNECT的应答中,BND.PORT包含服务器分配用于连接到目标主机的端口号,而BND.ADDR包含关联的IP地址.提供的BND.ADDR通常与客户端用于访问SOCKS服务器的IP地址不同,因为此类服务器通常是多宿主 (multi-homed)的.预期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地址.客户端通常会使用这些信息 (通过主连接或控制连接)通知应用服务器会合地址 (rendezvous address).第二个应答仅在预期的传入连接成功或失败后发生.
在第二个应答中,BND.PORT和BND.ADDR字段包含连接主机的地址和端口号.
UDP ASSOCIATE
UDP ASSOCIATE请求用于在UDP中继进程中建立关联以处理UDP数据报.DST.ADDR和DST.PORT字段包含客户端期望用于发送UDP数据报的地址和端口.服务器可以 (MAY)使用此信息来限制对关联的访问.如果客户端在UDP ASSOCIATE时不具备该信息,客户端必须 (MUST)使用全零的端口号和地址.
UDP关联在携带UDP ASSOCIATE请求的TCP连接终止时终止.
在对UDP ASSOCIATE请求的应答中,BND.PORT和BND.ADDR字段指示客户端必须 (MUST)向其发送要中继的UDP请求消息的端口号/地址.
应答处理 (Reply Processing)
当应答 (REP值不是X'00')指示失败时,SOCKS服务器必须 (MUST)在发送应答后不久终止TCP连接.这必须在检测到导致失败的条件后不超过10秒.
如果应答代码 (REP值为X'00')指示成功,并且请求是BIND或CONNECT,客户端现在可以开始传递数据.如果选择的认证方法支持用于完整性,认证和/或机密性的封装,数据将使用方法相关的封装进行封装.类似地,当数据到达SOCKS服务器以供客户端使用时,服务器必须 (MUST)根据使用的认证方法适当地封装数据.