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流量不会传递给正确的上层协议.
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实现进行可靠的连接.
是的,您可以在 UDP 上开发一个模拟 TCP 的协议。但是,如果完全模拟 TCP,技术上会产生更多开销。因为 TCP 是作为数据包实现的,而您的模拟 TCP 是在数据包正文中实现的。
如果您只需要 TCP 的一两个功能(例如基本排序),那么用 UDP 实现它会很有用。
Halo 使用 2-3 (IIRC) UDP 协议来模拟 TCP 的不同功能,然后使用成熟的 TCP 来初始化游戏状态。I Shot You First Networking,GDC 出版物
例如,在一种情况下,他们发送 3 个重复的 UDP 数据包来克服数据包丢失。
如果你控制两端的软件,并且构建自己的协议具有成本效益,那么UDP就可以通用。
现在在 Linux-3.18+ 上执行此操作的一种方法是使用 Foo over UDP (FOU),它实现了通用 UDP 封装 ( GUE )。这是对 FOU 的很好的介绍,以及ip-fou的手册页。
或者,如果您想要一个基于 [开源] UDP 的文件传输系统,可以使用UDT、UFTP、Tsunami-UDP,甚至 Google 的QUIC(现已弃用,取而代之的是IETF QUIC)。
更新:QUIC协议现已由 IETF 标准化,它提供了基于 UDP 的安全可靠和不可靠传输,作为 TCP 的替代方案。有多种可用的QUIC 实现。还有越来越多的协议映射到 QUIC,例如HTTP/3、DNS over QUIC等