Java DatagramSocket 与 SOCKS5 UDP 中继
理解为什么即使 TCP 连接已经走 SOCKS,Java 的 UDP 套接字仍然需要 SOCKS5 UDP 实现。
你的 Java HTTP 请求能通过 SOCKS 正常工作,但某个 UDP 功能仍在直接发送流量或直接失败。设置 JVM 的 SOCKS 属性并不会给 DatagramSocket 一个 SOCKS5 UDP 实现。
DatagramSocket API 收发发往网络端点的数据报。它的 connect() 方法为该套接字选择一个对端,并不会与该对端进行 SOCKS 协商。
SOCKS5 的 UDP 路由需要额外工作
SOCKS5 定义了一种 在 TCP 控制连接之上建立的 UDP 关联。随后客户端与代理给出的中继地址交换封装后的数据报。每条封装消息都标明自己的目的地。客户端实现必须处理这种封装以及控制连接的生命周期。
把普通 UDP 套接字指向代理的 TCP 监听端口会跳过这些步骤。把应用的原始数据报发到该地址并不能替代这种关联。
请选择明确支持 SOCKS5 UDP 中继的库或应用功能,并确认服务器同样支持。一个宣称支持 SOCKS 的库可能只实现了 TCP CONNECT。协议规范对这些命令作了区分。
UDP 中继还需要一条可用的路径
成功连上代理的 TCP 连接只建立了控制路径。防火墙或 NAT 行为仍可能干扰发往中继的数据报。在断定应用目的地离线之前,请先收集返回的中继端点和任何中继错误。
最后,SOCKS 传输支持不会给 UDP 增加任何送达保证。路由改变之后,应用自身的超时、丢包处理和报文大小限制依然适用。