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

rom*_*m1v 7 networking udp tcp rfc socks

RFC1928描述的SOCKS5协议提供对UDP的支持.

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

  • 打开与SOCKS5服务器的TCP连接;
  • 发送UDP ASSOCIATE请求(参见第4节);
  • 从服务器接收必须发送UDP数据包的地址和端口;
  • 将数据报(UDP)发送到该地址,并使用一些标头封装(参见第7节).

以下是第6节中的一些相关引文:

当UDP ASSOCIATE请求到达的TCP连接终止时,UDP关联终止.

在对UDP ASSOCIATE请求的回复中,BND.PORT和BND.ADDR字段指示客户端必须发送要中继的UDP请求消息的端口号/地址.

第7:

基于UDP的客户端必须在回复UDP ASSOCIATE请求时将其数据报发送到由BND.PORT指示的UDP端口的UDP中继服务器.

为什么这么复杂?为什么不在预先存在的TCP连接中发送UDP数据包?

编辑:为了澄清,我期望SOCKS代理通过TCP流接收UDP数据包,然后使用实际的UDP将它们传输到目标.然后从目标接收UDP数据包并将其发送回TCP流.


这是一些背景.

我的目标是实现反向网络共享,以便Android设备可以使用其插入的计算机的Internet连接,而无需在设备和计算机上进行root访问(SimpleRT可以工作,但需要在计算机上进行root访问).

我的第一个想法是ssh -D在计算机上启动一个简单的SOCKS5服务器,这样我只需要实现客户端.adb由于... 提供的远程端口转发,数据包将从设备传输到计算机adb reverse.

不幸的是,OpenSSH SOCKS服务器不支持UDP.但这只是实施的限制,我本可以使用另一个SOCKS服务器.

但是,adb reverse也不支持UDP转发.

因此我的问题关于SOCKS5协议.

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

rom*_*m1v 7

我正在回答我自己的问题:这可能是为了避免 TCP 机制(数据包重传、队头阻塞……)。

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