UDP文件传输-是的,UDP

本文关键字:UDP 是的 传输 文件 | 更新日期: 2023-09-27 18:10:16

我需要创建一个UDP文件传输系统。我知道TCP是有保证的,而且更可靠,但我需要在不同位置之间传输巨大的文件,我认为这个项目的速度优势超过了使用TCP的好处。我刚刚开始这个项目,但希望一些指导,如果有人这样做之前。我将编写双方(客户端和服务器),所以我不需要担心其他产品的功能限制。

简而言之,我需要:

  • 获取大文件并以块的形式发送
  • 能够从客户端节流带宽
  • 为错误创建某种包编号系统,在服务器上按块重新传输和组装文件(是的,所有这些我们从TCP免费获得的东西:-)
  • 可配置的数据报大小-我认为一些防火墙抱怨,如果他们变得太大?
  • 我可能还遗漏了什么

我正在使用UdpClient开始这个旅程,并想用c#编写这个应用程序。有什么智慧的话吗(除了使用TCP)?


这已经取得了巨大的成功。我们曾经使用RocketStream.com,但他们把产品卖给了另一家公司,只供内部使用。我们通常获得比FTP或原始TCP字节传输快30倍的速度。

UDP文件传输-是的,UDP

关于

可配置的数据报大小-我认为一些防火墙抱怨,如果他们太大?

一个数据报最多可达65,536字节。考虑到所有的IP报头信息,您最终将得到65,507字节的有效负载。但是您必须考虑如何在您的网络路径上配置所有设备。通常情况下,大多数设备都将mtu大小设置为1500字节,因此这通常是您"在互联网上"的限制。如果你在你的位置之间建立一个专用网络,你可以增加所有设备的MTU。

进一步考虑

为错误、重传和在服务器上按块组装文件创建某种包编号系统(是的,我们从TCP免费获得的所有东西:-)

我认为在你的情况下最好的事情是实现一个应用层协议。像

32字节序列号8字节的crc32校验和(纠正我的字节大小)剩余的任何字节都可以用于data

希望这能给你一些方向

::编辑::

根据经验,我可以告诉你,在专用和UDP调优的网络上,UDP比TCP快10-15%。

我不相信速度增益会很大,但这是一个有趣的实验。这样的协议看起来和行为更像传统的基于调制解调器的协议,可能ZModem是一个更好的例子,可以从中获得一些灵感(实现一个返回窗口,自适应块大小,等等)。

已经有一些人尝试过了,看看这个网站。

如果你成功了那就太好了。

没有WireShark不要进去。你会需要它的。

对于这个算法,我想你们已经很清楚如何开始了。也许有一些指针:

  1. 从两个端点共用的MTU开始,并且只使用那个大小的数据包,这样你就可以控制数据包碎片(当你从TCP下来时,我希望这是为了更好地控制低级别的东西)。
  2. 你可能想看看STUN或TURN打孔到NATs。
  3. 看看ZModem -这也有一个怀旧的价值:)
  4. 既然你想从你的链接中挤出最大的空间,试着把尽可能多的东西放在"控制数据包"中,这样你就不会浪费一个字节。
  5. 我不会在数据包级别使用任何CRC,因为我猜下面的网络正在处理这些东西。

我只是有一个想法…

  1. 将一个文件分成16k块(长度是任意的)
  2. 创建每个块的HASH
  3. 传输块的所有哈希值,使用任何协议
  4. 在接收端,准备哈希你硬盘上的所有东西,网络,我指的是所有的东西,在16k块
  5. 将接收到的哈希值与本地哈希值进行比较,并重建您拥有的数据
  6. 使用任何协议下载其余的

我知道我已经落后计划6个月了,但我就是忍不住。

其他人说了更有趣的事情,但我想指出的是,您需要确保使用良好的压缩算法。那将大有不同。

我还建议验证您关于速度改进可能性的假设,创建一个简单的发送数据系统(不用担心丢失、损坏或其他问题),并查看您获得的带宽。这至少会给你一个实际可行的上限。

最后考虑一下你为什么要承担这个任务?在花费了大量的时间开发之后,速度的提高是否值得?