【发布时间】: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