如何在可靠的UDP上隧道化TCP?

10
假设我有一个可靠的UDP库,并希望通过它隧道任意TCP连接。这是我目前的做法,但我觉得它可能不太高效。非常欢迎任何建议。
1.客户端建立一个可靠的UDP连接到服务器。 2.客户端运行本地SOCKS5代理,它接收来自连接到它的任何应用程序的数据,并通过可靠的UDP连接转发。每个数据包包括一个唯一的4字节id,对于每个SOCKS连接都是唯一的。 3.服务器接收数据。如果4字节id是新的,则创建到其本地TCP套接字的新连接并发送数据,并生成一个新线程,该线程通过适当的id将任何来自服务器的回复通过可靠的UDP连接转发。如果4字节id是旧的,则只需通过现有的TCP连接发送数据。 4.客户端接收数据,并将其通过现有的SOCKS连接发送到启动它的任何应用程序。
目前,这似乎对于从浏览器进行简单的HTML请求有效,但由于服务器没有直接连接到客户端,因此无法确定客户端何时终止连接。有更好的方法吗?
编辑:不,这不是作业。如果您不知道可靠的UDP库的优势或根本没有听说过它们,请不要回复。谢谢。

11
TCP是可靠的UDP。您在重新发明它时的目标是什么? - Mark Ransom
12
  1. "可靠的UDP"这个概念是不存在的。
  2. "UDP连接"这个概念是不存在的。
- jldupont
9
各位,这些回复一点都不有用。如果你之前没有听过可靠的UDP库,请不要回复。 - user123003
3
为什么UDP受到如此厌恶?在IP上无法实现的功能,在UDP上也同样可以实现,包括在UDP上运行TCP。 - Javier
7
@jldupont说:那又怎样?有一个名为RUDP的IETF协议草案,虽然是实验性质,但它确实存在,所以请不要摆出高姿态,帮助这个人,否则就去其他地方辩论语义学问题吧。 - user195488
显示剩余11条评论
3个回答

11

有几种已经准备好的选项:

  • OpenVPN:在UDP上隧道化IP或以太网帧
  • Teredo:在UDPv4上隧道化IPv6,并管理NAT穿越和完全兼容IPv6
  • UDT:非标准,可靠,高性能的多传输TCP协议,基于UDP。可选择让您管理NAT穿越,然后从那里开始

谢谢,但我已经了解与我所做的相关的库。我特别尝试使用可靠的UDP库来实现隧道。 - user123003

0

最有效的方法是两个端点直接相互通信。如果它们使用不同的协议进行通信,则至少需要一个代理/网关/流量转换器/等等。在这种情况下,你现在涉及到三个部分:端点客户端、网络流量、端点服务器,因此你无法避免使用两个这样的转换器。在给定的情况下,我不知道如何使其更加高效。

至于终止连接,如果你使用隧道,则应将所有流量都通过隧道进行通信,即将客户端和服务器的所有请求类型都传输到另一侧。如果无法将终止通信传达给服务器,则问题出在客户端 -- 客户端端点未将其终止通信传达给客户端隧道入口。如果可以这样做,那么你就可以将此终止通信传输到服务器。


我不太确定如何传输除数据包中包含的数据之外的信息。我使用一个简单的过程,其中我使用一种协议接收数据,然后使用另一种协议发送数据。转发控制信息,例如ACK数据包并不是必要的,因为我使用的UDP库已经提供了这个功能。 - user123003
@oskar: 如果你已经维护了一个连接映射表,那么你不能向间接连接的客户端发送“连接中止”吗? - user195488
我其实正在考虑这么做;本质上,编写自己的“中止”消息。我之所以没有这样做是因为发明自己的协议似乎不太优雅,但也许这是最好的选择。 - user123003
@oskar:我认为如果你不再构建ACK/NAK,它就会起作用...然后你本质上是在重新创建TCP。 - user195488
1
我认为问题在于你采用了一种半成品的混合方法,既有隧道又有客户端-服务器通信(例如数据库)。它并不是真正的隧道,因为它会过滤掉明显重要的消息,也不是真正的客户端-服务器方法,因为它与传输介质过于紧密相关。也许你应该决定采取哪一种方法,并坚持下去? - Secure

0

你需要通过 UDP 通道将客户端 TCP 连接的丢失传输到服务器端(如果服务器先关闭连接,则相反也是如此)。

否则,除了 HTTP 服务器不知道客户端已经断开连接之外,你将会在未发起连接关闭的一侧泄漏连接。

一种方法是保留32位连接ID字段的特殊值 - 比如说0x000000000xffffffff - 表示控制报文而非连接数据。 接下来是另一个4字节字段表示连接ID,然后是一个操作码字段。 你可以定义的第一个操作码是“连接终止”。

  • 如果隧道的客户端侦测到客户应用程序关闭了它的 TCP 连接,则它会在隧道上发送与相应连接 ID 对应的 Connection-Terminated 报文;
  • 如果隧道的客户端从服务器端收到“连接终止”操作码,则关闭其与客户应用程序的连接;

服务器端的操作类似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接