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 保留字段 (Reserved) X'0000'
- FRAG 当前片段编号 (Current fragment number)
- ATYP 后续地址的地址类型:
- IPv4地址: X'01'
- 域名 (DOMAINNAME): X'03'
- IPv6地址: X'04'
- DST.ADDR 期望的目标地址
- DST.PORT 期望的目标端口
- DATA 用户数据
当UDP中继服务器决定中继UDP数据报时,它会静默执行,不向请求客户端发送任何通知.类似地,它会丢弃它无法或不愿中继的数据报.当UDP中继服务器从远程主机接收到应答数据报时,它必须 (MUST)使用上述UDP请求头和任何认证方法相关的封装来封装该数据报.
UDP中继服务器必须 (MUST)从SOCKS服务器获取将向UDP ASSOCIATE应答中给出的BND.PORT发送数据报的客户端的预期IP地址.它必须 (MUST)丢弃来自除为特定关联记录的IP地址之外的任何源IP地址的数据报.
FRAG字段指示该数据报是否是多个片段之一.如果实现,高位 (high-order bit)指示片段序列结束,而X'00'值指示该数据报是独立的.1到127之间的值指示片段在片段序列中的位置.每个接收器将有一个与这些片段关联的重组队列 (REASSEMBLY QUEUE)和重组定时器 (REASSEMBLY TIMER).每当重组定时器过期,或到达携带FRAG字段的新数据报且其值小于为此片段序列处理的最高FRAG值时,重组队列必须重新初始化,并放弃相关片段.重组定时器必须 (MUST)不少于5秒.建议应用程序尽可能避免分片.
分片的实现是可选的; 不支持分片的实现必须 (MUST)丢弃任何FRAG字段不是X'00'的数据报.
支持SOCKS的UDP的编程接口必须 (MUST)报告UDP数据报的可用缓冲区空间小于操作系统实际提供的空间:
- 如果ATYP是X'01' - 小10+method_dependent个八位字节
- 如果ATYP是X'03' - 小262+method_dependent个八位字节
- 如果ATYP是X'04' - 小20+method_dependent个八位字节