TCP可以通过UDP实现吗?

27 networking udp tcp

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

如果我的应用需要TCP,我的局域网有软件设置,可以通过软件设置与海岸另一侧的另一个数据中心进行通信.是否可以通过UDP发送实际数据,而不是在两端模拟TCP?

我依旧记得有关7层的内容,但我不确定协议是否是其中一个层,我不确定在网络上使用UDP时TCP是否无法模拟/实现完美.有没有人对这些项目有任何想法或信息?

mpo*_*llo 21

如果你问是否可以使用UDP作为第2层,那么答案是肯定的.有各种协议允许您使用UDP传输创建到另一个网络的隧道,例如L2TP甚至IPsec(使用NAT遍历).您也可以在应用程序层执行此操作.

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

  • 你可能对“模拟”这个词的理解有点过于字面意思,或者也许我没有足够地阅读OP对“模拟”字面意思的使用。无论如何,只要编写发送方和接收方应用程序来处理它,就绝对可以将 TCP 标头填充到 UDP 数据字段中并使用应用程序逻辑来处理 TCP 语义。这样做看似效率低下,但数据就是数据。唯一的要求是发送方和接收方应用程序在格式和处理语义上达成一致。 (2认同)

Vik*_*pov 16

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

当然,如果您同时控制源和目标,则可以为TCP数据包创建可靠的UDP隧道.这将需要UDP数据包正文中的一些内部信息(数据包编号,ack/nack标志).

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

它是一种基于UDP的广播功能可靠的文件传输机制.


小智 5

PseudoTCP是一种在UDP之上实现TCP算法的协议.这是因为TCP的NAT遍历比UDP要复杂得多.但是一些P2P应用确实需要在节点之间进行可靠的数据传输.

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


Nat*_*ngs 5

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

如果您只需要 TCP 的一两个功能(例如基本排序),那么用 UDP 实现它会很有用。

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

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

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


Pie*_*erz 5

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

或者,如果您想要一个基于 [开源] UDP 的文件传输系统,可以使用UDTUFTPTsunami-UDP,甚至 Google 的QUIC(现已弃用,取而代之的是IETF QUIC)。

更新:QUIC协议现已由 IETF 标准化,它提供了基于 UDP 的安全可靠和不可靠传输,作为 TCP 的替代方案。有多种可用的QUIC 实现。还有越来越多的协议映射到 QUIC,例如HTTP/3DNS over QUIC