34

我有一个奇怪的想法。我听说过根据我的理解使用 UDP 传输文件的软件,它减少了 TCP 数据包中的开销。

如果我的应用程序需要 TCP,并且我的 LAN 设置了软件,可以与海岸另一边的另一个数据中心进行通信,并在其端设置了软件。是否可以通过 UDP 发送实际数据,而不是在两端模拟 TCP?

有人对此类项目有任何想法或信息吗?

4

9 回答 9

27

如果您问是否可以将 UDP 用作第 2 层,那么答案是肯定的。有多种协议允许您使用 UDP 传输创建通往另一个网络的隧道,例如L2TP甚至IPsec(使用 NAT 遍历)。您也可以在应用层进行。

如果你问 TCP 是否可以在 UDP 中实现,答案是否定的。首先,TCP 包UDP 包的格式不兼容。其次,TCP 和 UDP 具有不同的协议号(在IP 标头中可见),这意味着发往 UDP 端口的 TCP 流量不会传递到正确的上层协议。

于 2012-05-21T22:35:27.380 回答
17

TCP 和 UDP 都建立在 IP 之上,但 TCP 使用不同的数据包结构,并且在第 2 层无法使用 UDP 数据包来模拟 TCP。

当然,如果您对源和目标都有控制权,那么就有可能为 TCP 数据包创建可靠的 UDP 隧道。这将需要 UDP 数据包主体中的一些内部信息(数据包编号、ack/nack 标志)。

有一个有趣的项目http://udt.sourceforge.net/

它是一种建立在 UDP 之上的具有广播能力的可靠文件传输机制。

于 2012-05-21T06:53:34.750 回答
6

PseudoTCP 是一种在 UDP 之上实现 TCP 算法的协议。之所以引入它是因为 TCP 的 NAT 穿越比 UDP 复杂得多。但是一些 P2P 应用程序确实需要在节点之间进行可靠的数据传输。

据我所知,有两种 PseudoTCP 变体:Libjingle 和 Libnice。Libjingle 是 google 的一个开源库,最初用于 gtalk。您可以查看 libjingle 中的文件共享示例:https ://developers.google.com/talk/libjingle/file_share 。最近,Chrome 桌面还使用 libjingle 的 PseudoTCP 实现来实现可靠连接。

于 2012-06-02T11:29:05.017 回答
4

是的,您可以在 UDP 上开发一个模拟 TCP 的协议。但是,如果您完全模拟 TCP,从技术上讲,它会产生更多开销。因为 TCP 是作为数据包实现的,而您的模拟 TCP 是在数据包的主体中实现的。

如果您只需要 TCP 的一两个特性(例如基本排序),那么在 UDP 中实现它是很有用的。

Halo 使用 2-3 (IIRC) UDP 协议来模拟 TCP 的不同功能,然后使用成熟的 TCP 来初始化游戏状态。I Shot You First Networking,GDC 出版物

例如,在一种情况下,他们发送 3 个重复的 UDP 数据包以克服数据包丢失。

如果你控制两端的软件,并且构建自己的协议具有成本效益,那么 UDP 可以是通用的。

于 2012-10-21T23:16:27.613 回答
4

现在在 Linux-3.18+ 上执行此操作的一种方法是使用 Foo over UDP (FOU),它实现了 Generic UDP Encapsulation ( GUE )。这是对 FOU 的一个很好的介绍,以及ip-fou的手册页。

或者,如果您想要一个基于 [开源] UDP 的文件传输系统,可以使用UDTUFTPTsunami-UDP甚至 Google 的QUIC之类的东西。

于 2015-07-15T16:49:53.363 回答
3

如果我的应用程序需要 TCP,并且我的 LAN 具有软件设置,可以与海岸另一边的另一个数据中心进行通信,并在其端进行软件设置。是否可以通过 UDP 发送实际数据,而不是在两端模拟 TCP?

不,UDP 套接字与 TCP 套接字位于不同的命名空间中。您将无法在一端编写 UDP 并在另一端发送或接收 TCP。TCP和UDP是对等协议;两者都存在于IP之上的层。你不能用一个来欺骗另一个。

于 2012-05-21T09:51:15.133 回答
1

嗯,我相信是的。您需要在两端使用代理,但这应该是可能的。

您将遇到的最大问题是 UDP 的设计理念是您不在乎某些数据包是否永远无法到达另一端。

这是一个包含更多信息的链接:

http://www.cyberciti.biz/faq/key-differences-between-tcp-and-udp-protocols/

恕我直言,通过 UDP 传输文件不是一个好主意。

于 2012-05-21T06:54:34.770 回答
1

TCP 的问题在于它的算法,而不是它的标头。

您当然可以在 UDP 之上实现 TCP 算法。这实际上与在 UDP 数据报内隧道传输 TCP 数据报相同。但这所做的只是为每个数据包添加更多字节的开销,并需要另一个端点来解包数据包。

UDP 本身只是 IP 之上的薄垫片:它是一种访问 IP 分组交换网络的便捷方式,无需深入内核或从路由器接收特殊处理。在 UDP 之上实现可靠传输的主要原因是摆脱 TCP 算法,转而采用更高效的方法。上面提到 FileCatalyst 是一家这样做的公司,我自己的公司 Data Expedition, Inc. 也这样做。

因此,您可以在 UDP 之上实现 TCP 算法,但您不想这样做。

于 2012-05-23T19:10:17.860 回答
0

您可以模拟诸如通过 UDP 的连接之类的东西,还可以添加可靠性检查以及排序和重传等。- 但是,它仍然不是 TCP,它只是起到作用。

当然,其中一个端点可以是一种进行适应的“集线器”或“代理”。那么您没有 2 端解决方案,但实际上是 4 端解决方案 - 一对带有“真实”TCP,另一对带有“自编”“TCP” - 您将它们与适当制作的程序放在一起.

于 2012-05-21T06:58:42.177 回答