为什么 SOCKS5 需要通过 UDP 中继 UDP?

Why does SOCKS5 require to relay UDP over UDP?

SOCKS5 protocol, described by RFC1928 提供对 UDP 的支持。

总而言之,希望通过 SOCKS5 服务器中继 UDP 数据包的客户端至少必须:

这里有一些相关的引述,来自section 6:

A UDP association terminates when the TCP connection that the UDP ASSOCIATE request arrived on terminates.

In the reply to a UDP ASSOCIATE request, the BND.PORT and BND.ADDR fields indicate the port number/address where the client MUST send UDP request messages to be relayed.

section 7:

A UDP-based client MUST send its datagrams to the UDP relay server at the UDP port indicated by BND.PORT in the reply to the UDP ASSOCIATE request.

为什么这么复杂? 为什么不直接在 pre-existing TCP 连接中发送 UDP 数据包?

编辑: 对于 ,我期望 SOCKS 代理通过 TCP 流接收 UDP 数据包,然后使用实际 UDP 将它们传输到目标。然后从目标接收 UDP 数据包并将它们发送回 TCP 流。


这里是一些上下文。

我的目标是实现反向网络共享,以便 Android 设备可以使用它所插入的计算机的互联网连接,而不需要 root 访问两者在设备和计算机上(SimpleRT 可以工作,但需要在计算机上具有 root 访问权限。

我的第一个想法是在电脑上用ssh -D启动一个简单的SOCKS5服务器,这样我只需要实现客户端即可。由于 adb reverse

提供的 远程端口转发 ,数据包将通过 adb 从设备传输到计算机

不幸的是,OpenSSH SOCKS 服务器 does not support UDP。但这只是实现的一个限制,我可以改用另一个 SOCKS 服务器。

但是adb reverse也不支持UDP转发

因此我提出了关于 SOCKS5 协议的问题。

我目前正在编写一个通过 TCP 实现我自己的(简单)协议的 PoC,它能够中继 UDP 数据包,但我很失望不能使用标准协议(并从现有实现中受益)。

我在回答我自己的问题:可能是为了避免TCP机制(数据包重传,head-of-line blocking…)。

对于本地反向网络共享工具,这不是问题,所以我在不使用 SOCKS 的情况下通过 TCP 实现了 UDP。