【问题标题】:How can you reduce the transmission size of a packet being sent via multicast?如何减少通过多播发送的数据包的传输大小?
【发布时间】:2019-03-20 05:13:46
【问题描述】:

我有几个问题(都是相关的),所以我先解释一下上下文,然后再提问。我的主要问题是标题,但除此之外,我认为我只需要澄清和确认我的理解是否正确。

我们有一些开发人员正在通过多播在服务器之间交换数据。他们正在发送一个约 8k 的文本文件,该文件作为单个大数据包传输,而其他服务器正在侦听多播地址以接收文件作为更新。自然地,这会被分解成片段,并且考虑到它是多播的,如果一个片段丢失,那么整个数据包就会丢失(这就是经常发生的事情)。

当一个 25MB 的文件(例如 powerpoint)通过电子邮件发送时——它是如何分解的?我的理解始终是应用程序层(例如 FTP)会计算文件大小,将其分解为单独的数据包,然后发送它们(同时跟踪发送的数据包)......现在如果它发送它并沿着路径有一个较小的 MTU,路由器(在第 3 层/IP)会将其分段。一旦片段到达,它将在第 3 层重新组合,然后在第 7 层更进一步,所有数据包都将重新组合(例如通过 FTP 服务器)。我理解的对吗?

如果我的理解是正确的,我知道 TCP 有 PMTU(路径 MTU),它可以检查整个路径(RFC 1191)的最低 MTU 大小并在传输之前使用它。鉴于多播使用 UDP 作为传输层,我不确定发送主机是否有办法检查这一点。它不仅是 UDP 存在问题,而且目的地将是多播地址这一事实......所以即使它可以检查路径,它也只会知道发送者和多播地址之间路径的一半,不是多播地址和侦听器之间路径的一半。或者有没有办法检查这个并且仍然减小传输数据包的大小?

最终,我相信他们需要减少发送的数据包的大小,我认为这将在更高层(软件中的某些东西)完成,因此与 8k 数据包相比,它将是 6 个数据包应用程序跟踪...尽管即使使用此“解决方案”,我也不确定多播是否可行。是吗?

【问题讨论】:

  • 除了将您的数据分解成多个较小的数据包(这比只发送一个大数据包并允许它被分段更好,如果只是因为您可以比处理部分故障更聪明)内置碎片算法是),还有另一种简单的方法来减少传输大小 - zlib-在发送之前压缩您的数据(并让接收者在接收后zlib-解压缩它)。这将特别适用于通常高度可压缩的文本数据。

标签: sockets networking multicast packet mtu


【解决方案1】:

PMTU 工作在 IP 层,而不是 TCP 层。但是,由于您使用的是多播,因此您很不走运,因为 PMTU 不适用于 IPv4 多播。

最好的办法是坚持标准的 1500 字节以太网帧大小(包括 IP 和 TCP/UDP 标头)并在应用层分解数据。

使用 TCP 这往往更容易,因为它是基于流的协议,这意味着应用层不需要担心数据包。例如,发送方可以先发送 8 个字节指定文件大小N,然后发送N 数据字节。然后接收方读取 8 个字节以获取大小N,然后从套接字读取N 字节。将数据分解为数据包并处理这些数据包的传输和重传由 TCP 层负责。

但是因为您使用的是多播,所以您必须使用 UDP,这意味着您需要自己处理将数据分成数据包、发送这些数据包的速度以及任何必要的重新传输。这方面的细节并不是微不足道的,但它是非常可行的。

我编写了一个名为UFTP 的多播文件传输应用程序,它应该适用于您正在做的事情。试一试,让我知道它对你有什么作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2011-10-11
    • 2017-11-18
    相关资源
    最近更新 更多