我有一个奇怪的想法。我听说过根据我的理解使用 UDP 传输文件的软件,它减少了 TCP 数据包中的开销。
如果我的应用程序需要 TCP,并且我的 LAN 设置了软件,可以与海岸另一边的另一个数据中心进行通信,并在其端设置了软件。是否可以通过 UDP 发送实际数据,而不是在两端模拟 TCP?
有人对此类项目有任何想法或信息吗?
我有一个奇怪的想法。我听说过根据我的理解使用 UDP 传输文件的软件,它减少了 TCP 数据包中的开销。
如果我的应用程序需要 TCP,并且我的 LAN 设置了软件,可以与海岸另一边的另一个数据中心进行通信,并在其端设置了软件。是否可以通过 UDP 发送实际数据,而不是在两端模拟 TCP?
有人对此类项目有任何想法或信息吗?
TCP 和 UDP 都建立在 IP 之上,但 TCP 使用不同的数据包结构,并且在第 2 层无法使用 UDP 数据包来模拟 TCP。
当然,如果您对源和目标都有控制权,那么就有可能为 TCP 数据包创建可靠的 UDP 隧道。这将需要 UDP 数据包主体中的一些内部信息(数据包编号、ack/nack 标志)。
有一个有趣的项目http://udt.sourceforge.net/
它是一种建立在 UDP 之上的具有广播能力的可靠文件传输机制。
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 实现来实现可靠连接。
是的,您可以在 UDP 上开发一个模拟 TCP 的协议。但是,如果您完全模拟 TCP,从技术上讲,它会产生更多开销。因为 TCP 是作为数据包实现的,而您的模拟 TCP 是在数据包的主体中实现的。
如果您只需要 TCP 的一两个特性(例如基本排序),那么在 UDP 中实现它是很有用的。
Halo 使用 2-3 (IIRC) UDP 协议来模拟 TCP 的不同功能,然后使用成熟的 TCP 来初始化游戏状态。I Shot You First Networking,GDC 出版物
例如,在一种情况下,他们发送 3 个重复的 UDP 数据包以克服数据包丢失。
如果你控制两端的软件,并且构建自己的协议具有成本效益,那么 UDP 可以是通用的。
如果我的应用程序需要 TCP,并且我的 LAN 具有软件设置,可以与海岸另一边的另一个数据中心进行通信,并在其端进行软件设置。是否可以通过 UDP 发送实际数据,而不是在两端模拟 TCP?
不,UDP 套接字与 TCP 套接字位于不同的命名空间中。您将无法在一端编写 UDP 并在另一端发送或接收 TCP。TCP和UDP是对等协议;两者都存在于IP之上的层。你不能用一个来欺骗另一个。
嗯,我相信是的。您需要在两端使用代理,但这应该是可能的。
您将遇到的最大问题是 UDP 的设计理念是您不在乎某些数据包是否永远无法到达另一端。
这是一个包含更多信息的链接:
http://www.cyberciti.biz/faq/key-differences-between-tcp-and-udp-protocols/
恕我直言,通过 UDP 传输文件不是一个好主意。
TCP 的问题在于它的算法,而不是它的标头。
您当然可以在 UDP 之上实现 TCP 算法。这实际上与在 UDP 数据报内隧道传输 TCP 数据报相同。但这所做的只是为每个数据包添加更多字节的开销,并需要另一个端点来解包数据包。
UDP 本身只是 IP 之上的薄垫片:它是一种访问 IP 分组交换网络的便捷方式,无需深入内核或从路由器接收特殊处理。在 UDP 之上实现可靠传输的主要原因是摆脱 TCP 算法,转而采用更高效的方法。上面提到 FileCatalyst 是一家这样做的公司,我自己的公司 Data Expedition, Inc. 也这样做。
因此,您可以在 UDP 之上实现 TCP 算法,但您不想这样做。
您可以模拟诸如通过 UDP 的连接之类的东西,还可以添加可靠性检查以及排序和重传等。- 但是,它仍然不是 TCP,它只是起到作用。
当然,其中一个端点可以是一种进行适应的“集线器”或“代理”。那么您没有 2 端解决方案,但实际上是 4 端解决方案 - 一对带有“真实”TCP,另一对带有“自编”“TCP” - 您将它们与适当制作的程序放在一起.