如何通过可靠的UDP隧道TCP?

7 c c++ sockets networking network-programming

假设我有一个可靠的UDP库,并希望通过它隧道任意TCP连接.这是我目前的做法,但我觉得它可能效率不高.任何建议都非常欢迎.

  1. 客户端与服务器建立可靠的UDP连接.
  2. 客户端运行本地SOCKS5代理,该代理从连接到它的任何应用程序接收数据,并通过可靠的UDP连接转发它.每个数据包包括每个SOCKS连接唯一的4字节ID.
  3. 服务器接收数据.如果4字节的id是新的,则它与其本地TCP套接字建立新连接并发送数据,并生成一个新线程,该线程接收来自服务器的任何回复,并通过具有适当id的可靠UDP连接转发它们.如果4字节的id是旧的,它只是通过现有的TCP连接发送数据.
  4. 客户端接收数据,通过现有的SOCKS连接将其发送到任何启动它的应用程序.

现在,这似乎适用于从浏览器发出简单的HTML请求,但由于服务器没有直接连接到客户端,因此无法判断客户端何时终止连接.有一个更好的方法吗?

编辑:不,这不是功课.如果你不了解可靠的UDP库的优点,或者就此而言,之前没有听说过它们,请不要打扰回复.谢谢.

Jav*_*ier 9

有几个随时可用的选项:

  • OpenVPN:在UDP之上隧道IP或以太网帧
  • Teredo:在UDPv4之上隧道化IPv6,管理NAT遍历和与IPv6的完全兼容性
  • UDT:UDP之上的非标准,可靠,高性能,多传输,类TCP协议.(可选)允许您管理NAT遍历,然后从那里获取它


Sec*_*ure 0

最有效的方法是两个端点直接相互通信。如果它们使用不同的协议进行通信,您至少需要一个代理/网关/流量转换器/其他。在这种情况下,无法绕过其中两个转换器,因为您现在涉及 3 个部分:端点客户端、网络流量、端点服务器。我不知道在给定的情况下如何才能提高效率。

至于终止的连接,如果您使用隧道,则将其用于所有流量,即将客户端和服务器的各种请求传送到另一端。如果无法将终止传送到服务器,则问题出在客户端 - 客户端端点不会将其终止传送到客户端隧道条目。如果可以,那么您可以将此终止传输到服务器。