【问题标题】:UDP File Transfer - Yes, UDPUDP 文件传输 - 是的,UDP
【发布时间】:2011-09-29 21:27:38
【问题描述】:

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

简而言之,我需要:

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

我正在使用 UdpClient 开始这段旅程,并想用 C# 编写这个应用程序。任何智慧之言(除了使用 TCP)?


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

【问题讨论】:

  • 使用 TCP :) “我认为这个项目的速度优势超过了使用 TCP 的好处。”什么?你真的希望获得比 TCP 更快的速度优势吗(为什么?)。
  • 在短数据传输的情况下,UDP 通常比 TCP 性能更好,而不是长数据。
  • 猜测一下,UDP 的速度优势恰恰是因为它本身并没有实现你说要实现的东西。
  • 或者换句话说,文件越大,您就越关心可靠的传输。购买 TFTP 库。
  • 我们现在实际上已经通过 Rocketstream.com 看到了这些速度,因此这不仅仅是营销。这个想法是不确认每个包装。从任意数量的数据包开始,然后检查以确保它们到达那里。如果是,则传输下一组数据包。如果没有或有任何错误,请重新传输并减少 ACK 之间的数据包数量。这个想法是在更好的网络上获得巨大的性能提升,在糟糕的网络上获得更少的收益。

标签: c# udp file-transfer


【解决方案1】:

关于

可配置的数据报大小——我认为有些防火墙会抱怨如果它们变得太大?

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

关于

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

我认为在您的情况下最好的办法是实现应用程序级协议。喜欢

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

希望这能给你一些方向

::编辑::

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

【讨论】:

    【解决方案2】:

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

    已经有人试过了,看看this site。

    【讨论】:

      【解决方案3】:

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

      不要在没有 WireShark 的情况下进入它。你会需要它。

      对于算法,我想您已经知道如何开始了。也许一些指针:

      1. 从两个端点通用的 MTU 开始,并仅使用该大小的数据包,因此您可以控制数据包碎片(当您从 TCP 下来时,我希望这是为了更好地控制低级别的东西)。
      2. 您可能需要研究 STUN 或 TURN 以在 NAT 中打孔。
      3. 看看 ZModem - 它也有怀旧的价值 :)
      4. 由于您想从链接中获得最大收益,因此请尽量在“控制数据包”中放入尽可能多的内容,以免浪费一个字节。
      5. 我不会在数据包级别使用任何 CRC,因为我猜下面的网络正在处理这些东西。

      【讨论】:

        【解决方案4】:

        我刚刚有个想法……

        1. 将文件分成 16k 块(长度任意)
        2. 为每个块创建 HASH
        3. 使用任何协议传输块的所有哈希
        4. 在接收端,通过散列您在硬盘驱动器、网络(我的意思是所有内容)上的所有内容(以 16k 块为单位)进行准备
        5. 将接收到的哈希值与您的本地哈希值进行比较并重建您拥有的数据
        6. 使用任何协议下载其余部分

        我知道我比计划晚了 6 个月,但我无法抗拒。

        【讨论】:

          【解决方案5】:

          其他人说了更多有趣的话,但我想指出,您需要确保使用良好的压缩算法。这将改变世界。

          另外,我建议验证您对提高速度的可能性的假设,制作一个简单的发送数据系统(不用担心丢失、损坏或其他问题)并查看您获得的带宽。这至少会给你一个现实的上限。

          最后想想你为什么要承担这个任务?在花费大量时间开发之后,速度提升是否值得?

          【讨论】:

          • 所有优点。对我们来说,一个典型的文件传输是 100 多个演出,并且已经很罕见了。一次转移 500 多个演出的情况并不少见。这就是为什么我说当我必须传输这种大小的连续文件时,可能值得进行质量检查。该技术有效。我只需要找出它是如何完成的:-)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-06
          • 1970-01-01
          • 1970-01-01
          • 2020-12-26
          • 2010-10-22
          • 1970-01-01
          相关资源
          最近更新 更多