Skip to main content

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