跳到主要内容

7. 基于 UDP 的客户端程序 (Procedure for UDP-based clients)

基于 UDP 的客户端必须 (MUST) 将其数据报发送到 UDP 中继服务器, 地址为对 UDP ASSOCIATE 请求的回复中 BND.PORT 指示的 UDP 端口。如果所选认证方法为真实性、完整性和/或机密性目的提供封装, 则数据报必须 (MUST) 使用适当的封装进行封装。每个 UDP 数据报携带一个 UDP 请求头:

   +----+------+------+----------+----------+----------+
|RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA |
+----+------+------+----------+----------+----------+
| 2 | 1 | 1 | Variable | 2 | Variable |
+----+------+------+----------+----------+----------+

UDP 请求头中的字段为:

  • RSV 保留 X'0000'
  • FRAG 当前分片编号
  • ATYP 后续地址的地址类型:
    • IP V4 地址: X'01'
    • 域名 (DOMAINNAME): X'03'
    • IP V6 地址: X'04'
  • DST.ADDR 期望的目的地址
  • DST.PORT 期望的目的端口
  • DATA 用户数据

当 UDP 中继服务器决定中继 UDP 数据报时, 它静默地这样做, 不向请求客户端发送任何通知。类似地, 它将丢弃它无法或不会中继的数据报。当 UDP 中继服务器从远程主机收到回复数据报时, 它必须 (MUST) 使用上述 UDP 请求头以及任何认证方法相关的封装来封装该数据报。

UDP 中继服务器必须 (MUST) 从 SOCKS 服务器获取将向 UDP ASSOCIATE 回复中给出的 BND.PORT 发送数据报的客户端的预期 IP 地址。它必须 (MUST) 丢弃来自除为特定关联记录的源 IP 地址以外的任何源 IP 地址的数据报。

FRAG 字段指示此数据报是否是多个分片之一。如果实现, 高位指示分片序列结束, 而值 X'00' 指示此数据报是独立的。1 到 127 之间的值指示分片序列中的分片位置。每个接收方将有一个与这些分片关联的重组队列和重组计时器。每当重组计时器到期, 或新数据报到达时携带的 FRAG 字段值小于为此分片序列处理的最高 FRAG 值时, 重组队列必须重新初始化并放弃相关分片。重组计时器必须 (MUST) 不少于 5 秒。建议应用程序尽可能避免分片。

分片的实现是可选的; 不支持分片的实现必须 (MUST) 丢弃 FRAG 字段不是 X'00' 的任何数据报。

支持 SOCKS 的 UDP 的编程接口必须报告比操作系统实际提供的空间更小的 UDP 数据报可用缓冲区空间:

  • 如果 ATYP 为 X'01' - 小 10+method_dependent 个八位字节
  • 如果 ATYP 为 X'03' - 小 262+method_dependent 个八位字节
  • 如果 ATYP 为 X'04' - 小 20+method_dependent 个八位字节